96 lines
2.5 KiB
Lua
96 lines
2.5 KiB
Lua
local Utils = {}
|
|
|
|
function Utils.is_ft(b, ft)
|
|
return vim.bo[b].filetype == ft
|
|
end
|
|
|
|
function Utils.custom_filter(buf, buf_nums)
|
|
local logs = vim.tbl_filter(function(b)
|
|
return Utils.is_ft(b, "log")
|
|
end, buf_nums or {})
|
|
if vim.tbl_isempty(logs) then
|
|
return true
|
|
end
|
|
local tab_num = vim.fn.tabpagenr()
|
|
local last_tab = vim.fn.tabpagenr "$"
|
|
local is_log = Utils.is_ft(buf, "log")
|
|
if last_tab == 1 then
|
|
return true
|
|
end
|
|
-- only show log buffers in secondary tabs
|
|
return (tab_num == last_tab and is_log) or (tab_num ~= last_tab and not is_log)
|
|
end
|
|
|
|
function Utils.buf_kill(kill_command, bufnr, force)
|
|
local bo = vim.bo
|
|
local api = vim.api
|
|
local fmt = string.format
|
|
local fn = vim.fn
|
|
|
|
if bufnr == 0 or bufnr == nil then
|
|
bufnr = api.nvim_get_current_buf()
|
|
end
|
|
|
|
local bufname = api.nvim_buf_get_name(bufnr)
|
|
|
|
if not force then
|
|
local choice
|
|
if bo[bufnr].modified then
|
|
choice = fn.confirm(fmt([[Save changes to "%s"?]], bufname), "&Yes\n&No\n&Cancel")
|
|
if choice == 1 then
|
|
vim.api.nvim_buf_call(bufnr, function()
|
|
vim.cmd("w")
|
|
end)
|
|
elseif choice == 2 then
|
|
force = true
|
|
else
|
|
return
|
|
end
|
|
elseif api.nvim_get_option_value("buftype", { buf = 0 }) == "terminal" then
|
|
choice = fn.confirm(fmt([[Close "%s"?]], bufname), "&Yes\n&No\n&Cancel")
|
|
if choice == 1 then
|
|
force = true
|
|
else
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Get list of windows IDs with the buffer to close
|
|
local windows = vim.tbl_filter(function(win)
|
|
return api.nvim_win_get_buf(win) == bufnr
|
|
end, api.nvim_list_wins())
|
|
|
|
if force then
|
|
kill_command = kill_command .. "!"
|
|
end
|
|
|
|
-- Get list of active buffers
|
|
local buffers = vim.tbl_filter(function(buf)
|
|
return api.nvim_buf_is_valid(buf) and bo[buf].buflisted
|
|
end, api.nvim_list_bufs())
|
|
|
|
-- If there is only one buffer (which has to be the current one), vim will
|
|
-- create a new buffer on :bd.
|
|
-- For more than one buffer, pick the previous buffer (wrapping around if necessary)
|
|
if #buffers > 1 and #windows > 0 then
|
|
for i, v in ipairs(buffers) do
|
|
if v == bufnr then
|
|
local prev_buf_idx = i == 1 and #buffers or (i - 1)
|
|
local prev_buffer = buffers[prev_buf_idx]
|
|
for _, win in ipairs(windows) do
|
|
api.nvim_win_set_buf(win, prev_buffer)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Check if buffer still exists, to ensure the target buffer wasn't killed
|
|
-- due to options like bufhidden=wipe.
|
|
if api.nvim_buf_is_valid(bufnr) and bo[bufnr].buflisted then
|
|
vim.cmd(string.format("%s %d", kill_command, bufnr))
|
|
end
|
|
end
|
|
|
|
return Utils
|