Neovim LSP功能正常但不显示错误信息,求助解决
解决Neovim LSP无法显示错误信息的问题
问题描述
笔记本设备上Neovim 0.7.2运行包含LSP配置的配置文件完全正常,能正常显示LSP错误信息;但台式机设备上,无论是Neovim 0.8.0还是降级到0.7.2,LSP功能可正常运行却无法显示错误提示。已尝试更新、重装插件,问题仍未解决。
配置代码
vim.opt.tabstop = 2 vim.cmd([[colorscheme dedsec]]) vim.cmd([[set number]]) vim.cmd([[set noswapfile]]) vim.cmd([[set mouse=a]]) vim.opt.shiftwidth = 2 vim.opt.softtabstop = 2 vim.opt.expandtab = true require("packer").startup(function(use) -- use "wbthompson/packer.nvim" use "vim-airline/vim-airline" use 'vim-airline/vim-airline-themes' use 'ryanoasis/vim-devicons' use 'jpalardy/vim-slime' use 'shime/vim-livedown' use 'ap/vim-css-color' use 'terryma/vim-multiple-cursors' use 'mattn/emmet-vim' use 'scrooloose/nerdtree' use 'mxw/vim-jsx' -- LSP use { 'VonHeikemen/lsp-zero.nvim', requires = { -- LSP Support {'neovim/nvim-lspconfig'}, {'williamboman/mason.nvim'}, {'williamboman/mason-lspconfig.nvim'}, -- Autocompletion {'hrsh7th/nvim-cmp'}, {'hrsh7th/cmp-buffer'}, {'hrsh7th/cmp-path'}, {'saadparwaiz1/cmp_luasnip'}, {'hrsh7th/cmp-nvim-lsp'}, {'hrsh7th/cmp-nvim-lua'}, -- Snippets {'L3MON4D3/LuaSnip'}, {'rafamadriz/friendly-snippets'}, } } end) vim.cmd([[ let g:airline_powerline_fonts = 1 "Включить поддержку Powerline шрифтов let g:airline#extensions#keymap#enabled = 0 "Не показывать текущий маппинг let g:airline_section_z = "\ue0a1:%l/%L Col:%c" "Кастомная графа положения курсора let g:Powerline_symbols='unicode' "Поддержка unicode let g:airline#extensions#xkblayout#enabled = 0 "Про это позже расскажу set guioptions= "Отключаем панели прокрутки в GUI set showtabline=1 "Отключаем панель табов (окошки FTW) let g:slime_target = "tmux" let g:slime_target = "neovim" nnoremap <leader>n :NERDTreeFocus<CR> nnoremap <C-n> :NERDTree<CR> nnoremap <C-b> :NERDTreeToggle<CR> nnoremap <C-f> :NERDTreeFind<CR> let g:user_emmet_mode='a' set colorcolumn=109 ]]) local lsp = require('lsp-zero') lsp.preset('recommended') lsp.nvim_workspace() lsp.setup() local servers = { 'pyright', 'tsserver', 'jdtls', 'rust-analyzer', 'clangd', 'sumneko_lua'} for _, lsp in pairs(servers) do require('lspconfig')[lsp].setup { on_attach = on_attach, flags = { debounce_text_changes = 150, } } end local signs = { Error = " ", Warn = " ", Hint = " ", Info = " " } for type, icon in pairs(signs) do local hl = "DiagnosticSign" .. type vim.fn.sign_define(hl, { text = icon, texthl= hl, numhl = hl }) end
效果对比
- 正常显示(笔记本Neovim 0.7.2):

- 异常显示(台式机Neovim 0.8.0/0.7.2):

解决方案
1. 修复未定义的on_attach函数
配置中循环设置LSP服务器时使用了on_attach = on_attach,但该函数并未定义,会导致LSP初始化异常,破坏诊断显示逻辑。可二选一处理:
- 定义基础
on_attach函数:local on_attach = function(client, bufnr) -- 可添加自定义LSP快捷键,示例: vim.keymap.set('n', 'K', vim.lsp.buf.hover, {buffer = bufnr}) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, {buffer = bufnr}) -- 确保当前缓冲区启用诊断 vim.diagnostic.enable(bufnr) end - 直接移除
on_attach = on_attach行,使用LSP默认配置。
2. 显式配置诊断显示选项
Neovim 0.8+对诊断系统有更新,需显式开启相关显示设置,在配置末尾添加:
vim.diagnostic.config({ virtual_text = true, -- 显示行内虚拟文本错误提示 signs = true, -- 显示侧边栏诊断图标 underline = true, -- 下划线标注错误行 update_in_insert = false, severity_sort = true, })
3. 避免lsp-zero与手动LSP配置冲突
lsp-zero的lsp.setup()已自动处理推荐服务器配置,手动循环调用require('lspconfig')[lsp].setup()会覆盖默认设置。改为用lsp-zero的ensure_installed管理服务器:
local lsp = require('lsp-zero') lsp.preset('recommended') -- 指定需要安装的LSP服务器(注意sumneko_lua已改名为lua_ls) lsp.ensure_installed({ 'pyright', 'tsserver', 'jdtls', 'rust-analyzer', 'clangd', 'lua_ls' }) lsp.nvim_workspace() lsp.setup()
4. 验证字体支持
确保台式机终端安装了支持Powerline图标的字体(如JetBrains Mono Nerd Font),否则诊断图标无法显示,会误以为没有错误提示。
验证步骤
- 保存修改后的配置文件
- 重启Neovim
- 运行
:PackerSync更新插件 - 打开含错误的代码文件,检查错误提示是否正常显示
内容的提问来源于stack exchange,提问作者bruh
相关产品推荐
相关产品推荐

