Neovim 0.8.1更新后部分语言LSP光标悬停高亮autocmd失效
问题分析与解决方案
核心问题
- 判断条件逻辑错误:你当前以
documentFormattingProvider(格式化能力)作为启用文档高亮的判断依据,但文档高亮功能依赖的是LSP的documentHighlightProvider(文档高亮能力)——这是两个完全独立的LSP能力。更新后部分LSP的这两个能力不再同时具备,导致自动命令绑定逻辑失效。 - 变量未定义问题:第二个实现中
lsp_highlight_document函数未接收bufnr参数,却直接在函数内使用该变量,导致自动命令无法绑定到正确的缓冲区,这也是Python文件无高亮但手动执行有效的原因。
修复后的配置代码
1. 修正lsp_highlight_document函数
local function lsp_highlight_document(client, bufnr) -- 检查LSP是否支持文档高亮能力,而非格式化能力 if client.server_capabilities.documentHighlightProvider then local lsp_highlight_group = vim.api.nvim_create_augroup("lsp_document_highlight", { clear = true }) -- 清除当前缓冲区该组下的旧自动命令 vim.api.nvim_clear_autocmds({ buffer = bufnr, group = lsp_highlight_group }) -- 创建光标悬停高亮命令 vim.api.nvim_create_autocmd("CursorHold", { callback = vim.lsp.buf.document_highlight, buffer = bufnr, group = lsp_highlight_group, desc = "Document Highlight", }) -- 创建光标移动清除高亮命令 vim.api.nvim_create_autocmd("CursorMoved", { callback = vim.lsp.buf.clear_references, buffer = bufnr, group = lsp_highlight_group, desc = "Clear All the References", }) end end
2. 修正on_attach中的调用
options.on_attach = function(client, bufnr) if client.name == "tsserver" then client.server_capabilities.documentFormattingProvider = true end if client.name == "sumneko_lua" then client.server_capabilities.documentFormattingProvider = false end -- 传入bufnr参数 lsp_highlight_document(client, bufnr) lsp_keymaps(bufnr) end
各语言情况说明
- Svelte文件报错:
报错提示textDocument/documentHighlight不被支持,说明更新后的svelte-language-server已移除该能力,或客户端未正确请求该能力。可以检查Svelte LSP的版本/配置,确认是否能重新启用;若确实不再支持,只能放弃该文件类型的高亮功能。 - Python文件无高亮:
修复bufnr传递问题后,自动命令会正确绑定到Python缓冲区,pyright默认支持文档高亮能力,功能即可正常触发。 - Go/TypeScript/Dart正常:
这些LSP同时具备格式化和高亮能力,之前的错误条件碰巧生效,修复后逻辑更准确,不会影响现有功能。
内容的提问来源于stack exchange,提问作者Sami Al-Subhi
相关产品推荐
相关产品推荐

