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

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

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

有没有办法从自动完成列表中选择一个项目,而不会获得额外的不需要的换行符?

答案1

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

在所有状态下一致工作的一种方法是使用Ctrl+ Y。我喜欢记住 Y 代表“是的,接受这个词”。也可以直接开始输入完整单词之后的文本,除非您已经像 geedoubleya 的答案中那样重新映射了内容。

在相同的上下文中,您可以按Ctrl+E取消菜单并保留调用菜单之前的文本。如果您习惯于在其他上下文中使用Ctrl+ECtrl+配对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 键映射。

相关内容