From 53b29759e8849d919463206c3864601458fec54b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Pankowski?= Date: Thu, 25 Sep 2025 22:49:51 +0200 Subject: [PATCH] vis: improve opening make-like file with pos, improve close prev/next window --- vis/.config/vis/visrc.lua | 71 +++++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 11 deletions(-) diff --git a/vis/.config/vis/visrc.lua b/vis/.config/vis/visrc.lua index 464fc4c..4dbf09f 100644 --- a/vis/.config/vis/visrc.lua +++ b/vis/.config/vis/visrc.lua @@ -49,10 +49,16 @@ local function nil_or_tonumber(s) end local function open_file_pos(line, open_cmd) - local iter = string.gmatch(line, '[^:]+') + local iter = line:gmatch('[^:]+') local file = iter() - local line_num = nil_or_tonumber(iter()) + local ln = iter() local col = nil_or_tonumber(iter()) or 1 + local i = ln and ln:find(' ') + if i then + ln = ln:sub(0, i) + col = 1 + end + local line_num = nil_or_tonumber(ln) if open_cmd ~= 'e' or vis.win.file ~= file then open_file(file, open_cmd) end @@ -61,10 +67,13 @@ local function open_file_pos(line, open_cmd) end end -local function open_file_current_line(open_cmd) +local function open_file_current_line(open_cmd, keys) local line = vis.win.file.lines[vis.win.selection.line] vis:info(line) - open_file_pos(line) + if keys then + vis:feedkeys(keys) + end + open_file_pos(line, open_cmd) end local function escape_and_quoted(s) @@ -93,7 +102,9 @@ local function fzf_sh(arg) if reg ~= '"' then reg = string.gsub(vis.registers[vis.register][1], '%z', '') end - local cmd = home .. '/.config/vis/fzf.sh ' .. escape_and_quoted(arg) .. ' ' .. escape_and_quoted(dir) .. ' ' .. escape_and_quoted(reg) + local cmd = home .. + '/.config/vis/fzf.sh ' .. + escape_and_quoted(arg) .. ' ' .. escape_and_quoted(dir) .. ' ' .. escape_and_quoted(reg) cmd_action(cmd, action) end @@ -185,6 +196,32 @@ end local ripgrep = 'rg --column --line-number --color=always --smart-case' +local function close_prev_win() + vis:feedkeys('') + if vis.win == win then + vis:info('Last window') + elseif not vis.win:close() then + if vis.win.file.modified then + vis:info('No write since last change') + else + vis:command('q') + end + end +end + +local function close_next_win() + vis:feedkeys('') + if vis.win == win then + vis:info('Last window') + elseif not vis.win:close() then + if vis.win.file.modified then + vis:info('No write since last change') + else + vis:command('q') + end + end +end + vis.events.subscribe(vis.events.INIT, function() vis:command('set autoindent') @@ -194,8 +231,8 @@ vis.events.subscribe(vis.events.INIT, function() vis:map(vis.modes.NORMAL, '', '') vis:map(vis.modes.NORMAL, '', '') - vis:map(vis.modes.NORMAL, ' K', ':q', 'close previous window') - vis:map(vis.modes.NORMAL, ' J', ':q', 'close next window') + vis:map(vis.modes.NORMAL, ' K', close_prev_win) + vis:map(vis.modes.NORMAL, ' J', close_next_win) vis:map(vis.modes.NORMAL, ' l[', ':lspc-prev-diagnostic') vis:map(vis.modes.NORMAL, ' l]', ':lspc-next-diagnostic') @@ -250,11 +287,23 @@ vis.events.subscribe(vis.events.INIT, function() vis:command('fzfmru') end, 'fzf recent') - vis:map(vis.modes.NORMAL, 'gf', function() - open_file_current_line('o') - end, 'open file from current line (with line and col') + vis:map(vis.modes.NORMAL, ' w', function() + open_file_current_line('e') + end, 'open file from current line in current window (with optional line and col)') - vis:map(vis.modes.NORMAL, ' cd', function() + vis:map(vis.modes.NORMAL, ' o', function() + open_file_current_line('o') + end, 'open file from current line in new window (with optional line and col)') + + vis:map(vis.modes.NORMAL, ' k', function() + open_file_current_line('e', '') + end, 'open file from current line in above window (with optional line and col)') + + vis:map(vis.modes.NORMAL, ' j', function() + open_file_current_line('e', '') + end, 'open file from current line in below window (with optional line and col)') + + vis:map(vis.modes.NORMAL, ' c', function() search('zoxide query -l | fzf', function(path) vis:command('cd ' .. path) end)