aboutsummaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-03-31 13:49:54 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-03-31 13:49:54 +0200
commitc5594e156e6088c791060f5a4839b89f0906d4d1 (patch)
tree252e3476cddb164440f120f9ef2e4ea9c22a4842 /lua
parentdc5f5a45a2315011ebeeb0a56a7434ead292dc96 (diff)
downloadvis-c5594e156e6088c791060f5a4839b89f0906d4d1.tar.gz
vis-c5594e156e6088c791060f5a4839b89f0906d4d1.tar.xz
vis: improve tab completion in command prompt
At some point it should probably be possible to add command prompt bindings from within Lua. Currently there is no easy/realiable way to detect the prompt window. Should improve #526.
Diffstat (limited to 'lua')
-rw-r--r--lua/plugins/complete-filename.lua31
1 files changed, 30 insertions, 1 deletions
diff --git a/lua/plugins/complete-filename.lua b/lua/plugins/complete-filename.lua
index 824e33a..3648efe 100644
--- a/lua/plugins/complete-filename.lua
+++ b/lua/plugins/complete-filename.lua
@@ -1,4 +1,4 @@
--- complete file name at primary cursor location using vis-complete(1)
+-- complete file path at primary cursor location using vis-complete(1)
vis:map(vis.modes.INSERT, "<C-x><C-f>", function()
local win = vis.win
@@ -20,4 +20,33 @@ vis:map(vis.modes.INSERT, "<C-x><C-f>", function()
end
file:insert(pos, out)
win.cursor.pos = pos + #out
+end, "Complete file path")
+
+-- complete file path at primary cursor location using vis-open(1)
+
+vis:map(vis.modes.INSERT, "<C-x><C-o>", function()
+ local win = vis.win
+ local file = win.file
+ local pos = win.cursor.pos
+ if not pos then return end
+ local range = file:text_object_word(pos > 0 and pos-1 or pos);
+ if not range then return end
+ if range.finish > pos then range.finish = pos end
+ local prefix = file:content(range)
+ if not prefix then return end
+ if prefix:match("^%s*$") then
+ prefix = ""
+ range.start = pos
+ range.finish = pos
+ end
+ local cmd = string.format("vis-open -- '%s'*", prefix:gsub("'", "'\\''"))
+ local status, out, err = vis:pipe(file, { start = 0, finish = 0 }, cmd)
+ if status ~= 0 or not out then
+ if err then vis:info(err) end
+ return
+ end
+ out = out:gsub("\n$", "")
+ file:delete(range)
+ file:insert(range.start, out)
+ win.cursor.pos = range.start + #out
end, "Complete file name")