vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit c44bc99119076713a766d71d57f731148af1a6a9
parent e4ea6f72191eaf19c62a8faa9d8af2824378094e
Author: Randy Palamar <randy@rnpnr.xyz>
Date:   Fri, 13 Oct 2023 06:40:13 -0600

lua: refactor complete-filename plugin

There are probably more things to simplify but at least this makes
it easier to see what exactly is different between `<C-x><C-f>` and
`<C-x><C-o>`.

Some differences were removed:
* whitespace in range is treated the same for both actions
* empty range will expand to files in CWD for both actions

closes #1146: Complete file name and file path swapped in doc

Diffstat:
Mlua/plugins/complete-filename.lua | 61++++++++++++++++++++++++++++---------------------------------
1 file changed, 28 insertions(+), 33 deletions(-)

diff --git a/lua/plugins/complete-filename.lua b/lua/plugins/complete-filename.lua @@ -1,56 +1,51 @@ --- complete file path at primary selection location using vis-complete(1) - -vis:map(vis.modes.INSERT, "<C-x><C-f>", function() +local complete_filename = function(expand) local win = vis.win local file = win.file local pos = win.selection.pos if not pos then return end + -- TODO do something clever here local range = file:text_object_longword(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 - -- Strip leading delimiters for some languages - local _, j = string.find(prefix, "[[(<'\"]+") - if j then prefix = prefix:sub(j + 1) end - local cmd = string.format("vis-complete --file '%s'", prefix:gsub("'", "'\\''")) - local status, out, err = vis:pipe(file, { start = 0, finish = 0 }, cmd) - if status ~= 0 or not out then - if err then vis:info(err) end - return - end - file:insert(pos, out) - win.selection.pos = pos + #out -end, "Complete file path") --- complete file path at primary selection location using vis-open(1) + -- Strip leading delimiters for some progamming languages + local _, j = prefix:find("[[(<'\"]+") + if not expand and j then prefix = prefix:sub(j + 1) end -vis:map(vis.modes.INSERT, "<C-x><C-o>", function() - local win = vis.win - local file = win.file - local pos = win.selection.pos - if not pos then return end - -- TODO do something clever here - local range = file:text_object_longword(pos > 0 and pos-1 or pos); - if not range then return end - if range.finish > pos then range.finish = pos end - local prefix = file:content(range) - if not prefix then return end if prefix:match("^%s*$") then prefix = "" range.start = pos range.finish = pos end - local cmd = string.format("vis-open -- '%s'*", prefix:gsub("'", "'\\''")) - local status, out, err = vis:pipe(file, { start = 0, finish = 0 }, cmd) + + local cmdfmt = "vis-complete --file '%s'" + if expand then cmdfmt = "vis-open -- '%s'*" end + local status, out, err = vis:pipe(cmdfmt:format(prefix:gsub("'", "'\\''"))) if status ~= 0 or not out then if err then vis:info(err) end return end out = out:gsub("\n$", "") - file:delete(range) - file:insert(range.start, out) - win.selection.pos = range.start + #out + + if expand then + file:delete(range) + pos = range.start + end + + file:insert(pos, out) + win.selection.pos = pos + #out +end + +-- complete file path at primary selection location using vis-complete(1) +vis:map(vis.modes.INSERT, "<C-x><C-f>", function() + complete_filename(false); end, "Complete file name") + +-- complete file path at primary selection location using vis-open(1) +vis:map(vis.modes.INSERT, "<C-x><C-o>", function() + complete_filename(true); +end, "Complete file name (expands path)")