Выберите элемент в списке автозаполнения vim без вставки разрыва строки

22

Довольно раздражающей особенностью vim является то, что если вы находитесь в режиме вставки и выполняете автозаполнение (Ctrl-N), нажмите клавишу со стрелкой вниз до нужного элемента и нажмите клавишу Enter, затем он вставляет элемент, но также вставляет новую строку, которую вы затем придется удалить.

Есть ли способ выбрать элемент из списка автозаполнения, не получая дополнительный нежелательный перевод строки?

Тайлер Дурден
источник
1
Это не так, как у меня ... Я выбираю что-то, нажимаю Enter, и курсор все еще остается на той же строке после.
Златовласка

Ответы:

37

Это зависит от того, в каком состоянии всплывающего меню вы находитесь (см. :help popupmenu-completion). Из вашего вопроса я понимаю, что вы находитесь в состоянии 2 (так как вы нажали клавиши со стрелками, чтобы найти завершение). Однако поведение по умолчанию Enterв состоянии 2 - вставить завершение без перевода строки; обычно вы описываете поведение состояния 1 (когда вы используете Ctrl+ N/ Ctrl+ P.)

Способ, который работает последовательно во всех штатах, это использовать Ctrl+ Y. Мне нравится вспоминать «Y» как «да, прими это слово». Также можно просто начать печатать текст, который должен идти после завершенного слова, если вы не переназначили вещи, как в ответе geedoubleya.

В том же контексте вы можете нажать Ctrl+, Eчтобы отменить меню и оставить текст таким, каким он был до его вызова. Если вы привыкли к сочетаниям Ctrl+ Eи Ctrl+ Yв других контекстах (например, для прокрутки вверх или вниз в обычном режиме или для вставки символа ниже или выше курсора в режиме вставки), это один из способов запомнить это здесь. Я думаю, вы также можете думать об этом, как о «выходе» из меню или что-то подобное.

Смотрите :help popupmenu-keysбольше.

echristopherson
источник
2
Ах, это имеет смысл. Я использовал Ctrl-N, чтобы открыть раскрывающийся список. Я только что использовал клавиши со стрелками для навигации по выпадающему меню. Я не знал, что вы можете использовать клавиши со стрелками, чтобы открыть раскрывающийся список.
Тайлер Дерден
Клавиши со стрелками не могут открыть раскрывающийся список в конфигурации по умолчанию. Различие, которое я упомянул, касалось навигации по меню после его открытия.
Эхристоферсон
По какой-то причине, когда я попытался сделать это с помощью <kbd> Ctrl </ kbd> + <kbd> Y </ kbd>, он также отступил в строке, что нежелательно. Есть мысли о том, почему это произойдет?
mpacer 20.12.16
Я никогда не сталкивался с этим. Возможно, это связано с настройкой отступа или плагином, о котором вы забыли. Я хотел бы спросить в списке рассылки Vim: vim.org/maillist.php .
Эхристоферсон
6

Лично я использую это:

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, может найти это отображение удобным.

Dmitrii
источник
3

Я знаю, что это старый, но отчасти отвратительный ответ на ответ Гедублеи, поскольку, хотя ответ Эхристоферсона был информативным и удивительным, если кто-то хочет быстрого и грязного решения:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))
сойка
источник
2

В качестве альтернативы использованию клавиш со стрелками, используйте клавиши j& kдля прокрутки списка автозаполнения.

Это изменяет текущую строку в соответствии с выбранным словом при прокрутке.

Поэтому вам не нужно нажимать клавишу ввода, поскольку курсор находится в режиме вставки в конце замещенного слова.

Чтобы включить это, добавьте это в ваш .vimrc (Спасибо другим в stackoverflow):

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

Отдельно, вместо использования клавиш со стрелками, вы можете просто повторить то, Ctrl-nчто будет прокручивать опции ( Ctrl-pпереходить назад), и подставлять текущую строку по мере ее перемещения, без необходимости Enterотображений клавиш vim.

geedoubleya
источник
Такое поведение может быть немного запутанным, так как это 1) в режиме вставки и 2) интерпретация j и k для выполнения действий, которые они не выполняют в режиме вставки. В частности, вы не можете выбрать пункт меню и затем следовать за ним, начиная с чего-то, начинающегося с j или k.
Эхристоферсон
Согласился, поэтому я предоставил другой вариант, если это было слишком далеко. Лично я предпочел бы путаницу, а не двигать рукой, чтобы использовать стрелки.
geedoubleya