fix(pack): explicitly close confirmation window #37861

Problem: Executing `nvim_buf_delete()` does not guarantee that the
  window which shows the buffer is going to close after `:write` or
  `:quit`. In particular, if there is no listed buffer present.

Solution: Explicitly close the window that was created for confirmation
  buffer. Use `pcall` to catch cases when the window was already closed
  or when it is the last window.
This commit is contained in:
Evgeni Chasnovski
2026-02-14 15:26:36 +02:00
committed by GitHub
parent cadddbff69
commit 539b8027a3
2 changed files with 11 additions and 0 deletions

View File

@@ -1122,6 +1122,7 @@ local function show_confirm_buf(lines, on_finish)
local win_id = api.nvim_get_current_win()
local delete_buffer = vim.schedule_wrap(function()
pcall(api.nvim_win_close, win_id, true)
pcall(api.nvim_buf_delete, bufnr, { force = true })
vim.cmd.redraw()
end)

View File

@@ -1397,6 +1397,16 @@ describe('vim.pack', function()
n.exec('tabonly')
n.exec('write')
eq('', n.eval('v:errmsg'))
-- Should cleanly close tabpage even if there are only scratch buffers
n.exec('%bwipeout')
local init_buf = api.nvim_get_current_buf()
api.nvim_set_current_buf(api.nvim_create_buf(false, true))
api.nvim_buf_delete(init_buf, { force = true })
exec_lua('vim.pack.update()')
n.exec('write')
eq(1, #api.nvim_list_tabpages())
eq(1, #api.nvim_list_bufs())
end)
it('has in-process LSP features', function()