inoremap <up> 和 <down> 干扰完成选择

问题描述 投票:0回答:1

几个月前,我将

inoremap <down> <c-\><c-o>gj
inoremap <up> <c-\><c-o>gk
添加到我的 vimrc 文件中,以便在 vim 中设置
wrap
时方便编辑长行文件。

通过此重新映射,例如按

<down>
在插入模式下转到下一个屏幕行,无论它实际上是新行还是相同的换行行。

今天我意识到这会破坏完成选择,即当我在插入模式下键入

<CTRL-N>
来完成我刚刚键入的单词时,并且有多个可能的完成,会显示包含这些完成的列表。

无需重新映射,我可以(如

:help popupmenu-keys
中所述)使用
<up>
<down>
来遍历列表。重新映射后,这不再有效。

有没有办法两者兼得?

vim
1个回答
3
投票

唯一包含

<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>
和其他键的行为。

© www.soinside.com 2019 - 2024. All rights reserved.