itsuki0927 / SkCode

SkCode = neovim + lua + vscode
138 stars 20 forks source link

close_buffer 采用 :bd<CR> 在某些情况下 会退出 neovim #2

Closed reaink closed 2 years ago

reaink commented 2 years ago

我看到 nvchad 已修改 close_buffer 的方法

https://github.com/NvChad/NvChad/blob/76d194b1414d2351364ef1a84672e6b95110b65a/lua/core/utils.lua#L4-L117

不知道大家有没有谁遇到过现在所使用的 :bd<CR> 这种 <leader>x 会退出程序的情况

itsuki0927 commented 2 years ago

别说, 我还真碰到这样子的情况, 哈哈哈哈 ,我晚点去看看它的这个close_buffer代码.

itsuki0927 commented 2 years ago

我在本地测试了下, 发现使用:bd<CR>会退出程序的场景是nvim-tree是打开的状态, 然后在通过<leader>x关闭buffer(打开两个以上的buffer)时, 会直接退出nvim.

这是nvim-tree的问题, 可以看看issue-235issue-252

有两个解决办法:

  1. 每次打开文件时关闭nvim-tree, 对应的配置actions.open_file.quit_on_open = false, 这样子就不会出现这个问题(我自己比较喜欢每次打开时就关闭nvim-tree).
  2. 在issue中找到的, <leader>x键位使用自定义的close_buffer.
-- utils.lua
M.close_buffer = function()
  local fn = vim.fn
  local cmd = vim.cmd

  local buflisted = fn.getbufinfo({ buflisted = 1 })
  local cur_winnr, cur_bufnr = fn.winnr(), fn.bufnr()
  if #buflisted < 2 then
    vim.cmd('confirm qall')
    return
  end
  for _, winid in ipairs(fn.getbufinfo(cur_bufnr)[1].windows) do
    vim.cmd(string.format('%d wincmd w', fn.win_id2win(winid)))
    vim.cmd(cur_bufnr == buflisted[#buflisted].bufnr and 'bp' or 'bn')
  end
  vim.cmd(string.format('%d wincmd w', cur_winnr))
  local is_terminal = fn.getbufvar(cur_bufnr, '&buftype') == 'terminal'
  vim.cmd(is_terminal and 'bd! #' or 'silent! confirm bd #')
end