Выберите элемент в списке автозаполнения 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+ 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.

Связанный контент