闲置数月后Neovim的LSP Zero自动补全功能失效求助
问题:Neovim基于LSP Zero的自动补全(LSP)功能失效
数月未使用Neovim,此前正常工作的基于LSP Zero的自定义自动补全(LSP)功能现已失效。已尝试重新安装完整配置,但问题仍未解决。
相关配置
plugins.lua(Packer.nvim)
-- LSP Configuration use({ "VonHeikemen/lsp-zero.nvim", branch = "v1.x", requires = { -- LSP Support { "neovim/nvim-lspconfig" }, -- Required { "williamboman/mason.nvim" }, -- Optional { "williamboman/mason-lspconfig.nvim" }, -- Optional -- Autocompletion { "hrsh7th/nvim-cmp" }, -- Required { "hrsh7th/cmp-nvim-lsp" }, -- Required { "hrsh7th/cmp-buffer" }, -- Optional { "hrsh7th/cmp-path" }, -- Optional { "saadparwaiz1/cmp_luasnip" }, -- Optional { "hrsh7th/cmp-nvim-lua" }, -- Optional { "onsails/lspkind.nvim" }, -- Snippets { "L3MON4D3/LuaSnip" }, -- Required { "rafamadriz/friendly-snippets" }, -- Optional }, })
completion.lua
local luasnip = require("luasnip") local cmp = require("cmp") local lspkind = require("lspkind") cmp.setup({ formatting = { format = lspkind.cmp_format({ with_text = true, -- do not show text alongside icons maxwidth = 50, -- prevent the popup from showing more than provided characters (e.g 50 will not show more than 50 characters) -- The function below will be called before any actual modifications from lspkind -- so that you can provide more controls on popup customization. before = function(entry, vim_item) return vim_item end, }), }, snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, mapping = { ["<C-p>"] = cmp.mapping.select_prev_item(), ["<C-n>"] = cmp.mapping.select_next_item(), ["<C-d>"] = cmp.mapping.scroll_docs(-4), ["<C-f>"] = cmp.mapping.scroll_docs(4), ["<C-Space>"] = cmp.mapping.complete(), ["<C-e>"] = cmp.mapping.close(), ["<CR>"] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true, }), ["<Tab>"] = function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end end, ["<S-Tab>"] = function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, }, sources = { { name = "nvim_lsp" }, { name = "luasnip" }, { name = "neorg" }, }, })
解决步骤
检查LSP服务状态
- 启动Neovim后执行
:LspInfo,确认目标语言的LSP服务器已启动。若未启动,执行:Mason检查服务器是否已安装,未安装则手动安装。 - 若服务器已安装但启动失败,执行
:LspLog查看日志,排查路径错误、依赖缺失等问题。
- 启动Neovim后执行
更新所有插件
- 执行
:PackerSync更新LSP Zero、nvim-cmp、lspconfig等核心插件,避免版本兼容性问题。更新后重启Neovim测试。
- 执行
确认LSP与cmp的关联配置
- 确保LSP的capabilities已集成cmp的补全能力,在LSP配置中添加:
local lsp_zero = require('lsp-zero') lsp_zero.extend_lspconfig({ capabilities = require('cmp_nvim_lsp').default_capabilities() }) - 检查completion.lua中
sources是否包含nvim_lsp,且cmp-nvim-lsp已正确引入。
- 确保LSP的capabilities已集成cmp的补全能力,在LSP配置中添加:
排查Snippets配置
- 执行
:LuaSnipListAvailable查看是否有可用的snippets,若为空,在Luasnip配置中添加:require("luasnip.loaders.from_vscode").lazy_load() - 确认completion.lua中
snippet.expand函数正确调用luasnip.lsp_expand。
- 执行
测试最小配置
- 创建极简配置文件,仅加载LSP Zero、nvim-cmp、对应LSP服务器,逐步添加原有配置项,定位是否存在插件冲突或无效配置。
内容的提问来源于stack exchange,提问作者bradys dev
相关产品推荐
相关产品推荐

