Вставить несколько раз

96

Как лучше всего заменить несколько строк содержимым буфера обмена?

Проблема, с которой я сталкиваюсь, заключается в том, что когда я выдергиваю строку и вставляю ее поверх другой строки, «выдергивание» заменяется строкой, которую я только что заменил. Теперь, если я хочу заменить другую строку той же строкой, я должен вернуться и снова выдернуть ее.

Должен быть способ сделать это лучше.

Jwerre
источник

Ответы:

110

У меня это в моем .vimrc:

xnoremap p pgvy

(примечание: это будет работать только с регистром по умолчанию, но это сопоставление легко запомнить). Возможно создание более сложной версии. Кроме того, вы все еще можете использовать P, чтобы получить старое поведение.

Бенуа
источник
29
Умная. «p» для вставки, «gv» для повторного выбора того, что было выбрано изначально. 'y', чтобы скопировать его снова.
Амджит
@SibbsGambling, возможно, вы используете версию до Vim 7? Затем либо обновите Vim, либо используйте v вместо x ( vnoremap). В файле справки Vim version7.txtуказано, что в этой версии появились xmap и smap.
Бенуа
1
@Benoit Хм, у меня 7.4.52, но ни работает, xnoremapни vnoremapработает
Sibbs Gambling
8
Почему это не поведение по умолчанию ??
Сет,
27

"0должно быть содержимое вашего янк. Это немного утомительнее печатать, но вы "0pдолжны делать то, что хотите.

В качестве альтернативы не выбирайте и не заменяйте старые строки заранее. Если вы найдете эти строки с помощью поиска, просто нажимайте n.снова и снова (после инициала p), а затем, когда они все вставлены, сделайте, nddза которым следует столько n.s, сколько необходимо.

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

тире-бомж
источник
2
звучит как место, где регулярное выражение с :%s/.../.../gcкомандами типа подтверждения может быть ближе к тому, что вы хотите
Milimetric
@Milimetric +1 не знал, что вы можете это подтвердить.
1
Голосование за поддержку, потому что макросы могут решить эту проблему. Просто сделайте правку один раз, и вы сможете сделать что-то вроде 5@m(для макроса с именем m)
skatenerd
Спасибо за отличное объяснение. Теперь я использую xnoremap p "0pв своем ~ / .vimrc
nexayq 03
13

Я часто использую другой реестр, копирую нужную строку в какой-то именованный реестр, "ayа затем вставляю оттуда"ap

Факундо Каско
источник
11

Когда вы вставляете выделение в Vim, он заменяет регистр по умолчанию содержимым выделения. Если вставка выделенного фрагмента стирает содержимое регистра буфера обмена, то, скорее всего, в вашем .vimrc есть следующая строка

set clipboard=unnamed

Один из вариантов - удалить это и использовать явный регистр буфера обмена "+

Другой вариант - использовать любой из других явно названных регистров (az). После первой пасты вытащите леску, например, обратно, "cа затем используйте "cpдля вставки оттуда.

ДжаредПар
источник
На самом деле по умолчанию (здесь, в Ubuntu) было clipboard = autoselect; тем не менее, спасибо за самый элегантный ответ.
Tobu
8

используйте npгде n- это количество времени, в течение которого вы хотите вставить строки, например 3p, вставит 3 строки.

платить
источник
8
Не работает, если вы хотите вставить одну и ту же строку поверх несмежных строк.
Tobu
@Tobu, но он отвечает на заголовок этого вопроса «как вы вставляете несколько раз»
icc97
7

Вместо копирования / вставки часто лучше использовать команду текстового объекта, например, ciwдля изменения внутреннего слова. Преимущество этого метода заключается в том, что его легко .повторить с помощью команды повтора.

  1. yiw Подтвердите внутреннее слово (скопируйте слово под курсором, скажите "первое").
  2. ... Переместите курсор к другому слову (скажем, «второе»).
  3. ciw<C-r>0 Измените «второй», заменив его на «первый» (Ctrl-R).
  4. ... Переместите курсор к другому слову (скажем, "третье").
  5. . Измените «третий», заменив его «первым».
Джек Гуань
источник
1
ciw<C-r>0не работает в моем случае. ciwпереходит в режим вставки, где <C-r>становится бесполезным. Есть ли этому простое объяснение? Может ли это иметь отношение к текстовому редактору (я использую не pur VIM, а привязки клавиатуры VIM в RStudio)
Bushroot
@Bushroot <C-r>предназначен для использования в режиме вставки, так как это способ вставки из регистра, не выходя из режима вставки, то есть в Vim; Я не знаком с RStudio, но полагаю, что вы правы, и они не реализовали эту конкретную привязку клавиш.
insectean
@ Шон Х: Да. Они не реализовали привязку клавиш. Он отлично работает в VIM и даже с привязками VIM в других программах (например, Visual Studio Code).
Bushroot