在vim自动完成列表中选择一个项目而不插入换行符


22

vim的一个相当烦人的功能是,如果您处于插入模式并执行自动完成(Ctrl-N),则将箭头键向下移至所需项目,然后按Enter键,然后它将插入该项目,但还会插入一个换行符然后必须删除。

有没有一种方法可以从自动完成列表中选择一个项目而又不需要其他多余的换行符?


1
这对我来说不是这样...我选择了一些内容,按Enter键,然后光标仍然在同一行上。
goldilocks 2014年

Answers:


37

这取决于您所处的弹出菜单状态(请参阅参考资料:help popupmenu-completion)。我从您的问题中了解到您处于状态2(因为您已按箭头键来查找完成)。但是,Enter状态2 的默认行为是插入不带换行符的完成。您所描述的通常是状态1的行为(即使用Ctrl+ N/ Ctrl+ 时的状态P)。

在所有状态下始终有效的一种方式是使用Ctrl+ Y。我喜欢记住Y代表“是的,接受这个词”。除非您已按照geedoubleya的回答重新映射了内容,否则也可以只开始输入完成词后的文本。

在相同的上下文中,您可以按Ctrl+ E取消菜单,并使文本保持调用前的状态。如果您在其他情况下习惯了Ctrl+ ECtrl+ 的配对Y(例如,在正常模式下向上或向下滚动,或在插入模式下将字符插入光标下方或上方),这是在此处记住它的一种方法。我想您也可以将其视为“退出”菜单或类似菜单。

查看:help popupmenu-keys更多。


2
啊哈,那是有道理的。我一直在使用Ctrl-N打开下拉列表。我一直在使用箭头键浏览下拉菜单。我不知道您可以使用箭头键打开下拉菜单。
泰勒·迪尔登

在默认配置下,箭头键无法打开下拉菜单。我提到的区别是打开菜单后导航菜单。
echristopherson

由于某些原因,当我尝试使用<kbd> Ctrl </ kbd> + <kbd> Y </ kbd>进行此操作时,它还会缩进该行,这是不希望的。有什么想法为什么会发生?
mpacer

我从来没有遇到过。也许是由于某些缩进设置或您忘记的插件所致。我会问Vim的邮件列表:vim.org/maillist.php
echristopherson '16

6

我个人使用这个:

inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"

使用CtrlP插件的任何人都可能会发现此映射很方便。


3

我知道这是古老的,但还是有点支持geedoubleya的答案,因为尽管echristopherson的答案内容丰富而且棒极了,但是如果有人想要一种快速而又肮脏的解决方案:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))

2

作为使用箭头键的替代方法,请使jk键在自动完成列表中滚动。

这样做会更改当前行,以在滚动时匹配所选单词。

因此,您不必按Enter键,因为光标在替换单词的末尾仍处于插入模式。

要启用此功能,请将其添加到您的.vimrc中(感谢stackoverflow上的其他人):

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

另外,也可以不重复使用箭头键,而只需重复该操作Ctrl-n,即可通过选项Ctrl-p进行诅咒(向后移动)并在当前行移动时替代当前行,而无需使用Enter或vim键映射。


这种行为可能会造成一些混乱,因为它是1)在插入模式下和2)解释j和k来执行在插入模式下不执行的操作。特别是,您不能选择菜单项,然后直接以j或k开头。
echristopherson

同意,这就是为什么我提供了另一个选择的原因,如果这距离太远了。就个人而言,我宁愿混淆,也不愿动手使用箭头。
geedoubleya 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.