vim的一个相当烦人的功能是,如果您处于插入模式并执行自动完成(Ctrl-N),则将箭头键向下移至所需项目,然后按Enter键,然后它将插入该项目,但还会插入一个换行符然后必须删除。
有没有一种方法可以从自动完成列表中选择一个项目而又不需要其他多余的换行符?
vim的一个相当烦人的功能是,如果您处于插入模式并执行自动完成(Ctrl-N),则将箭头键向下移至所需项目,然后按Enter键,然后它将插入该项目,但还会插入一个换行符然后必须删除。
有没有一种方法可以从自动完成列表中选择一个项目而又不需要其他多余的换行符?
Answers:
这取决于您所处的弹出菜单状态(请参阅参考资料:help popupmenu-completion
)。我从您的问题中了解到您处于状态2(因为您已按箭头键来查找完成)。但是,Enter状态2 的默认行为是插入不带换行符的完成。您所描述的通常是状态1的行为(即使用Ctrl+ N/ Ctrl+ 时的状态P)。
在所有状态下始终有效的一种方式是使用Ctrl+ Y。我喜欢记住Y代表“是的,接受这个词”。除非您已按照geedoubleya的回答重新映射了内容,否则也可以只开始输入完成词后的文本。
在相同的上下文中,您可以按Ctrl+ E取消菜单,并使文本保持调用前的状态。如果您在其他情况下习惯了Ctrl+ E和Ctrl+ 的配对Y(例如,在正常模式下向上或向下滚动,或在插入模式下将字符插入光标下方或上方),这是在此处记住它的一种方法。我想您也可以将其视为“退出”菜单或类似菜单。
查看:help popupmenu-keys
更多。
作为使用箭头键的替代方法,请使j
&k
键在自动完成列表中滚动。
这样做会更改当前行,以在滚动时匹配所选单词。
因此,您不必按Enter键,因为光标在替换单词的末尾仍处于插入模式。
要启用此功能,请将其添加到您的.vimrc中(感谢stackoverflow上的其他人):
inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))
另外,也可以不重复使用箭头键,而只需重复该操作Ctrl-n
,即可通过选项Ctrl-p
进行诅咒(向后移动)并在当前行移动时替代当前行,而无需使用Enter
或vim键映射。