如何禁用Neovim的LSP虚拟文本并设置快捷键查看诊断
问题解决:NVChad下禁用LSP虚拟文本并配置诊断查看快捷键
环境与需求
- 环境:Neovim v0.10.1,WSL2 Ubuntu 24.04 LTS,NVChad + LazyVim
- 需求:
- 禁用代码行旁的LSP虚拟文本(错误、警告等行内提示)
- 设置快捷键
g+l,通过悬浮窗口查看当前行的诊断详情
此前尝试在~/.config/nvim/init.lua和~/.config/nvim/lua/configs/lspconfig.lua中设置virtual_text=false,但虚拟文本仍正常显示。
问题根源
你的配置存在两个核心错误:
- 全局诊断配置可能被NVChad的默认配置覆盖,加载顺序未优先生效
- 错误地将Neovim自身的诊断配置放在了LSP服务器的
settings参数中——settings是传给LSP服务端的自定义配置,而非Neovim本地诊断规则,这部分设置不会生效
解决步骤
1. 正确禁用LSP虚拟文本
修改~/.config/nvim/lua/configs/lspconfig.lua,调整配置逻辑:
-- 加载NVChad默认LSP配置 require("nvchad.configs.lspconfig").defaults() local lspconfig = require "lspconfig" local nvlsp = require "nvchad.configs.lspconfig" -- 全局覆盖诊断配置(优先于NVChad默认设置) vim.diagnostic.config({ signs = true, underline = true, update_in_insert = false, virtual_text = false, -- 彻底禁用虚拟文本 severity_sort = true, signs = { text = { [vim.diagnostic.severity.ERROR] = "", [vim.diagnostic.severity.WARN] = "", [vim.diagnostic.severity.HINT] = "", [vim.diagnostic.severity.INFO] = "", }, }, }) -- 仅保留LSP服务器专属配置 local custom_opts = { inlay_hints = { enabled = true, exclude = { "vue" }, }, document_highlight = { enabled = true, }, capabilities = nvlsp.capabilities, } -- 初始化LSP服务器 local servers = { "html", "cssls", "rust_analyzer" } for _, lsp in ipairs(servers) do lspconfig[lsp].setup { on_attach = nvlsp.on_attach, on_init = nvlsp.on_init, capabilities = custom_opts.capabilities, -- 仅传入服务器支持的配置项 settings = { inlayHints = custom_opts.inlay_hints, }, } end
如果全局配置仍被覆盖,可在on_attach中针对缓冲区强制设置:
-- 自定义on_attach函数,覆盖默认行为 local custom_on_attach = function(client, bufnr) nvlsp.on_attach(client, bufnr) -- 针对当前缓冲区禁用虚拟文本 vim.diagnostic.config({ virtual_text = false }, bufnr) end -- 替换LSP初始化中的on_attach for _, lsp in ipairs(servers) do lspconfig[lsp].setup { on_attach = custom_on_attach, on_init = nvlsp.on_init, capabilities = custom_opts.capabilities, settings = { inlayHints = custom_opts.inlay_hints, }, } end
2. 配置g+l快捷键查看诊断
将以下代码添加到~/.config/nvim/lua/configs/lspconfig.lua或~/.config/nvim/lua/mappings.lua中:
-- 全局快捷键:查看当前行诊断 vim.keymap.set('n', 'g+l', function() vim.diagnostic.open_float(nil, { focusable = false, close_events = { "BufLeave", "CursorMoved", "InsertEnter", "FocusLost" }, border = 'rounded', source = 'always', prefix = ' ', scope = 'cursor', }) end, { desc = "Show line diagnostics" })
若仅想在LSP激活的缓冲区生效,可放在custom_on_attach内:
local custom_on_attach = function(client, bufnr) nvlsp.on_attach(client, bufnr) -- 缓冲区局部快捷键 vim.keymap.set('n', 'g+l', function() vim.diagnostic.open_float(nil, { focusable = false, close_events = { "BufLeave", "CursorMoved", "InsertEnter", "FocusLost" }, border = 'rounded', source = 'always', prefix = ' ', scope = 'cursor', }) end, { desc = "Show line diagnostics", buffer = bufnr }) end
验证方式
重启Neovim后打开带有LSP诊断的文件:
- 确认行旁不再显示虚拟文本
- 按下
g+l,会弹出带圆角边框的悬浮窗口,显示当前行的诊断详情
内容的提问来源于stack exchange,提问作者Mopparthy Ravindranath
相关产品推荐
相关产品推荐

