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

Neovim出现双补全菜单,如何仅保留nvim-cmp补全?

问题描述

将Neovim作为主力IDE使用,已配置nvim-cmp补全插件,整体效果良好,但偶尔会弹出Neovim默认关键字补全窗口。尝试过禁用补全插件、设置相关变量、修改nvim-cmp配置,但均未解决问题。截图显示两个补全菜单,底部的为无法选中的默认补全窗口,求助如何移除该默认补全窗口。

当前nvim-cmp配置

set.completeopt = "menu,menuone,noselect"

cmp.setup({
    completion = {
        autocomplete = false,
    },

    opts = function(_, opts)
        -- opts parameter is the default options table
        -- the function is lazy loaded so cmp is able to be required
        local cmp = require("cmp")
        -- modify the sources part of the options table
        opts.sources = cmp.config.sources({
            { name = "nvim_lsp", priority = 1000 },
            { name = "luasnip", priority = 750 },
            { name = "buffer", priority = 500 },
            { name = "path", priority = 250 },
            { name = "vim-dadbod-completion", priority = 700 }, -- add new source
        })
        -- return the new table to be used
        return opts
    end,

    snippet = {
        expand = function(args)
            luasnip.lsp_expand(args.body)
        end,
    },
    mapping = cmp.mapping.preset.insert({
        ["<C-d>"] = cmp.mapping.scroll_docs(-4),
        ["<C-f>"] = cmp.mapping.scroll_docs(4),
        ["<C-Space>"] = cmp.mapping.complete(),
        ["<CR>"] = cmp.mapping.confirm({
            behavior = cmp.ConfirmBehavior.Replace,
            select = true,
        }),
    }),

    sources = {
        { name = "nvim_lsp" },
        { name = "luasnip" },
        { name = "buffer" },
        { name = "path" },
    },

    formatting = {
        format = function(entry, item)
            item.kind = lsp_symbols[item.kind]
            item.menu = ({
                buffer = "[Buffer]",
                nvim_lsp = "[LSP]",
                luasnip = "[Snippet]",
                neorg = "[Neorg]",
            })[entry.source.name]

            return item
        end,
    },
})

解决方案

1. 彻底禁用Vim原生补全

在Neovim配置中添加以下设置,直接关闭原生关键字补全的触发逻辑:

set completeopt=menu,menuone,noselect
set completefunc=
set omnifunc=

如果用Lua配置:

vim.opt.completeopt = "menu,menuone,noselect"
vim.opt.completefunc = ""
vim.opt.omnifunc = ""

2. 修复nvim-cmp配置冲突

你的配置中同时存在外层sources字段和opts函数内的sources修改,这会导致配置加载异常。删除外层的sources字段,只保留opts函数内的定义,避免重复配置:

cmp.setup({
    completion = {
        autocomplete = false,
    },

    opts = function(_, opts)
        local cmp = require("cmp")
        opts.sources = cmp.config.sources({
            { name = "nvim_lsp", priority = 1000 },
            { name = "luasnip", priority = 750 },
            { name = "vim-dadbod-completion", priority = 700 },
            { name = "buffer", priority = 500 },
            { name = "path", priority = 250 },
        })
        return opts
    end,

    -- 其他配置(snippet、mapping、formatting)保持不变
})

3. 拦截原生补全触发事件

如果前两种方法无效,通过autocmd在nvim-cmp窗口显示时,强制清空原生补全列表:

vim.api.nvim_create_autocmd("CompleteChanged", {
    callback = function()
        if require("cmp").visible() then
            vim.fn.complete(0, {})
        end
    end,
})

4. 排查插件干扰

部分语法检查、代码高亮类插件可能意外触发原生补全。暂时禁用非必要插件,逐一排查是否有插件导致该问题。

内容的提问来源于stack exchange,提问作者Aleksey Likhodievski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:22:08