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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:05:15