Виберіть елемент у списку автоматичного заповнення vim, не вставляючи розрив рядка


22

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

Чи є спосіб вибрати елемент із списку автозаповнення без отримання додаткового небажаного нового рядка?


1
Це не так, як у мене це працює ... Я щось вибираю, натискаю Enter, і курсор все ще знаходиться на тому ж рядку.
goldilocks

Відповіді:


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докладніше.


2
А-ха, це має сенс. Я використовую Ctrl-N для відкриття спадного меню. Я щойно використовую клавіші зі стрілками для навігації у спадному меню. Я не знав, що ти можеш використовувати клавіші зі стрілками, щоб відкрити спадне меню.
Тайлер Дюрден

Клавіші зі стрілками не можуть відкрити спадне меню у конфігурації за замовчуванням. Відмінність, про яку я згадував, полягала в навігації по меню після його відкриття.
echristopherson

З якоїсь причини, коли я намагався зробити це за допомогою <kbd> Ctrl </kbd> + <kbd> Y </kbd>, він також відступив рядок, який є небажаним. Будь-які думки щодо того, чому це станеться?
mpacer

Я ніколи з цим не стикався. Можливо, це пов’язано з налаштуваннями відступу або плагіном, про який ви забули. Я б запитав про список розсилки 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, може визначити це відображення зручним.


3

Я знаю, що це стара, але якась скарбничка, яка спирається на відповідь Геодублея, оскільки, хоча відповідь Ехрістоферсона була інформативною та приголомшливою, якщо хтось хоче швидкого та брудного рішення:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))

2

Як альтернатива використанню клавіш зі стрілками, дозвольте клавішам 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 відображення ключів.


Така поведінка може бути трохи заплутаною, оскільки це одночасно: 1) у режимі вставки та 2) інтерпретація j та k для того, що вони не роблять у режимі вставки. Зокрема, ви не можете вибрати пункт меню, а потім слідувати за ним безпосередньо, починаючи з j або k.
echristopherson

Погодився, тому я запропонував інший варіант, якщо це був крок занадто далеко. Особисто я віддаю перевагу плутанині, а не рухаю рукою, щоб використовувати стрілки.
geedoubleya
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.