fix(api,lsp): call on_detach before wiping out the buffer #35355

Problem:
Buffer-updates on_detach callback is invoked before buf_freeall(), which
deletes autocmds of the buffer (via apply_autocmds(EVENT_BUFWIPEOUT,
...)). Due to this, buffer-local autocmds executed in on_detach (e.g.,
LspDetach) are not actually invoked.

Solution:
Call buf_updates_unload() before buf_freeall().
This commit is contained in:
Jaehwang Jung
2025-08-18 03:37:24 +09:00
committed by GitHub
parent 35a7642647
commit 285c04e2d0
3 changed files with 76 additions and 4 deletions

View File

@@ -624,6 +624,37 @@ describe('LSP', function()
eq(true, result.detach_called)
end)
it('should detach buffer on bufwipe 2', function()
exec_lua(create_server_definition)
local result = exec_lua(function()
local server = _G._create_server()
local bufnr1 = vim.api.nvim_create_buf(false, true)
local bufnr2 = vim.api.nvim_create_buf(false, true)
local detach_called1 = false
local detach_called2 = false
vim.api.nvim_create_autocmd('LspDetach', {
buffer = bufnr1,
callback = function()
detach_called1 = true
end,
})
vim.api.nvim_create_autocmd('LspDetach', {
buffer = bufnr2,
callback = function()
detach_called2 = true
end,
})
vim.api.nvim_set_current_buf(bufnr1)
vim.lsp.start({ name = 'detach-dummy', cmd = server.cmd })
vim.api.nvim_set_current_buf(bufnr2)
vim.lsp.start({ name = 'detach-dummy', cmd = server.cmd })
vim.api.nvim_buf_delete(bufnr1, { force = true })
vim.api.nvim_buf_delete(bufnr2, { force = true })
return detach_called1 and detach_called2
end)
eq(true, result)
end)
it('should not re-attach buffer if it was deleted in on_init #28575', function()
exec_lua(create_server_definition)
exec_lua(function()