You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用Neovim的LSP虚拟文本并设置快捷键查看诊断

问题解决:NVChad下禁用LSP虚拟文本并配置诊断查看快捷键

环境与需求

  • 环境:Neovim v0.10.1,WSL2 Ubuntu 24.04 LTS,NVChad + LazyVim
  • 需求:
    1. 禁用代码行旁的LSP虚拟文本(错误、警告等行内提示)
    2. 设置快捷键g+l,通过悬浮窗口查看当前行的诊断详情

此前尝试在~/.config/nvim/init.lua和~/.config/nvim/lua/configs/lspconfig.lua中设置virtual_text=false,但虚拟文本仍正常显示。

问题根源

你的配置存在两个核心错误:

  1. 全局诊断配置可能被NVChad的默认配置覆盖,加载顺序未优先生效
  2. 错误地将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:00:14