aboutsummaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/plugins/complete-word.lua18
1 files changed, 16 insertions, 2 deletions
diff --git a/lua/plugins/complete-word.lua b/lua/plugins/complete-word.lua
index 41d112c..7812751 100644
--- a/lua/plugins/complete-word.lua
+++ b/lua/plugins/complete-word.lua
@@ -5,18 +5,32 @@ vis:map(vis.modes.INSERT, "<C-n>", function()
local file = win.file
local pos = win.selection.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)
+
+ vis:feedkeys("<vis-selections-save><Escape><Escape>")
+ -- collect words starting with prefix
+ vis:command("x/\\b" .. prefix .. "\\w+/")
+ local candidates = {}
+ for sel in win:selections_iterator() do
+ table.insert(candidates, file:content(sel.range))
+ end
+ vis:feedkeys("<Escape><Escape><vis-selections-restore>")
+ if #candidates == 1 and candidates[1] == "\n" then return end
+ candidates = table.concat(candidates, "\n")
+
+ local cmd = "printf '" .. candidates .. "' | sort -u | vis-menu"
+ local status, out, err = vis:pipe(cmd)
if status ~= 0 or not out then
if err then vis:info(err) end
return
end
+ out = out:sub(#prefix + 1, #out - 1)
file:insert(pos, out)
win.selection.pos = pos + #out
end, "Complete word in file")