diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index 3de76f93a6..c2b3d903e0 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -1620,18 +1620,16 @@ function M.open_floating_preview(contents, syntax, opts) api.nvim_buf_set_var(bufnr, 'lsp_floating_preview', floating_winnr) end - local augroup_name = ('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 + local augroup_name = 'nvim_closing_floating_preview' + if vim.fn.exists(('#%s'):format(augroup_name)) == 0 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 + group = api.nvim_create_augroup(augroup_name, { clear = true }), + callback = function(args) + if + tonumber(args.match) == vim.b[bufnr].lsp_floating_preview and 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 diff --git a/test/functional/plugin/lsp/utils_spec.lua b/test/functional/plugin/lsp/utils_spec.lua index ce6e6b2535..b9f5d2f06b 100644 --- a/test/functional/plugin/lsp/utils_spec.lua +++ b/test/functional/plugin/lsp/utils_spec.lua @@ -267,38 +267,38 @@ describe('vim.lsp.util', function() eq(56, opts.height) end) + end) + end) - describe('vim.lsp.util.open_floating_preview', function() - local var_name = 'lsp_floating_preview' - local curbuf = api.nvim_get_current_buf() + describe('open_floating_preview', function() + before_each(function() + n.clear() + Screen.new(10, 10) + feed('9iG4k') + end) - it('clean bufvar after fclose', function() - exec_lua(function() - vim.lsp.util.open_floating_preview({ 'test' }, '', { height = 5, width = 2 }) - end) - eq(true, api.nvim_win_is_valid(api.nvim_buf_get_var(curbuf, var_name))) - command('fclose') - eq( - 'Key not found: lsp_floating_preview', - pcall_err(api.nvim_buf_get_var, curbuf, var_name) - ) - end) + local var_name = 'lsp_floating_preview' + local curbuf = api.nvim_get_current_buf() - it('clean bufvar after CursorMoved', function() - local result = exec_lua(function() - vim.lsp.util.open_floating_preview({ 'test' }, '', { height = 5, width = 2 }) - local winnr = vim.b[vim.api.nvim_get_current_buf()].lsp_floating_preview - local result = vim.api.nvim_win_is_valid(winnr) - vim.api.nvim_feedkeys(vim.keycode('G'), 'txn', false) - return result - end) - eq(true, result) - eq( - 'Key not found: lsp_floating_preview', - pcall_err(api.nvim_buf_get_var, curbuf, var_name) - ) - end) + it('clean bufvar after fclose', function() + exec_lua(function() + vim.lsp.util.open_floating_preview({ 'test' }, '', { height = 5, width = 2 }) end) + eq(true, api.nvim_win_is_valid(api.nvim_buf_get_var(curbuf, var_name))) + command('fclose') + eq('Key not found: lsp_floating_preview', pcall_err(api.nvim_buf_get_var, curbuf, var_name)) + end) + + it('clean bufvar after CursorMoved', function() + local result = exec_lua(function() + vim.lsp.util.open_floating_preview({ 'test' }, '', { height = 5, width = 2 }) + local winnr = vim.b[vim.api.nvim_get_current_buf()].lsp_floating_preview + local result = vim.api.nvim_win_is_valid(winnr) + vim.api.nvim_feedkeys(vim.keycode('G'), 'txn', false) + return result + end) + eq(true, result) + eq('Key not found: lsp_floating_preview', pcall_err(api.nvim_buf_get_var, curbuf, var_name)) end) end) end)