使用YouCompleteMe与UltiSnips时插入模式无法回车的解决问询
解决YouCompleteMe与UltiSnips冲突导致Enter键失效的问题
这个问题我之前也碰到过!主要是YouCompleteMe(YCM)默认把Enter键(<CR>)绑定成了补全确认快捷键,拦截了按键事件,导致你在插入模式下按Enter时,要么触发YCM的补全确认,要么直接没反应,没法正常换行或者触发UltiSnips的代码片段。下面给你几个可行的解决方案:
方案1:完全禁用YCM对Enter键的绑定
如果平时习惯用其他按键(比如YCM默认的<C-y>)来确认补全,可以直接让YCM放弃对Enter键的占用,把下面的配置加到你的~/.vimrc(或Neovim的~/.config/nvim/init.vim)里:
let g:ycm_key_list_select_completion = [] let g:ycm_key_list_previous_completion = []
这样YCM就不会再拦截Enter键了,你按Enter时会正常执行换行,UltiSnips的触发逻辑也能正常工作。
方案2:让Enter键智能切换行为(推荐)
如果既想保留YCM用Enter确认补全的功能,又想在没有补全菜单时正常换行、触发UltiSnips,可以用条件映射,让Enter键根据当前场景自动切换行为:
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : (UltiSnips#CanExpandSnippet() ? "\<Plug>(ultisnips_expand)" : "\<CR>")
这段配置的逻辑是:
- 当YCM的补全菜单(pum)弹出时,按Enter就等于按
<C-y>确认补全; - 如果没有补全菜单,但当前光标位置可以展开UltiSnips的代码片段,按Enter就触发片段展开;
- 其他情况下,按Enter就是普通的换行。
方案3:调整UltiSnips的触发键
如果你不想改动YCM的配置,也可以把UltiSnips的展开触发键改成其他按键,比如把<c-m>换成<c-space>,修改你的UltiSnips配置:
let g:UltiSnipsExpandTrigger="<c-space>"
这样就避免了和YCM的Enter键绑定冲突,不过需要重新适应新的触发键。
配置修改完成后,记得重启Vim或者执行:source %重新加载配置,就能正常使用Enter键了。
内容的提问来源于stack exchange,提问作者Jin
相关产品推荐
相关产品推荐

