几个月前,我将
inoremap <down> <c-\><c-o>gj
和 inoremap <up> <c-\><c-o>gk
添加到我的 vimrc 文件中,以便在 vim 中设置 wrap
时方便编辑长行文件。
通过此重新映射,例如按
<down>
在插入模式下转到下一个屏幕行,无论它实际上是新行还是相同的换行行。
今天我意识到这会破坏完成选择,即当我在插入模式下键入
<CTRL-N>
来完成我刚刚键入的单词时,并且有多个可能的完成,会显示包含这些完成的列表。
无需重新映射,我可以(如
:help popupmenu-keys
中所述)使用<up>
和<down>
来遍历列表。重新映射后,这不再有效。
有没有办法两者兼得?
唯一包含
<C-\>
的插入模式命令是(来自 :help index
):
|i_CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode
|i_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode'
CTRL-\ a - z reserved for extensions
CTRL-\ others not used
所以我不确定单个
<C-\>
应该在您的映射中实现什么。没有它他们就能完美地完成工作:
inoremap <Down> <c-o>gj
inoremap <Up> <c-o>gk
现在,解决您描述的问题的传统方法是使插入模式映射成为“表达式映射”:
:help <expr>
。
inoremap <expr> <Down> pumvisible() ? "\<Down>" : "\<C-o>gj"
inoremap <expr> <Up> pumvisible() ? "\<Up>" : "\<C-o>gk"
所以……发生的情况是,当您在插入模式下按
<Down>
时,Vim 会检查完成菜单是否正在使用。如果是,则映射会产生 <Down>
。如果不是,映射会生成您想要的任何内容。
该模式通常用于覆盖
<Tab>
和其他键的行为。