Как мне отменить только вставленный текст в 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 для вставки в любом случае.
Джавид Джамае
Просто добавив это: :h i_CTRL-G_u(то есть, «прервать последовательность отмены, начать новое изменение» в режиме вставки).
Тораритт
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% совпадает с тем, что вы вводите вручную.

Фрукты
источник