diff options
author | glepnir <glephunter@gmail.com> | 2025-03-11 20:10:09 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-11 05:10:09 -0700 |
commit | a14fca432b963b01ae9b47598f5d787520402810 (patch) | |
tree | 31c1cdc976eb661e15e80cbece52bd058f1432f4 /runtime/lua/vim | |
parent | 55bdb077b7069c018cc5ccf682417770abec5b4a (diff) | |
download | rneovim-a14fca432b963b01ae9b47598f5d787520402810.tar.gz rneovim-a14fca432b963b01ae9b47598f5d787520402810.tar.bz2 rneovim-a14fca432b963b01ae9b47598f5d787520402810.zip |
fix(lsp): improve LSP floating preview window cleanup #31353
Problem: The current implementation creates a unique autocommand group for each floating preview window, which is inefficient and can lead to numerous autocommand groups.
Solution: Use a single shared autocommand group with improved window validation to properly clean up LSP floating preview windows.
Diffstat (limited to 'runtime/lua/vim')
-rw-r--r-- | runtime/lua/vim/lsp/util.lua | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index ef177e903f..307a55c2a2 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -1622,23 +1622,24 @@ function M.open_floating_preview(contents, syntax, opts) api.nvim_win_set_var(floating_winnr, opts.focus_id, bufnr) end api.nvim_buf_set_var(bufnr, 'lsp_floating_preview', floating_winnr) + api.nvim_win_set_var(floating_winnr, 'lsp_floating_bufnr', bufnr) end - local augroup_name = ('nvim.closing_floating_preview_%d'):format(floating_winnr) - local ok = - pcall(api.nvim_get_autocmds, { group = augroup_name, pattern = tostring(floating_winnr) }) - if not ok then - api.nvim_create_autocmd('WinClosed', { - group = api.nvim_create_augroup(augroup_name, {}), - pattern = tostring(floating_winnr), - callback = function() - if api.nvim_buf_is_valid(bufnr) then - vim.b[bufnr].lsp_floating_preview = nil - end - api.nvim_del_augroup_by_name(augroup_name) - end, - }) - end + api.nvim_create_autocmd('WinClosed', { + group = api.nvim_create_augroup('nvim.closing_floating_preview', { clear = true }), + callback = function(args) + local winid = tonumber(args.match) + local ok, preview_bufnr = pcall(api.nvim_win_get_var, winid, 'lsp_floating_bufnr') + if + ok + and api.nvim_buf_is_valid(preview_bufnr) + and winid == vim.b[preview_bufnr].lsp_floating_preview + then + vim.b[bufnr].lsp_floating_preview = nil + return true + end + end, + }) vim.wo[floating_winnr].foldenable = false -- Disable folding. vim.wo[floating_winnr].wrap = opts.wrap -- Soft wrapping. |