diff --git a/lua/plugins/complete-word.lua b/lua/plugins/complete-word.lua index 41d112c12..781275144 100644 --- a/lua/plugins/complete-word.lua +++ b/lua/plugins/complete-word.lua @@ -5,18 +5,32 @@ vis:map(vis.modes.INSERT, "", 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("") + -- 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("") + 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")