diff --git a/init.lua b/init.lua index b98ffc61..06b23a2b 100644 --- a/init.lua +++ b/init.lua @@ -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.