fix(diagnostic): improve current_line refresh logic #32275

Problem:
The current implementation uses a global augroup for virtual lines in
diagnostics, which can lead to conflicts and unintended behavior when
multiple namespaces/buffers are involved.

Solution:
Refactor the code to use a namespace-specific augroup for virtual lines.
This ensures that each namespace has its own augroup.
Scope the clear commands to only the relevant buffer.
This commit is contained in:
Tristan Knight
2025-02-02 09:56:01 +00:00
committed by GitHub
parent a22f2102ce
commit 5bc948c050

View File

@@ -344,7 +344,6 @@ local global_diagnostic_options = {
--- @class (private) vim.diagnostic.Handler --- @class (private) vim.diagnostic.Handler
--- @field show? fun(namespace: integer, bufnr: integer, diagnostics: vim.Diagnostic[], opts?: vim.diagnostic.OptsResolved) --- @field show? fun(namespace: integer, bufnr: integer, diagnostics: vim.Diagnostic[], opts?: vim.diagnostic.OptsResolved)
--- @field hide? fun(namespace:integer, bufnr:integer) --- @field hide? fun(namespace:integer, bufnr:integer)
--- @field _augroup? integer
--- @nodoc --- @nodoc
--- @type table<string,vim.diagnostic.Handler> --- @type table<string,vim.diagnostic.Handler>
@@ -1841,12 +1840,14 @@ M.handlers.virtual_lines = {
ns.user_data.virt_lines_ns = ns.user_data.virt_lines_ns =
api.nvim_create_namespace(string.format('nvim.%s.diagnostic.virtual_lines', ns.name)) api.nvim_create_namespace(string.format('nvim.%s.diagnostic.virtual_lines', ns.name))
end end
if not M.handlers.virtual_lines._augroup then if not ns.user_data.virt_lines_augroup then
M.handlers.virtual_lines._augroup = ns.user_data.virt_lines_augroup = api.nvim_create_augroup(
api.nvim_create_augroup('nvim.lsp.diagnostic.virt_lines', { clear = true }) string.format('nvim.%s.diagnostic.virt_lines', ns.name),
{ clear = true }
)
end end
api.nvim_clear_autocmds({ group = M.handlers.virtual_lines._augroup }) api.nvim_clear_autocmds({ group = ns.user_data.virt_lines_augroup, buffer = bufnr })
if opts.virtual_lines.format then if opts.virtual_lines.format then
diagnostics = reformat_diagnostics(opts.virtual_lines.format, diagnostics) diagnostics = reformat_diagnostics(opts.virtual_lines.format, diagnostics)
@@ -1855,7 +1856,7 @@ M.handlers.virtual_lines = {
if opts.virtual_lines.current_line == true then if opts.virtual_lines.current_line == true then
api.nvim_create_autocmd('CursorMoved', { api.nvim_create_autocmd('CursorMoved', {
buffer = bufnr, buffer = bufnr,
group = M.handlers.virtual_lines._augroup, group = ns.user_data.virt_lines_augroup,
callback = function() callback = function()
render_virtual_lines_at_current_line(diagnostics, ns.user_data.virt_lines_ns, bufnr) render_virtual_lines_at_current_line(diagnostics, ns.user_data.virt_lines_ns, bufnr)
end, end,
@@ -1875,7 +1876,7 @@ M.handlers.virtual_lines = {
if api.nvim_buf_is_valid(bufnr) then if api.nvim_buf_is_valid(bufnr) then
api.nvim_buf_clear_namespace(bufnr, ns.user_data.virt_lines_ns, 0, -1) api.nvim_buf_clear_namespace(bufnr, ns.user_data.virt_lines_ns, 0, -1)
end end
api.nvim_clear_autocmds({ group = M.handlers.virtual_lines._augroup }) api.nvim_clear_autocmds({ group = ns.user_data.virt_lines_augroup, buffer = bufnr })
end end
end, end,
} }