Neovim对应语言文件打开时语言服务器未运行的排查求助
问题:Neovim配置LSP后无活动客户端
我使用Neovim,为实现自动补全安装了对应语言的多个语言服务器(配置在cmp.lua的lspconfig部分)。但打开对应语言文件并执行:LspInfo时,vim.lsp显示“no active clients”。所有测试项目均存在.git根标记,以下是在带.git根标记的Python文件中执行:LspInfo的输出,以及我的cmp.lua配置文件内容,希望找出遗漏的配置点。
:LspInfo输出
:LspInfo ============================================================================== vim.lsp: ✅ - LSP log level : WARN - Log path: /home/c3/.local/state/nvim/lsp.log - Log size: 240 KB vim.lsp: Active Clients ~ - No active clients vim.lsp: Enabled Configurations ~ - cssls: - capabilities: { textDocument = { completion = { completionItem = { commitCharactersSupport = true, deprecatedSupport = true, insertReplaceSupport = true, insertTextModeSupport = { valueSet = { 1, 2 } }, labelDetailsSupport = true, preselectSupport = true, resolveSupport = { properties = { "documentation", "additionalTextEdits", "insertTextFormat", "insertTextMode", "command" } }, snippetSupport = true, tagSupport = { valueSet = { 1 } } }, completionList = { itemDefaults = { "commitCharacters", "editRange", "insertTextFormat", "insertTextMode", "data" } }, contextSupport = true, dynamicRegistration = false, insertTextMode = 1 } } } - cmd: { "vscode-css-language-server", "--stdio" } - filetypes: css, scss, less - init_options: { provideFormatter = true } - root_markers: package.json, .git - settings: { css = { validate = true }, less = { validate = true }, scss = { validate = true } } - html: - capabilities: { textDocument = { completion = { completionItem = { commitCharactersSupport = true, deprecatedSupport = true, insertReplaceSupport = true, insertTextModeSupport = { valueSet = { 1, 2 } }, labelDetailsSupport = true, preselectSupport = true, resolveSupport = { properties = { "documentation", "additionalTextEdits", "insertTextFormat", "insertTextMode", "command" } }, snippetSupport = true, tagSupport = { valueSet = { 1 } } }, completionList = { itemDefaults = { "commitCharacters", "editRange", "insertTextFormat", "insertTextMode", "data" } }, contextSupport = true, dynamicRegistration = false, insertTextMode = 1 } } } - cmd: { "vscode-html-language-server", "--stdio" } - filetypes: html, templ - init_options: { configurationSection = { "html", "css", "javascript" }, embeddedLanguages = { css = true, javascript = true }, provideFormatter = true } - root_markers: package.json, .git - settings: {} - pyright: - capabilities: { textDocument = { completion = { completionItem = { commitCharactersSupport = true, deprecatedSupport = true, insertReplaceSupport = true, insertTextModeSupport = { valueSet = { 1, 2 } }, labelDetailsSupport = true, preselectSupport = true, resolveSupport = { properties = { "documentation", "additionalTextEdits", "insertTextFormat", "insertTextMode", "command" } }, snippetSupport = true, tagSupport = { valueSet = { 1 } } }, completionList = { itemDefaults = { "commitCharacters", "editRange", "insertTextFormat", "insertTextMode", "data" } }, contextSupport = true, dynamicRegistration = false, insertTextMode = 1 } } } - cmd: { "pyright-langserver", "--stdio" } - filetypes: python - on_attach: <function @/home/c3/.local/share/nvim/lazy/nvim-lspconfig/lsp/pyright.lua:43> - root_markers: pyproject.toml, setup.py, setup.cfg, requirements.txt, Pipfile, pyrightconfig.json, .git - settings: { python = { analysis = { autoSearchPaths = true, diagnosticMode = "openFilesOnly", useLibraryCodeForTypes = true } } } - ts_ls: - capabilities: { textDocument = { completion = { completionItem = { commitCharactersSupport = true, deprecatedSupport = true, insertReplaceSupport = true, insertTextModeSupport = { valueSet = { 1, 2 } }, labelDetailsSupport = true, preselectSupport = true, resolveSupport = { properties = { "documentation", "additionalTextEdits", "insertTextFormat", "insertTextMode", "command" } }, snippetSupport = true, tagSupport = { valueSet = { 1 } } }, completionList = { itemDefaults = { "commitCharacters", "editRange", "insertTextFormat", "insertTextMode", "data" } }, contextSupport = true, dynamicRegistration = false, insertTextMode = 1 } } } - cmd: { "typescript-language-server", "--stdio" } - filetypes: javascript, javascriptreact, javascript.jsx, typescript, typescriptreact, typescript.tsx - handlers: { ["_typescript.rename"] = <function 1> } - init_options: { hostInfo = "neovim" } - on_attach: <function @/home/c3/.local/share/nvim/lazy/nvim-lspconfig/lsp/ts_ls.lua:100> - root_markers: tsconfig.json, jsconfig.json, package.json, .git vim.lsp: File Watcher ~ - file watching "(workspace/didChangeWatchedFiles)" disabled on all clients vim.lsp: Position Encodings ~ - No active clients
cmp.lua配置文件
-- Set up nvim-cmp. local cmp = require'cmp' require("luasnip.loaders.from_vscode").lazy_load() cmp.setup({ snippet = { expand = function(args) require('luasnip').lsp_expand(args.body) -- For `luasnip` users. end, }, window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered(), }, mapping = cmp.mapping.preset.insert({ ['<C-b>'] = cmp.mapping.scroll_docs(-4), ['<C-f>'] = cmp.mapping.scroll_docs(4), ['<C-Space>'] = cmp.mapping.complete(), ['<C-e>'] = cmp.mapping.abort(), ['<CR>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. }), sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'luasnip' }, -- For luasnip users. { name = 'path' }, }, { { name = 'buffer'}, }), formatting = { format = require("nvim-highlight-colors").format } }) -- Set configuration for specific filetype. cmp.setup.filetype('gitcommit', { sources = cmp.config.sources({ { name = 'git' }, }, { { name = 'buffer' }, }) }) require("cmp_git").setup() -- Use buffer source for `/` and `?` (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline({ '/', '?' }, { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } }) -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }), matching = { disallow_symbol_nonprefix_matching = false } }) -- Set up lspconfig local capabilities = require('cmp_nvim_lsp').default_capabilities() vim.lsp.config('html', { capabilities = capabilities }) vim.lsp.enable('html') vim.lsp.config('ts_ls', { capabilities = capabilities }) vim.lsp.enable('ts_ls') vim.lsp.config('cssls', { capabilities = capabilities }) vim.lsp.enable('cssls') vim.lsp.config('pyright', { capabilities = capabilities }) vim.lsp.enable('pyright')
问题根源
你使用了原生的vim.lsp.config和vim.lsp.enable来配置LSP,但这不是nvim-lspconfig插件的正确用法。nvim-lspconfig需要调用require('lspconfig').[server_name].setup()来完成服务器的初始化和自动启动逻辑。
修复步骤
将cmp.lua中LSP配置部分的代码替换为以下内容:
-- 替换原来的vim.lsp.config和vim.lsp.enable代码 local capabilities = require('cmp_nvim_lsp').default_capabilities() require('lspconfig').html.setup({ capabilities = capabilities }) require('lspconfig').ts_ls.setup({ capabilities = capabilities }) require('lspconfig').cssls.setup({ capabilities = capabilities }) require('lspconfig').pyright.setup({ capabilities = capabilities })
额外检查点
- 确认所有LSP服务器的可执行文件(如
pyright-langserver、typescript-language-server等)已安装在系统PATH中,可在终端直接运行验证 - 查看Neovim的LSP日志(路径:
/home/c3/.local/state/nvim/lsp.log),排查是否有服务器启动失败的具体错误信息 - 确认项目根目录的标记文件(如.git)能被LSP正确识别,可通过
:LspInfo中的root_markers字段验证
内容的提问来源于stack exchange,提问作者Corey C
相关产品推荐
相关产品推荐

