Як я можу скасувати вставлений текст у форматі vim?


10

TL; DR; версія - Як скасувати текст, який було вставлено з мого буфера копії ОС, не скасовуючи інший текст, який було набрано з моменту переходу в режим вставки?

Більший опис:

  1. Покладіть щось у буфер для копіювання ОС (наприклад, виділіть текст і виконайте це Command-cна Mac)
  2. Перейдіть у режим вставки в vim ( i)
  3. Наберіть щось (наприклад asdf)
  4. Не виходячи з режиму вставки, вставити з буфера копіювання в vim ( Command-vна Mac)
  5. Удар escape
  6. Спробуйте скасувати пасту ( u)

Це скасовує все, коли ви востаннє перейшли у режим вставки. Іншими словами, він очищає asdfплюс весь текст, який я вставив.

Як мені просто скасувати текст, який вставлено? Чи потрібно завжди виходити з режиму вставки та назад, перш ніж вставляти текст, щоб мати можливість скасувати вставлений текст?

Відповіді:


4

Одним із способів є явне випадання та повернення в режим вставки перед вставкою. Якщо ви продовжите команди вставки, ви також можете автоматично встановити точку скасування перед вставкою:

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

Сказане вище для вбудованої i_CTRL-Rкоманди. Я не знаю , як Command-vце реалізовано в MacVim, але випереджаючи <C-G>uдо :imapкоманді повинні досягти того ж ефекту.


1
Працює як шарм, дякую! Я, мабуть, повинен дотримуватися стандартних методів vim для скріплення.
Javid Jamae

Просто додавши це: :h i_CTRL-G_u(тобто "перервати послідовність скасування, почати нову зміну" в режимі вставки).
toraritte

2

У MacVim вам потрібно зняти карту з Edit > Pasteпункту меню, щоб змінити ярлик, і тоді ви можете перезаписати Cmd-V ( D-vна мові MacVim) у відповідну команду в кожному режимі. Я додав це до свого, ~/.gvimrcі тепер усе чудово працює:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

<C-g>uНеобхідно тільки в режимі вставки , щоб виправити історію скасування; noremapі cnoremapпросто відновити поведінка за умовчанням вставити в нормальних і командних режимах.

Дякую Інго Каркат за те, що тут спрямував мене в правильному напрямку.


1

Насправді рішення полягає в тому, що вам потрібно спочатку перейти в командний режим (наприклад Esc) і знову перейти в режим вставки, але він працює лише в тому випадку, якщо я набираю вручну, але, здається, "випадково" перестати працювати, якщо перевіряю його ~/.vimrc. Google взагалі не допомагає.

Я витрачаю багато часу, намагаючись виправити це питання, і я просто з'ясовував причину в моєму випадку:

Не поєднуйте ключ вставлення однаково з існуючим термінальним ключем

наприклад , Ctrl+Shift+Vвставить в моєму терміналі Konsole, але якщо я призначаю цей ключ <C-S-v>в ~/.vimrc, то «скасування для тільки однієї пасти замість кількох паст» не працюватиме.

У моєму випадку я повинен використовувати <C-v>замість <C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

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

Я на 100% довів цей висновок, встановивши свій термінальний ключ вставки Ctrl+Vта <C-v>перестав працювати, але <C-S-v>працювати.

Зауважте також, що vim занадто чутливий і дивний. Я зрозумів, що я повинен використовувати, iа потім 2 праві клавіші вручну, щоб він працював у правильному положенні курсору, це означає, що я повинен також поставити iі 2 праві клавіші ~/.vimrcтеж. Ваша справа може відрізнятися, але справа в тому ж, переконайтеся, що ключі + порядок у ~ / .vimrc на 100% відповідають тому, що ви вводите вручну.

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