aboutsummaryrefslogtreecommitdiff
path: root/lua/plugins/complete-word.lua
diff options
context:
space:
mode:
authorRandy Palamar <randy@rnpnr.xyz>2024-02-26 06:41:40 -0700
committerRandy Palamar <randy@rnpnr.xyz>2024-03-08 17:51:00 -0700
commit004800e348cba1bf5f4536876b4e0eafbcf1ea58 (patch)
tree7f7d3fe0dc72f9dd323a84b54624c8b4e76b68b8 /lua/plugins/complete-word.lua
parent64c0092d6c17c769b502bc60850f0a5c42792f3a (diff)
downloadvis-004800e348cba1bf5f4536876b4e0eafbcf1ea58.tar.gz
vis-004800e348cba1bf5f4536876b4e0eafbcf1ea58.tar.xz
lua: complete-word: use internal regex for splitting words
Internally vis supports unicode just fine. Instead of relying on external programs utilize vis' own features. Thanks to Florian Fischer for the correct regex!
Diffstat (limited to 'lua/plugins/complete-word.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")