Skip to content

Commit

Permalink
lua: complete-word: use internal regex for splitting words
Browse files Browse the repository at this point in the history
Internally vis supports unicode just fine. Instead of relying on
external programs utilize vis' own features.

Thanks to Florian Fischer for the correct regex!
  • Loading branch information
rnpnr committed Mar 9, 2024
1 parent 64c0092 commit 004800e
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions lua/plugins/complete-word.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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")

0 comments on commit 004800e

Please sign in to comment.