aboutsummaryrefslogtreecommitdiff
path: root/configs/nvim/lua/crupest/nvim.lua
diff options
context:
space:
mode:
Diffstat (limited to 'configs/nvim/lua/crupest/nvim.lua')
-rw-r--r--configs/nvim/lua/crupest/nvim.lua87
1 files changed, 87 insertions, 0 deletions
diff --git a/configs/nvim/lua/crupest/nvim.lua b/configs/nvim/lua/crupest/nvim.lua
new file mode 100644
index 0000000..2eea4f1
--- /dev/null
+++ b/configs/nvim/lua/crupest/nvim.lua
@@ -0,0 +1,87 @@
+local function list_listed_bufs()
+ local bufs = vim.api.nvim_list_bufs()
+ local result = {}
+ for _, v in ipairs(bufs) do
+ if vim.fn.buflisted(v) ~= 0 then
+ table.insert(result, v)
+ end
+ end
+ return result
+end
+
+local function get_previous_buffer(buf)
+ local bufs = list_listed_bufs()
+
+ -- no buffers at all
+ if #bufs == 0 then return nil end
+
+ -- find the buf in bufs
+ local index = 0
+ for i, v in ipairs(bufs) do
+ if buf == v then
+ index = i
+ break
+ end
+ end
+
+ -- it's the only one
+ if #bufs == 1 and index == 1 then
+ return nil
+ end
+
+ -- it's the first one
+ if index == 1 then
+ return bufs[2]
+ end
+
+ return bufs[index - 1]
+end
+
+local function list_wins_editing_buf(buf)
+ local wins = vim.api.nvim_list_wins()
+ local result = {}
+ for _, win in ipairs(wins) do
+ if vim.api.nvim_win_get_buf(win) == buf then
+ table.insert(result, win)
+ end
+ end
+ return result
+end
+
+local function win_close_buf()
+ local current_buffer = 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
+ break
+ end
+ table.remove(old_jump_list, #old_jump_list)
+ end
+
+ if #old_jump_list ~= 0 then
+ local last_jump = old_jump_list[#old_jump_list]
+ 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)
+ if previous_buf then
+ vim.api.nvim_win_set_buf(0, previous_buf)
+ else
+ local new_buf = vim.api.nvim_create_buf(true, false)
+ vim.api.nvim_win_set_buf(0, new_buf)
+ end
+ end
+
+ vim.api.nvim_buf_delete(current_buffer, {})
+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
+}
+