Vim: заменить выделение буфером по умолчанию без перезаписи буфера

Вот моя проблема:

Я в визуальном режиме.

Я выделяю текст и копирую его в буфер. ((y) ank)

Я выбираю другой текст, который хочу заменить, и вставляю буфер. ((вставить)

Теперь второй выбор был заменен в буфере, однако я хочу, чтобы первый все еще оставался там.

Любые идеи?


person Juergen Riemer    schedule 01.10.2010    source источник
comment
Возможный дубликат Как выполнить вставку без перезаписи реестра   -  person kevinji    schedule 08.12.2018


Ответы (2)


Часто такое поведение бывает полезным. Если вам это не нужно, вы можете вместо этого выполнить обычное копирование, а затем вставить (официально «положить») с помощью " 0 p Вы можете делать это сколько угодно раз.

См. :help v_p для получения дополнительной информации.

Если вы хотите избежать перезаписи, вам нужно сначала удалить. Вы можете использовать "_ для выбора буфера черной дыры, затем удалить d, затем вставить перед P, и вы избежите установки буфера.

person Peter    schedule 01.10.2010
comment
Спасибо, Питер, я вижу, вы используете явный буфер, чтобы добиться цели. Есть ли способ / настройка, чтобы избежать автоматического заполнения буфера простым выбором в первую очередь? - person Juergen Riemer; 01.10.2010
comment
к сожалению, нет (см. упомянутую справку). Кроме того, настройку выполняет не выделение, а вставка поверх выделения. Однако я добавил к своему ответу альтернативный метод. - person Peter; 01.10.2010
comment
Понятно, тогда ваше первое предложение кажется лучшим способом сделать это. Спасибо! - person Juergen Riemer; 01.10.2010
comment
Вы можете сделать оба из них значениями по умолчанию, переназначив команду p в визуальном режиме. Первый вариант: vnoremap p "0p. При переходе в визуальный режим используется регистр 0 (самое последнее восстановление). Регистр unname все еще перезаписывается, но последующие операции ввода (в визуальном режиме) не используют его. Это означает, что вам нужно сначала дергать, удаление, а затем установка (в визуальном режиме) больше не работает. Второй вариант (ИМХО) лучше: vnoremap p "_dP и переназначает p, чтобы сначала удалить в регистр черной дыры, а затем выполнить нормальный ввод. Это должно быть именно то, о чем вы просите. - person Matthijs Kooijman; 09.07.2017
comment
Я никогда не считал полезным поведение vim по умолчанию. пут не должен быть копией и поставлен. - person stimulate; 09.07.2018
comment
@stimulate Похоже, ваша настоящая проблема заключается в том, что удаление на самом деле вырезано. Линия должна куда-то идти! - person preferred_anon; 18.03.2019
comment
@preferred_anon нет, когда вы что-то копируете (или дергаете), а затем выбираете что-то другое и заменяете это на p (вставляя то, что вы скопировали), p также заменит то, что вы скопировали ранее, тем, что вы заменяете. Итак, чтобы заменить несколько мест одним и тем же, вам нужно удалить каждое место в регистр void с помощью _d, а затем вы можете вставить его с помощью p. Но p следует просто вставить imho, если вы хотите скопировать раньше, вы должны просто скопировать раньше. Линия не должна никуда уходить, если я ее заменяю. - person stimulate; 18.03.2019
comment
@stimulate Это именно моя точка зрения: в vim удаление чего-либо всегда копирует то, что вы удалили. Нажатие p в визуальном режиме удаляет выделенный текст, и это делается по умолчанию: путем вырезания. Я пытаюсь сказать, что v_p не получил какое-то странное патологическое поведение, несмотря на обычное интуитивное удаление vim - ему было дано поведение по умолчанию в соответствии с тем, что d и x делают везде (и это то, что вам, кажется, не нравится) - person preferred_anon; 18.03.2019
comment
@preferred_anon Да, я хочу сказать, что это несколько противоречит мнемоническому качеству команд. Но есть много других случаев, когда горячие клавиши делают что-то еще, кроме того, что они называются. Несмотря на то, что c действительно режет, причина, по которой вы используете его вместо d (который фактически выполняет резку), заключается в том, что он переходит непосредственно в режим вставки. Таким образом, он фактически вырезан и вставлен, а d на самом деле вырезан. _d - удалить. Я привык, но могу представить, что мы могли бы добиться большего ... - person stimulate; 18.03.2019
comment
@stimulate Я определенно сочувствую этому. Одна вещь, которая может помочь вам с c: он должен обозначать change, поэтому впоследствии он переводит вас в режим вставки. - person preferred_anon; 18.03.2019
comment
Здорово. Спасибо. - person Pasha; 14.09.2019

Хотя это технически не отвечает на вопрос (без использования буфера по умолчанию), но все же решает симптом проблемы, поэтому я подумал, что все равно поделюсь. Я обхожу эту проблему путем решения другой проблемы.

Я сопоставил «Копировать, вставить» (скопировать, вставить) из системного буфера обмена в «Ctrl-Shift-C, Ctrl-Shift-V» (Ctrl-C, Ctrl-V, если включен Caps Lock). Его можно использовать вместо y с тем же эффектом.

Если я использую системный буфер для копирования, он не перезаписывается при вставке.

Я добавил это в свой .vimrc

vnoremap <C-V> "*p 
vnoremap <C-C> "*y

В качестве бонуса это даст вам легкий доступ к системному буферу обмена.

person scorch855    schedule 18.06.2020