使用'j'和'k'键进行Vim单词自动完成和导航

15

在 vim 中,我在插入模式下使用 Ctrl-n 进行单词自动完成。如果有多个可能的匹配项,我将会得到一个下拉菜单,可以使用箭头键选择其中一项。

然而,我不想使用箭头键;我想使用 'j' 和 'k' 键。但是当我输入 'j' 或 'k' 时,它会插入这些字母而不是在下拉菜单中向上或向下移动。有没有办法可以配置 vim 让我按照自己的方式操作呢?


简短的旁白:几年后,我的vim工作流已经不需要进行这种定制了。我更愿意让vim成为一个我可以在任何地方使用的编辑器,包括随机的Linux服务器和其他人的机器。为此,我只使用默认的键绑定。对于更多自定义的东西,我使用emacs。 - kerkeslager
3个回答

22

参见:hpopupmenu-keys.

弹出菜单子模式没有特别的映射集,但你可以创建一个有条件的插入模式映射:

inoremap <expr> j pumvisible() ? "\<C-N>" : "j"
inoremap <expr> k pumvisible() ? "\<C-P>" : "k"

这将使得j/k在弹出菜单可见时像使用<C-N>/<C-P>一样进行导航。

附加说明:如果你想在按下 jk 时同时按住 control 键,你可以分别将它们替换为 <C-J><C-K>。(参见 mwcz 在此答案的评论。)


4
使用这种方法时可能会遇到的问题是,在调用完成菜单后,用户可能希望继续输入,并且想要输入的字母是“j”或“k”。需要了解这种情况可能引起的后果,以便在未来出现问题时知道应该怎么办。 - tinifni
4
你可以使用 <C-v>j<C-v>k 来完成它。 - ZyX
5
既然您已经按下了Ctrl键,我发现在浏览列表时使用C-jC-k很方便,并且在列表打开时不会干扰继续输入的操作: inoremap <expr> <C-j> pumvisible() ? "\<C-N>" : "\<C-j>"inoremap <expr> <C-k> pumvisible() ? "\<C-P>" : "\<C-k>" - mwcz
1
@Pi Delport:由于给定的原因,mwcz的解决方案更加合适。我会调整这个解决方案,以便人们可以轻松地使用它。 - Frank-Rene Schäfer
好的建议!我在答案中记下了mwcz的解决方案。(然而,我不想改变主要答案,因为问题明确要求使用jk。) - Pi Delport
@Pi Delport:不过,在结尾处添加一条友好的注释,比如易于复制粘贴的内容,会很有帮助。每次我需要设置新的 .vimrc 文件时,我都会回到这个问题上。 - Frank-Rene Schäfer

10

我不知道如何使用jk做到这一点。 当您处于插入模式时,它们无法正常工作。

但是,我有另一种方法可以帮助您,Ctrl+N与Tab键的作用相同,您可以使用Shift-Tab向下滚动列表并使用Tab键向上滚动。 这比使用箭头键更容易。 但不如jk舒服。

或者您可以直接使用Ctrl+NCtrl+P


1
这是停止使用箭头键的最简单方法,即使它不是j或k。 - Rakib Fiha

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接