From 2ace4089f80648f431878d258fa1adc80351de9a Mon Sep 17 00:00:00 2001 From: Yi Ming Date: Mon, 21 Jul 2025 17:57:01 +0800 Subject: [PATCH] refactor(lsp): no longer rely on `LspDetach` for detaching capabilities --- runtime/lua/vim/lsp/_capability.lua | 11 ----------- runtime/lua/vim/lsp/client.lua | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/runtime/lua/vim/lsp/_capability.lua b/runtime/lua/vim/lsp/_capability.lua index 5acd9bf067..4867d5d072 100644 --- a/runtime/lua/vim/lsp/_capability.lua +++ b/runtime/lua/vim/lsp/_capability.lua @@ -60,17 +60,6 @@ function M:new(bufnr) }) self.client_state = {} - api.nvim_create_autocmd('LspDetach', { - group = self.augroup, - buffer = bufnr, - callback = function(args) - self:on_detach(args.data.client_id) - if next(self.client_state) == nil then - self:destroy() - end - end, - }) - Class.active[bufnr] = self return self end diff --git a/runtime/lua/vim/lsp/client.lua b/runtime/lua/vim/lsp/client.lua index 25f8307b70..0d2b11fac8 100644 --- a/runtime/lua/vim/lsp/client.lua +++ b/runtime/lua/vim/lsp/client.lua @@ -1209,6 +1209,24 @@ function Client:_on_detach(bufnr) }) end + for _, Capability in pairs(vim.lsp._capability.all) do + if + self:supports_method(Capability.method) + and vim.lsp._capability.is_enabled(Capability.name, { + bufnr = bufnr, + client_id = self.id, + }) + then + local capability = Capability.active[bufnr] + if capability then + capability:on_detach(self.id) + if next(capability.client_state) == nil then + capability:destroy() + end + end + end + end + changetracking.reset_buf(self, bufnr) if self:supports_method(ms.textDocument_didClose) then