aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/manual/10_Advanced.md14
-rw-r--r--doc/manual/14_Appendix.md2
-rw-r--r--doc/manual/9_Preferences.md1
-rw-r--r--modules/textadept/filter_through.lua23
4 files changed, 26 insertions, 14 deletions
diff --git a/doc/manual/10_Advanced.md b/doc/manual/10_Advanced.md
index 3295110a..74b56ddc 100644
--- a/doc/manual/10_Advanced.md
+++ b/doc/manual/10_Advanced.md
@@ -42,10 +42,16 @@ buffer (or a selection). You could do the following from the command entry:
A simpler way would be to press `Alt+R` (`Ctrl+Apple+R` on Mac OSX), enter the
shell command `sort`, and hit `Enter`.
-For shell commands, 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.
+The standard input (stdin) for shell commands is determined as follows:
+
+* If text is selected and spans multiple lines, all text on the lines containing
+ the selection is used. However, if the end of the selection is at the
+ beginning of a line, only the EOL (end of line) characters from the previous
+ line are included as input. The rest of the line is excluded.
+* If text is selected and spans a single line, only the selected text is used.
+* If no text is selected, the entire buffer is used.
+
+The input text is replaced with the standard output (stdout) of the command.
## File Encoding
diff --git a/doc/manual/14_Appendix.md b/doc/manual/14_Appendix.md
index ff9791cb..c77ee9f0 100644
--- a/doc/manual/14_Appendix.md
+++ b/doc/manual/14_Appendix.md
@@ -68,7 +68,7 @@
<tr><td>F2</td><td>F2</td><td>Focus Lua command entry</td></tr>
<tr><td>Ctrl+R</td><td>Ctrl+R</td><td>Run file</td></tr>
<tr><td>Ctrl+Shift+R</td><td>Ctrl+Shift+R</td><td>Compile file</td></tr>
- <tr><td>Alt+R</td><td>Ctrl+Alt+R</td><td>Filter through shell command</td></tr>
+ <tr><td>Alt+R</td><td>Ctrl+Apple+R</td><td>Filter through shell command</td></tr>
<tr><td>Tab</td><td>Tab</td><td>Expand snippet or next placeholder or indent text</td></tr>
<tr><td>Shift+Tab</td><td>Shift+Tab</td><td>Previous snippet placeholder or dedent text</td></tr>
<tr><td>Ctrl+Alt+I</td><td>Ctrl+Apple+I</td><td>Cancel current snippet</td></tr>
diff --git a/doc/manual/9_Preferences.md b/doc/manual/9_Preferences.md
index 89abc852..12240863 100644
--- a/doc/manual/9_Preferences.md
+++ b/doc/manual/9_Preferences.md
@@ -27,6 +27,7 @@ with
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/filter_through.lua b/modules/textadept/filter_through.lua
index 4d029d8a..a3094c0c 100644
--- a/modules/textadept/filter_through.lua
+++ b/modules/textadept/filter_through.lua
@@ -12,13 +12,17 @@ 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.
+-- through.
+-- The standard input (stdin) for shell commands is determined as follows: (1)
+-- If text is selected and spans multiple lines, all text on the lines
+-- containing the selection is used. However, if the end of the selection is at
+-- the beginning of a line, only the EOL (end of line) characters from the
+-- previous line are included as input. The rest of the line is excluded. (2) If
+-- text is selected and spans a single line, only the selected text is used. (3)
+-- If no text is selected, the entire buffer is used.
+-- The input text 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
@@ -36,11 +40,12 @@ events.connect('command_entry_command',
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)
+ local i, j = buffer:line_from_position(s), buffer:line_from_position(e)
+ if i < j then
+ s = buffer:position_from_line(i)
+ if buffer.column[e] > 0 then e = buffer:position_from_line(j + 1) end
end
- input = buffer:get_sel_text()
+ input = buffer:text_range(s, e)
else -- use whole buffer as input
input = buffer:get_text()
end