hbac.lua (2326B)
1 local id = vim.api.nvim_create_augroup('hbac', { clear = false }) 2 3 local M = { persistant_buffers = {} } 4 5 M.persist_buffer = function(bufnr) 6 bufnr = bufnr or vim.api.nvim_get_current_buf() 7 M.persistant_buffers[bufnr] = true 8 end 9 10 function M.setup(opts) 11 opts = opts or { autoclose = true, threshold = 10 } 12 13 vim.api.nvim_create_autocmd({ 'BufRead' }, { 14 group = id, 15 pattern = { '*' }, 16 callback = function() 17 vim.api.nvim_create_autocmd({ 'InsertEnter', 'BufModifiedSet' }, { 18 buffer = 0, 19 once = true, 20 callback = function() 21 M.persist_buffer() 22 end, 23 }) 24 end, 25 }) 26 27 if not opts.autoclose then 28 return 29 end 30 31 vim.api.nvim_create_autocmd({ 'BufEnter' }, { 32 group = id, 33 pattern = { '*' }, 34 callback = function() 35 local bufnr = vim.api.nvim_get_current_buf() 36 local buftype = vim.api.nvim_buf_get_option(bufnr, 'buftype') 37 -- if the buffer is not a file - do nothing 38 if buftype ~= '' then 39 return 40 end 41 42 if M.persistant_buffers[M.last] then 43 return 44 end 45 46 local min = 2 ^ 1023 47 local buffers = vim.api.nvim_list_bufs() 48 local num_buffers = 0 49 for _, buf in ipairs(buffers) do 50 local name = vim.api.nvim_buf_get_name(buf) 51 local listed = vim.api.nvim_buf_get_option(buf, 'buflisted') 52 if name ~= '' and listed then 53 num_buffers = num_buffers + 1 54 if not M.persistant_buffers[buf] then 55 min = math.min(min, buf) 56 end 57 end 58 end 59 60 if num_buffers <= opts.threshold then 61 return 62 end 63 64 if min == bufnr then 65 return 66 end 67 68 if min >= 2 ^ 1023 then 69 return 70 end 71 72 local wins = vim.api.nvim_list_wins() 73 for _, win in ipairs(wins) do 74 if vim.api.nvim_win_get_buf(win) == min then 75 return 76 end 77 end 78 79 vim.api.nvim_buf_delete(min, {}) 80 end, 81 }) 82 end 83 84 local function close_unused() 85 local curbufnr = vim.api.nvim_get_current_buf() 86 local buflist = vim.api.nvim_list_bufs() 87 for _, bufnr in ipairs(buflist) do 88 if vim.bo[bufnr].buflisted and bufnr ~= curbufnr and not M.persistant_buffers[bufnr] then 89 vim.cmd('bd ' .. tostring(bufnr)) 90 end 91 end 92 end 93 94 return { close_unused = close_unused, setup = M.setup }