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