vim+YouCompleteMe中设置回车自动选择第一项配置

zwlwf / 2023-05-07 / 原文

配置

vim默认的youcompleteme.vim中做了选择补齐的快捷键(ctrl+n或下箭头),使用起来感觉不方便。决定映射为回车。

在vimrc中添加如下配置

inoremap <expr> <CR> pumvisible() ? "<Down>\<CR> " : "\<CR>"

解释

inoremap在输入(i)的模式下,非递归(nore[cursive])做符号映射(map), 这里<expr>表示rhs是个表达式,而不是直接做映射。
rhs的表达式意思是,若当前为pumvisible模式,将回车映射为“down键盘加回车再加空格”,down键即选择下一项,最后有一个空格是为了退出候选模式。

更新

上面映射回车为选择补齐的缺点是会加一个空格。不加空格又无法退出提示截面。

还有一种方法,就是回车单纯表示选择,要在pumvisible强制使用回车的话就再映射一个控件到回车。这样补齐后,同一行内,直接按空格退出,真想换行就直接按下面AnyKey.

inoremap <expr> <CR> pumvisible()? "<Down>\<CR>" : "\<CR>"
inoremap AnyKey <CR>

这里AnyKey习惯用Ctrl+Enter组合, <c-cr>(大小写不区分)。但这个只有window下Gvim才可以用,linux的终端中用vim(测试的ubuntu)不行,
但参考下面的说明,xterm中(putty唤起的)中用vim,输入ctrl+enter(shift+enter也是),xterm收到的就是enter, 进而vim只收到enter。
https://unix.stackexchange.com/questions/166294/vim-x-terminal-key-mapping#:~:text=Other function keys should be mappable without any,to enable the mapping for every vim session.

这个问题虽然不行,但回答得很好。特别是如何确定自己在xterm中输入的是什么,可以用od -c命令。如ctrl-[输入得到的就是0x1b,表示的就是escape, 和敲escape键是一样的结果(可以到vim里面看)。

参考 https://vi.stackexchange.com/questions/15630/how-to-map-alt-enter
linux下AnyKey可以设置为<a-cr>,即ALT+Enter, 实际就是输入escape+enter。虽然用起来没ctrl+enter方便。