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:
Mlua/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")