在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向後移動)並在移動時替換當前行,不需要Entervim 鍵映射。

相關內容