diff options
author | 2010-12-23 23:06:21 -0500 | |
---|---|---|
committer | 2010-12-23 23:06:21 -0500 | |
commit | dd0d3ab4eec12d9de43297cac504b6b589788d75 (patch) | |
tree | e03b99a1df068663c2e7b671e7f8f94d6a2cd695 /modules | |
parent | 65b71f8a364740f7497efa7ec01709f35b314cfa (diff) | |
download | textadept-dd0d3ab4eec12d9de43297cac504b6b589788d75.tar.gz textadept-dd0d3ab4eec12d9de43297cac504b6b589788d75.zip |
Added filter-through module for shell commands.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/textadept/filter_through.lua | 67 | ||||
-rw-r--r-- | modules/textadept/init.lua | 1 | ||||
-rw-r--r-- | modules/textadept/keys.lua | 6 | ||||
-rw-r--r-- | modules/textadept/menu.lua | 1 |
4 files changed, 73 insertions, 2 deletions
diff --git a/modules/textadept/filter_through.lua b/modules/textadept/filter_through.lua new file mode 100644 index 00000000..59dd1a42 --- /dev/null +++ b/modules/textadept/filter_through.lua @@ -0,0 +1,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) + diff --git a/modules/textadept/init.lua b/modules/textadept/init.lua index 6bcfbf5d..fbf5afe8 100644 --- a/modules/textadept/init.lua +++ b/modules/textadept/init.lua @@ -9,6 +9,7 @@ require 'textadept.bookmarks' require 'textadept.command_entry' require 'textadept.editing' require 'textadept.find' +require 'textadept.filter_through' require 'textadept.mime_types' require 'textadept.run' require 'textadept.session' diff --git a/modules/textadept/keys.lua b/modules/textadept/keys.lua index 1b79e9ae..490b31c8 100644 --- a/modules/textadept/keys.lua +++ b/modules/textadept/keys.lua @@ -184,7 +184,7 @@ if not OSX then --[[ C: D I J K M U - A: A B C D E F G H J K L M N P R S T U V W X Y Z + A: A B C D E F G H J K L M N P S T U V W X Y Z CS: A B C D G H I J K L M N O Q T U V X Y Z SA: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z CA: A B C D E F G H J K L M N O Q R S T U V W X Y Z @@ -270,6 +270,7 @@ if not OSX then local m_run = _m.textadept.run keys.cr = { m_run.run } keys.cR = { m_run.compile } + keys.ar = { _m.textadept.filter_through.filter_through } -- Snippets local m_snippets = _m.textadept.snippets keys['\t'] = { m_snippets._insert } @@ -317,7 +318,7 @@ else A: D E H J K L U Y CS: C D G H I J K L M O Q S T U V W X Y Z SA: A B C D H I J K L M N O Q R T U V X Y - CA: A C E J K L M N O Q R S U V W X Y Z + CA: A C E J K L M N O Q S U V W X Y Z CSA: A C D E H J K L M N O P Q R S T U V W X Y Z ]]-- @@ -403,6 +404,7 @@ else local m_run = _m.textadept.run keys.cr = { m_run.run } keys.cR = { m_run.compile } + keys.car = { _m.textadept.filter_through.filter_through } -- Snippets local m_snippets = _m.textadept.snippets keys['\t'] = { m_snippets._insert } diff --git a/modules/textadept/menu.lua b/modules/textadept/menu.lua index 85835cfe..96d82dc8 100644 --- a/modules/textadept/menu.lua +++ b/modules/textadept/menu.lua @@ -192,6 +192,7 @@ menubar = { { SEPARATOR }, { L('_Run'), { m_run.run } }, { L('_Compile'), { m_run.compile } }, + { L('Fi_lter Through'), { _m.textadept.filter_through.filter_through } }, { SEPARATOR }, { title = L('_Snippets'), { L('_Insert'), { m_snippets._insert } }, |