From ace254c9fff1e4173ed8094e0c986b1c3fd8e120 Mon Sep 17 00:00:00 2001 From: Donatas Date: Wed, 16 Jul 2025 06:12:45 +0300 Subject: [PATCH] fix(lsp): close floating preview window correctly #34946 Problem: After 28b7c2d (found with bisect) the hover preview window does not close when :edit'ing another file, even when you move the cursor. Solution: Change the BufLeave to target the original buffer, not the preview buffer. --- runtime/lua/vim/lsp/util.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index db221ddc68..28d00d6cd3 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -1418,9 +1418,10 @@ end --- ---@param events table list of events ---@param winnr integer window id of preview window ----@param bufnrs table list of buffers where the preview window will remain visible +---@param floating_bufnr integer floating preview buffer +---@param bufnr integer buffer that opened the floating preview buffer ---@see autocmd-events -local function close_preview_autocmd(events, winnr, bufnrs) +local function close_preview_autocmd(events, winnr, floating_bufnr, bufnr) local augroup = api.nvim_create_augroup('nvim.preview_window_' .. winnr, { clear = true, }) @@ -1429,13 +1430,13 @@ local function close_preview_autocmd(events, winnr, bufnrs) -- the floating window buffer or the buffer that spawned it api.nvim_create_autocmd('BufLeave', { group = augroup, - buffer = bufnrs[1], + buffer = bufnr, callback = function() vim.schedule(function() -- When jumping to the quickfix window from the preview window, -- do not close the preview window. if api.nvim_get_option_value('filetype', { buf = 0 }) ~= 'qf' then - close_preview_window(winnr, bufnrs) + close_preview_window(winnr, { floating_bufnr, bufnr }) end end) end, @@ -1444,7 +1445,7 @@ local function close_preview_autocmd(events, winnr, bufnrs) if #events > 0 then api.nvim_create_autocmd(events, { group = augroup, - buffer = bufnrs[2], + buffer = bufnr, callback = function() close_preview_window(winnr) end, @@ -1690,7 +1691,7 @@ function M.open_floating_preview(contents, syntax, opts) 'bdelete', { silent = true, noremap = true, nowait = true } ) - close_preview_autocmd(opts.close_events, floating_winnr, { floating_bufnr, bufnr }) + close_preview_autocmd(opts.close_events, floating_winnr, floating_bufnr, bufnr) -- save focus_id if opts.focus_id then