summaryrefslogtreecommitdiff
path: root/.config/nvim/lua/pipe.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/lua/pipe.lua')
-rw-r--r--.config/nvim/lua/pipe.lua42
1 files changed, 42 insertions, 0 deletions
diff --git a/.config/nvim/lua/pipe.lua b/.config/nvim/lua/pipe.lua
new file mode 100644
index 0000000..f09a030
--- /dev/null
+++ b/.config/nvim/lua/pipe.lua
@@ -0,0 +1,42 @@
+function pipe_visual()
+ pipe_internal({'<', '>'}, vim.fn.visualmode() ~= 'v')
+end
+
+function pipe_normal(arg)
+ pipe_internal({'[', ']'}, arg == 'line')
+end
+
+function pipe_internal(marks, linesp)
+ local mode = vim.fn.visualmode()
+
+ local sr, sc = unpack(vim.api.nvim_buf_get_mark(0, marks[1]))
+ local er, ec = unpack(vim.api.nvim_buf_get_mark(0, marks[2]))
+
+ local lines = linesp
+ and vim.api.nvim_buf_get_lines(0, sr - 1, er, true)
+ or vim.api.nvim_buf_get_text(0, sr - 1, sc, er - 1, ec + 1, {})
+
+ local ok, cmd = pcall(vim.fn.input, {
+ prompt = '… | ',
+ cancelreturn = vim.NIL,
+ })
+
+ if not ok or cmd == vim.NIL then
+ return
+ end
+
+ local out = vim.fn.systemlist(cmd, lines)
+ if linesp then
+ vim.api.nvim_buf_set_lines(0, sr - 1, er, true, out)
+ else
+ vim.api.nvim_buf_set_text(0, sr - 1, sc, er - 1, ec + 1, out)
+ end
+end
+
+vim.keymap.set('n', '<Plug>PipeNormal', ':set opfunc=v:lua.pipe_normal<CR>g@',
+ { silent = true })
+vim.keymap.set('x', '<Plug>PipeVisual', ':<C-u>lua pipe_visual()<CR>',
+ { silent = true })
+
+vim.keymap.set('n', '|', '<Plug>PipeNormal')
+vim.keymap.set('x', '|', '<Plug>PipeVisual')