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
相关产品推荐
相关产品推荐

