如何配置nvim-cmp使其不自动选中第一个补全选项?
解决nvim-cmp自动选中第一个补全项的问题
完全可以实现你要的效果,只需调整nvim-cmp的核心配置,分三步修改:
1. 禁用自动选中第一个补全选项
在nvim-cmp的setup配置中,将completion.select设为false,这样补全菜单只会显示建议,不会自动选中任何选项:
cmp.setup({ completion = { select = false, -- 关键:关闭自动选中第一个选项 }, -- 其他配置... })
2. 配置Tab键切换补全选项
映射Tab和Shift+Tab键,用来手动选中补全菜单中的上下选项:
cmp.setup({ mapping = { ['<Tab>'] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() -- 选中下一个补全项 else fallback() -- 未显示补全时,执行默认Tab行为(如缩进) end end, { 'i', 's' }), ['<S-Tab>'] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() -- 选中上一个补全项 else fallback() end end, { 'i', 's' }), }, -- 其他配置... })
3. 配置回车键的行为
让回车键仅在选中补全项时确认补全,否则插入换行:
cmp.setup({ mapping = { ['<CR>'] = cmp.mapping(function(fallback) -- 检查是否有活跃的选中项(用户手动选中的) if cmp.visible() and cmp.get_active_entry() then cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false -- 确保不会自动选中,必须用户手动选 }) else fallback() -- 无选中项时,插入换行 end end, { 'i', 's' }), }, -- 其他配置... })
完整配置示例
把以上配置整合起来,最终的nvim-cmp setup代码如下:
local cmp = require('cmp') cmp.setup({ completion = { select = false, }, mapping = { ['<Tab>'] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() else fallback() end end, { 'i', 's' }), ['<S-Tab>'] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() else fallback() end end, { 'i', 's' }), ['<CR>'] = cmp.mapping(function(fallback) if cmp.visible() and cmp.get_active_entry() then cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }) else fallback() end end, { 'i', 's' }), }, -- 保留你原有的sources、snippet等配置... sources = cmp.config.sources({ { name = 'luasnip' }, { name = 'nvim_lsp' }, -- 其他数据源... }), })
配置完成后,重启Neovim即可生效:补全菜单会正常显示建议,但不会自动选中;按Tab可手动选择选项,未选中任何选项时按回车只会插入换行,再也不会触发误替换的问题。
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

