diff options
Diffstat (limited to 'configs/nvim/lua/crupest/nvim.lua')
-rw-r--r-- | configs/nvim/lua/crupest/nvim.lua | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/configs/nvim/lua/crupest/nvim.lua b/configs/nvim/lua/crupest/nvim.lua index 2eea4f1..c47b7d5 100644 --- a/configs/nvim/lua/crupest/nvim.lua +++ b/configs/nvim/lua/crupest/nvim.lua @@ -37,6 +37,7 @@ local function get_previous_buffer(buf) return bufs[index - 1] end +-- list the windows that are currently editing the given buffer local function list_wins_editing_buf(buf) local wins = vim.api.nvim_list_wins() local result = {} @@ -48,25 +49,28 @@ local function list_wins_editing_buf(buf) return result end +-- Delete current buffer and jump back. +-- If no previous jump, switch to previous buffer. +-- If no previous buffer (no other buffers), create a unnamed one. (So the window does not quit.) local function win_close_buf() - local current_buffer = vim.api.nvim_get_current_buf() + local buf = vim.api.nvim_get_current_buf() local jumps_info = vim.fn.getjumplist() - local old_jump_list = { unpack(jumps_info[1], 1, jumps_info[2]) } - while #old_jump_list ~= 0 do - local last_jump = old_jump_list[#old_jump_list] - if last_jump.bufnr ~= current_buffer and vim.fn.bufexists(last_jump.bufnr) ~= 0 and vim.fn.buflisted(last_jump.bufnr) ~= 0 then + local old_jumps = { unpack(jumps_info[1], 1, jumps_info[2]) } + while #old_jumps ~= 0 do + local last_jump = old_jumps[#old_jumps] + if last_jump.bufnr ~= buf and vim.fn.bufexists(last_jump.bufnr) ~= 0 and vim.fn.buflisted(last_jump.bufnr) ~= 0 then break end - table.remove(old_jump_list, #old_jump_list) + table.remove(old_jumps, #old_jumps) end - if #old_jump_list ~= 0 then - local last_jump = old_jump_list[#old_jump_list] + if #old_jumps ~= 0 then + local last_jump = old_jumps[#old_jumps] vim.api.nvim_win_set_buf(0, last_jump.bufnr) vim.api.nvim_win_set_cursor(0, {last_jump.lnum, last_jump.col}) else - local previous_buf = get_previous_buffer(current_buffer) + local previous_buf = get_previous_buffer(buf) if previous_buf then vim.api.nvim_win_set_buf(0, previous_buf) else @@ -75,13 +79,26 @@ local function win_close_buf() end end - vim.api.nvim_buf_delete(current_buffer, {}) + local wins = list_wins_editing_buf(buf) + if #wins == 0 then + vim.api.nvim_buf_delete(buf, {}) + end +end + +local function close_float() + local wins = vim.api.nvim_list_wins() + for _, v in ipairs(wins) do + if vim.api.nvim_win_get_config(v).relative ~= '' then + vim.api.nvim_win_close(v, false) + end + end end return { list_listed_bufs = list_listed_bufs, get_previous_buffer = get_previous_buffer, list_wins_editing_buf = list_wins_editing_buf, - win_close_buf = win_close_buf + win_close_buf = win_close_buf, + close_float = close_float, } |