aboutsummaryrefslogtreecommitdiff
path: root/lua/plugins
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-03-05 11:04:38 +0100
committerMarc André Tanner <mat@brain-dump.org>2017-03-05 11:04:38 +0100
commitbee12d3686c19b1aaddf18ca58a2556fd7c200f0 (patch)
tree688cc6c6f9fb780c20564a63fd5fdf0f72785f41 /lua/plugins
parent368fdf04acd490edfb6561796696ded79c3bf9a6 (diff)
downloadvis-bee12d3686c19b1aaddf18ca58a2556fd7c200f0.tar.gz
vis-bee12d3686c19b1aaddf18ca58a2556fd7c200f0.tar.xz
lua: reimplement word and file name completion in lua
The file name completion does not yet behave the same way as the previous C code because the completion prefix is currently simply calculated using the `iw` text object which does not handle common path elements (e.g. `.`, `/`, `~`, etc).
Diffstat (limited to 'lua/plugins')
-rw-r--r--lua/plugins/complete-filename.lua23
-rw-r--r--lua/plugins/complete-word.lua22
2 files changed, 45 insertions, 0 deletions
diff --git a/lua/plugins/complete-filename.lua b/lua/plugins/complete-filename.lua
new file mode 100644
index 0000000..824e33a
--- /dev/null
+++ b/lua/plugins/complete-filename.lua
@@ -0,0 +1,23 @@
+-- complete file name at primary cursor location using vis-complete(1)
+
+vis:map(vis.modes.INSERT, "<C-x><C-f>", function()
+ local win = vis.win
+ local file = win.file
+ local pos = win.cursor.pos
+ if not pos then return end
+ -- TODO do something clever here
+ 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
+ if range.start == range.finish then return end
+ local prefix = file:content(range)
+ if not prefix then return end
+ local cmd = string.format("vis-complete --file '%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
+ file:insert(pos, out)
+ win.cursor.pos = pos + #out
+end, "Complete file name")
diff --git a/lua/plugins/complete-word.lua b/lua/plugins/complete-word.lua
new file mode 100644
index 0000000..68ce385
--- /dev/null
+++ b/lua/plugins/complete-word.lua
@@ -0,0 +1,22 @@
+-- complete word at primary cursor location using vis-complete(1)
+
+vis:map(vis.modes.INSERT, "<C-n>", 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
+ if range.start == range.finish then return end
+ local prefix = file:content(range)
+ if not prefix then return end
+ local cmd = string.format("vis-complete --word '%s'", prefix:gsub("'", "'\\''"))
+ local status, out, err = vis:pipe(file, { start = 0, finish = file.size }, cmd)
+ if status ~= 0 or not out then
+ if err then vis:info(err) end
+ return
+ end
+ file:insert(pos, out)
+ win.cursor.pos = pos + #out
+end, "Complete word in file")