neovim

Personal neovim configuration files
git clone git://gtms.dev/neovim
Log | Files | Refs

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 }