vim 的一个相当烦人的功能是,如果您处于插入模式并执行自动完成(Ctrl-N),向下箭头键到所需的项目,然后按 Enter 键,那么它会插入该项目,但也会插入您需要的换行符。然后必须删除。
有没有办法从自动完成列表中选择一个项目,而不会获得额外的不需要的换行符?
答案1
这取决于您所处的弹出菜单状态(请参阅:help popupmenu-completion
)。我从你的问题中了解到你处于状态 2(因为你已按箭头键找到完成)。然而,Enter状态 2的默认行为是插入不带换行符的补全;您所描述的通常是状态 1 的行为(即当您使用Ctrl+ N/ Ctrl+时P。)
在所有状态下一致工作的一种方法是使用Ctrl+ Y。我喜欢记住 Y 代表“是的,接受这个词”。也可以直接开始输入完整单词之后的文本,除非您已经像 geedoubleya 的答案中那样重新映射了内容。
在相同的上下文中,您可以按Ctrl+E取消菜单并保留调用菜单之前的文本。如果您习惯于在其他上下文中使用Ctrl+E和Ctrl+配对Y(例如,在正常模式下向上或向下滚动,或者在插入模式下在光标下方或上方插入字符),这是在这里记住它的一种方法。我想您也可以将其视为“退出”菜单或类似内容。
查看:help popupmenu-keys
更多。
答案2
我个人使用这个:
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>"))
答案4
作为使用箭头键的替代方法,可以使用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 键映射。