Как заменить внутренний текст восстановленным текстом

17

Шаблон редактирования, с которым я часто сталкиваюсь, заключается в следующем: я хочу вставить фрагмент текста в кавычки или скобки и заменить этот фрагмент текста в другой паре кавычек / скобок.

Например, если я хочу скопировать имя класса foo barи вставить его в другое место:

<span class="foo bar">

<div class="this-should-be-replaced-with-foo-and-bar">

Что я знаю, так это: если я перемещаюсь внутри класса диапазона, я использую, yi"чтобы вытянуть текст внутри кавычек.

Теперь у меня есть это в моем реестре, поэтому я должен иметь возможность заменить содержимое класса div на него. Но я не могу найти удобный способ сделать это.

Если я использую ciwэто, это приводит к тому, что мой регистр перезаписывается содержимым для изменения, поэтому я теряю свой выдернутый текст.

Лучшее, что я могу придумать, это перейти к первой цитате класса div, нажать p, а затем удалить до следующей цитаты dt".

Хотя обычно я облажаю свою позицию и вставляю ее где-то внутри кавычек, объединяющих две строки, и это все портит.

Я надеюсь, что есть какой-нибудь способ сделать комбинацию «замените внутренний текст на мой контент, пожалуйста», чтобы сделать это проще.

jurgenb
источник

Ответы:

19

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

РЕДАКТИРОВАТЬ : Дополнительная информация из комментария Octaviour о том, чтобы сделать его многоразовым более одного раза:

Для этого я бы дернул в именованный регистр, который делает две команды: "ayi"и, и vi""apесли вы используете регистр a.

grodzik
источник
2
Я подробно остановлюсь на этом решении. Сначала вы дергаете текст, который хотите скопировать. Затем вы идете в место, которое вы хотите вставить, визуально выбирая с помощью vi ". Команда вставки теперь одновременно поместит содержимое безымянного регистра в курсор и удалит выделенный текст. Поэтому vi" p выполняет именно то, что вы хотите, но он заменяет содержимое безымянного регистра, не позволяя вам вставить один и тот же текст дважды. Чтобы сделать это, я бы дернул к именованному регистру, который делает две команды: "ayi" и и vi "" ap, если вы используете регистр a.
Октябрь
Спасибо за разработку. Это помогает разобрать вещи с движениями vim, это облегчает запоминание потом. Это все еще не так просто, как я надеялся, но это имеет смысл в духе. Использование команды dot для повторения и быстрой замены во второй раз, похоже, не работает. Я надеялся, что это будет быстрый путь. :)
Юргенб
11

Вы можете использовать пронумерованный регистр. Сначала дерните "foo-bar" с yi", который заполнит "0регистр, см :h "0. Затем сделать ci"<c-r>0для замены содержимого регистра 0.

Смотрите :h i_CTRL-Rописание последней части.

Карл Ингве Лерваг
источник
2
Почему бы просто не вернуть его в безымянный register ( yi") и вставить его из реестра, в 0котором он хранится, после удаления текста в change ( ci"<c-r>0)? В терминах vimgolf вы выигрываете 2 нажатия клавиш и не путаетесь со своими регистрами.
statox
как только я нажимаю «а», я оказываюсь в режиме редактирования, но это не копирует в регистр
jurgenb
@ n3wjack Это, наверное, потому что ты не нажимал CTRL+rраньше a, вот что <c-r>значит.
statox
1
@ KarlYngveLervåg На самом деле удаляет ciwудаленный текст в неназванный регистр, но регистры сдвигаются, поэтому вы должны использовать <c-r>0вместо <c-r>". См :h quote_number.
statox
1
В частности, я бы подумал, что здесь речь идет не о неназванном регистре, а о пронумерованном регистре. "0Регистр заполняется только командой копирования.Имя и не будет нарушена , например c.
Карл Ингве Лервог,
9

Вот еще одно решение. Это не лучший в терминах Vimgolf, но он использует регистр черной дыры:

После того, как foo barвы натянете веревку, вы можете потянуть ее, как обычно yi".

Тогда внутри скобок поменять: "_di"P

Который:

"_       We will use the black hole register
di"      Delete the inner brackets and put the deleted text in the black hole register
P        Put the previously yanked text

Преимущество регистра черной дыры состоит в том, что он не испортит ваши другие регистры. Смотрите :h quote_для более подробной информации.

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

statox
источник
Я думаю, что вам нужно заглавные буквы Pдля этого. При наведении di"ваш курсор останется на последних кавычках и pбудет вставлен после, где as Pбудет вставлен перед текущей позицией.
Jecxjo
@jecxjo Правильно, я отредактировал свой ответ, спасибо!
statox
8

Мне нужно это так часто, я написал плагин для упрощения и обеспечения максимальной скорости: ReplaceWithRegister .

Этот плагин предлагает grкоманду « два в одном», которая заменяет текст, охватываемый объектом {motion} / text, всей строкой (ами) или текущим выделением, содержимым регистра; старый текст удаляется в регистр черной дыры, т.е. Он прозрачно обрабатывает многие угловые случаи и позволяет быстро повторить с помощью стандартной .команды. Если вам это не нравится, на его странице есть ссылки на альтернативы.

Инго Каркат
источник
Большой! Это должно быть ванильным vim.
Филипп Мёрс