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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:03:19