nvim-cmp在Lua语言下展开代码片段时抛出错误求助
问题:Neovim nvim-cmp仅在Lua环境选中补全建议时崩溃
我的nvim-cmp插件在大部分项目中代码补全功能正常,但仅在Lua语言环境下,选中补全建议展开代码片段时会抛出错误并崩溃。补全建议可正常显示,但选中任意建议就触发报错。
使用lazy.nvim作为插件管理器,附上我的nvim-cmp配置文件:
return { "hrsh7th/nvim-cmp", event = "InsertEnter", dependencies = { "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", "onsails/lspkind.nvim", "L3MON4D3/LuaSnip", "saadparwaiz1/cmp_luasnip", "rafamadriz/friendly-snippets", "hrsh7th/cmp-nvim-lsp", }, config = function() local cmp = require("cmp") local luasnip = require("luasnip") local lspkind = require("lspkind") require("luasnip.loaders.from_vscode").lazy_load() vim.opt.completeopt = "menu,menuone,preview,noselect" cmp.setup({ snippet = { expand = function(args) luasnip.lspexpand(args.body) end, }, mapping = cmp.mapping.preset.insert({ ["<C-k>"] = cmp.mapping.select_prev_item(), ["<C-j>"] = cmp.mapping.select_next_item(), ["<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 = false }), }), sources = cmp.config.sources({ { name = "nvim_lsp" }, { name = "luasnip" }, { name = "buffer" }, { name = "path" }, }), formatting = { format = lspkind.cmp_format({ maxwidth = 50, ellipsis_char = "...", }), }, }) end, }
排查与解决步骤
1. 修正LuaSnip展开函数拼写错误
你的配置中使用的luasnip.lspexpand(args.body)是拼写错误,LuaSnip标准展开函数为luasnip.lsp_expand(args.body)(注意下划线),这个错误会在Lua环境触发补全时直接抛出异常。
修改snippet配置段:
snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, },
2. 检查Lua LSP源冲突
临时禁用nvim_lsp源测试是否还崩溃:
sources = cmp.config.sources({ -- { name = "nvim_lsp" }, -- 注释此行 { name = "luasnip" }, { name = "buffer" }, { name = "path" }, }),
若不再崩溃,说明问题出在Lua LSP(通常是lua-language-server)返回的补全项上,需检查LSP配置是否开启了特殊补全片段,或更新LSP版本。
3. 排查Lua代码片段冲突
friendly-snippets中的Lua片段可能存在格式问题,临时禁用该插件测试:
在lazy.nvim的dependencies中注释掉rafamadriz/friendly-snippets,重启Neovim验证。若恢复正常,需单独排查Lua相关的snippets文件。
4. 更新所有相关插件
插件版本不兼容也会导致此类问题,执行更新命令:
:Lazy update nvim-cmp cmp-nvim-lsp LuaSnip cmp_luasnip friendly-snippets
5. 查看具体错误日志
若以上步骤无效,通过以下方式获取错误细节:
- 执行
:checkhealth检查插件健康状态 - 查看Neovim日志文件(通常位于
~/.local/state/nvim/log),根据错误堆栈定位根源
内容的提问来源于stack exchange,提问作者JesseNoEyes
相关产品推荐
相关产品推荐

