mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	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:
		@@ -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,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user