commit 2ace4089f80648f431878d258fa1adc80351de9a
parent b3fbc8d6fa2abe732b996d67cbaf5ab9c6d3414b
Author: Yi Ming <ofseed@foxmail.com>
Date: Mon, 21 Jul 2025 17:57:01 +0800
refactor(lsp): no longer rely on `LspDetach` for detaching capabilities
Diffstat:
2 files changed, 18 insertions(+), 11 deletions(-)
diff --git 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
@@ -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