Отменить вставку без отмены предыдущего набора

В vim я часто отменяю больше, чем хочу, после того, как неправильно вставил из системного буфера обмена. Есть ли способ лучше?

Воспроизвести:

Open iTerm      # or terminal
vi              # open vim
i               # enter insert mode
type some stuff
Cmd-V           # paste the contents of the OS X clipboard

Паста - беспорядок, потому что у меня нет :set paste. Так

Esc # enter command mode
u   # undo

но это отменяет мой набор текста, а также мою пасту.

Могу ли я использовать другую отмену? Помимо запоминания :set paste перед вставкой, есть ли вообще лучший способ сделать это?


person Thomas David Baker    schedule 11.11.2015    source источник
comment
В зависимости от терминала вы используете режим вставки в скобках для автоматической установки вставки. stackoverflow.com/a/7053522/1890567   -  person FDinoff    schedule 11.11.2015
comment
Когда это происходит со мной, я выбираю вставленный текст и форматирую его (нажмите '=' в escape-режиме).   -  person Diego Pino    schedule 11.11.2015


Ответы (5)


Это не тот ответ, который вы ищете, но вам действительно следует прекратить использовать vim в качестве немодального редактора. Если вы хотите вставить, вернитесь в нормальный режим и используйте команды вставки vim. Предполагая, что у вас есть версия vim с доступом к буферу обмена, это должно помочь "+p. Вы также можете облегчить это, установив свой безымянный регистр как регистр + (или *), так что вставка из буфера обмена становится простой p.

На следующий вопрос есть отличный ответ, включающий всю эту информацию Как вставить vim из системного буфера обмена (и скопировать в него)?.

person Vitor    schedule 11.11.2015
comment
О нет, определенно ищу изменения в своих привычках для получения отличных ответов, вот как исправить пластырь. Спасибо! - person Thomas David Baker; 11.11.2015
comment
По-настоящему важным здесь было получение копии vim с компилированной опцией + clipboard. (Затем вы можете установить clipboard = un named в .vimrc и поделиться системным буфером обмена.) - person Thomas David Baker; 11.11.2015

Я не уверен, что вы можете что-то сделать постфактум, но одно из решений - нажать Ctrl-G u в режиме вставки непосредственно перед вставкой. Это разбивает блок отмены на два отдельных блока, поэтому вставка будет запомнена как отдельное отменяемое действие.

Конечно, если вам нужно помнить об этом, вы можете просто использовать вместо этого :set paste - но с другой стороны, это меньше нажатий клавиш, и вам не нужно сначала переходить в командный режим.

person Jeen Broekstra    schedule 11.11.2015

Взгляните на этот плагин, он может автоматически запускаться :set paste! при использовании Cmd -V (или Ctrl-V), чтобы вставить текст. По завершении выйдите из режима вставки.

person Casimir Crystal    schedule 11.11.2015

Следующие сопоставления создают дополнительную точку отмены (через :help i_CTRL-G_u) перед вставкой в ​​режиме вставки. Таким образом, вы можете отклеить пасту отдельно.

inoremap <C-r> <C-g>u<C-r>
inoremap <C-v> <C-g>u<C-v>
person Ingo Karkat    schedule 11.11.2015
comment
На самом деле это не работает. Возможно, это связано с функциями, с которыми скомпилирован мой vim? - person Thomas David Baker; 11.11.2015
comment
У меня есть первое отображение. Я не уверен насчет команды-V на Mac; это может быть само отображение. Работает ли, если вы явно набираете <C-g>u перед вставкой? - person Ingo Karkat; 11.11.2015
comment
Да. Думаю, я просто не подбираю правильно Cmd-v. Я попробовал ‹D-v› после того, как погуглил, но это тоже не сработало. - person Thomas David Baker; 12.11.2015

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

Я трачу много времени, пытаясь исправить эту проблему, и просто выясняю причину в моем случае:

Не сопоставляйте ключ вставки с существующим ключом вставки терминала

например 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% совпадают с тем, что вы вводите вручную.

person Fruit    schedule 21.01.2018