feat(diagnostics): emulate VSCode Error Lens with virtual text and lines

Added functionality to mimic VSCode's Error Lens behavior:
	- Displays diagnostics as virtual text with severity icons during insert mode.
	- Switches to virtual lines with formatted messages in normal mode for better readability.

	Improves real-time feedback while coding and enhances the visual presentation of diagnostics.
pull/1628/head
glaulher 24 hours ago
parent 3338d39206
commit 632f7b06cd

@ -628,33 +628,56 @@ require('lazy').setup({
-- Diagnostic Config
-- See :help vim.diagnostic.Opts
local diagnostic_icons = {
[vim.diagnostic.severity.ERROR] = '󰅚 ',
[vim.diagnostic.severity.WARN] = '󰀪 ',
[vim.diagnostic.severity.INFO] = '󰋽 ',
[vim.diagnostic.severity.HINT] = '󰌶 ',
}
vim.diagnostic.config {
update_in_insert = true,
severity_sort = true,
float = { border = 'rounded', source = 'if_many' },
underline = { severity = vim.diagnostic.severity.ERROR },
signs = vim.g.have_nerd_font and {
text = {
[vim.diagnostic.severity.ERROR] = '󰅚 ',
[vim.diagnostic.severity.WARN] = '󰀪 ',
[vim.diagnostic.severity.INFO] = '󰋽 ',
[vim.diagnostic.severity.HINT] = '󰌶 ',
},
} or {},
virtual_text = {
source = 'if_many',
spacing = 2,
format = function(diagnostic)
local diagnostic_message = {
[vim.diagnostic.severity.ERROR] = diagnostic.message,
[vim.diagnostic.severity.WARN] = diagnostic.message,
[vim.diagnostic.severity.INFO] = diagnostic.message,
[vim.diagnostic.severity.HINT] = diagnostic.message,
}
return diagnostic_message[diagnostic.severity]
end,
},
underline = true, -- { severity = vim.diagnostic.severity.ERROR }
signs = vim.g.have_nerd_font and { text = diagnostic_icons } or {},
}
-- Diagnostic configuration similar to VS Code's Error Lens.
-- In insert mode, diagnostics are displayed as inline virtual text.
-- In normal mode, diagnostics are shown as virtual lines below the affected lines.
---@param enable boolean
local function set_virtual_text(enable)
vim.diagnostic.config {
virtual_lines = not enable and {
format = function(diagnostic)
return (diagnostic_icons[diagnostic.severity] or '') .. diagnostic.message
end,
} or false,
virtual_text = enable and {
source = 'if_many',
spacing = 2,
format = function(diagnostic)
return (diagnostic_icons[diagnostic.severity] or '') .. diagnostic.message
end,
} or false,
}
end
set_virtual_text(false)
vim.api.nvim_create_autocmd('InsertEnter', {
callback = function()
set_virtual_text(true)
end,
})
vim.api.nvim_create_autocmd('InsertLeave', {
callback = function()
set_virtual_text(false)
end,
})
-- LSP servers and clients are able to communicate to each other what features they support.
-- By default, Neovim doesn't support everything that is in the LSP specification.
-- When you add blink.cmp, luasnip, etc. Neovim now has *more* capabilities.

Loading…
Cancel
Save