1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
-- Copyright 2007-2010 Mitchell mitchell<att>caladbolg.net. See LICENSE.
local L = _G.locale.localize
---
-- Filter-Through for the textadept module.
module('_m.textadept.filter_through', package.seeall)
local cat = not WIN32 and 'cat' or 'type'
local tmpfile = _USERHOME..'/.ft'
local filter_through_active = false
---
-- Prompts for a Linux, Mac OSX, or Windows shell command to filter text
-- through. If text is selected, all text on the lines containing the selection
-- is used as the standard input (stdin) to the command. Otherwise the entire
-- buffer is used. Either the selected text or buffer is replaced with the
-- standard output (stdout) of the command.
function filter_through()
filter_through_active = true
gui.command_entry.entry_text = ''
gui.command_entry.focus()
end
events.connect('command_entry_keypress',
function(code)
if filter_through_active and code == 0xff1b then -- escape
filter_through_active = false
end
end, 1) -- place before command_entry.lua's handler (if necessary)
events.connect('command_entry_command',
function(text) -- filter through
if filter_through_active then
local buffer = buffer
local s, e = buffer.selection_start, buffer.selection_end
local input
if s ~= e then -- use selected lines as input
s = buffer:position_from_line(buffer:line_from_position(s))
if buffer.column[e] > 0 then
e = buffer:position_from_line(buffer:line_from_position(e) + 1)
end
input = buffer:get_sel_text()
else -- use whole buffer as input
input = buffer:get_text()
end
local f = io.open(tmpfile, 'wb')
f:write(input)
f:close()
local cmd = table.concat({ cat, '"'..tmpfile..'"', '|', text }, ' ')
if WIN32 then cmd = cmd:gsub('/', '\\') end
local p = io.popen(cmd)
if s ~= e then
buffer.target_start, buffer.target_end = s, e
buffer:replace_target(p:read('*all'))
buffer:set_sel(buffer.target_start, buffer.target_end)
else
buffer:set_text(p:read('*all'))
buffer:goto_pos(s)
end
p:close()
os.remove(tmpfile)
filter_through_active = false
return true
end
end, 1) -- place before command_entry.lua's handler (if necessary)
|