vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit 1128b4aebf58505cb144e5f2044b0da7121cf8d5 parent 5b5a5f384ccc3c1ec86a097e9e8ff041764c8d45 Author: Randy Palamar <randy@rnpnr.xyz> Date: Mon, 26 Feb 2024 06:41:40 -0700 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:
| M | lua/plugins/complete-word.lua | | | 18 | ++++++++++++++++-- |
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git 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")