Як замінити внутрішній текст на витягнутий текст


17

Шаблон редагування, до якого я часто стикаюся, полягає в наступному: я хочу витягнути фрагмент тексту всередині лапок або дужок і замінити цей фрагмент тексту всередині іншої пари лапок / дужок.

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

<span class="foo bar">

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

Що я знаю, це таке: Якщо я переміщуся всередину класу прольоту, я використовую текст, yi"щоб витягнути цитати.

Тепер у мене це є в моєму реєстрі, тому я повинен мати можливість замінити вміст класу div на нього. Але я не можу знайти зручний спосіб зробити це.

Якщо я використовую ciwце, в результаті закінчується перезапис мого реєстру зі змістом, щоб змінити його, тому я втрачаю текст, який витягнув.

Найкраще, що я можу придумати, - це перейти до першої цитати класу діва p, натиснувши , а потім видалити до наступної цитати dt".

Зазвичай я викручую свою позицію, і я вставляю її десь усередині цитат, що об'єднують дві струни, і це псує речі.

Я сподіваюся, що є якийсь спосіб зробити комбінацію "замінити внутрішній текст моїм зірваним вмістом, будь ласка", щоб зробити це простіше.

Відповіді:


19

Ви можете використовувати, vi"pколи всередині "". Це може замінити текст у реєстрі, а це важливо, коли ви хочете використовувати оригінальний текст, що витягується, не один раз.

EDIT : Додаткова інформація від коментаря Octaviour про те, щоб зробити його багаторазовим використання більше:

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


2
Я докладно зупинюсь на цьому рішенні. Ви спочатку дістаєте текст, який хочете скопіювати. Потім ви переходите до місця, яке ви хочете вставити, візуально вибираючи за допомогою vi ". Команда вставки тепер одночасно помістить вміст неназваного реєстру на курсор і видалить вибраний текст. Тому vi" p виконує саме те, що ви хочете, але він замінює вміст реєстру без назви, забороняючи вам вставляти один і той же текст двічі. Для цього я б попросив до іменного реєстру, який складає дві команди: "ayi" та vi "" ap, якщо ви використовуєте register a.
Октавіор

Дякуємо за детальну розробку. Це допомагає викласти речі за допомогою vim-рухів, полегшує запам'ятовування згодом. Це все ще не так просто, як я сподівався, що це буде, але це має сенс по-винному. Використання команди точки для повторення та швидкої заміни вдруге, здається, не працює. Я сподівався, що це буде ярлик. :)
jurgenb

11

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

Дивіться :h i_CTRL-Rопис останньої частини.


2
Чому б не просто покласти його в безіменний реєстр ( yi") та вставити його з реєстру, 0де він зберігається після того, як ви видалили текст для зміни ( ci"<c-r>0)? За умови vimgolf ви виграєте 2 натискання клавіш, і не заплутаєтесь у своїх регістрах.
statox

як тільки я натиснув "a", я перебуваю в режимі редагування, однак це не копіюється в реєстр
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.)


Я думаю, що для цього вам потрібна велика літера P. Коли ви di"курсор буде залишений на останніх лапках і pбуде вставлено після, де як Pбуде вставлено перед поточною позицією.
jecxjo

@jecxjo Правильно, я відредагував свою відповідь, дякую!
statox

8

Мені це потрібно часто, я написав плагін, щоб спростити та дозволити максимальну швидкість: ReplaceWithRegister .

Цей плагін пропонує grкоманду « два в одному», яка замінює текст, охоплений об’єктом {motion} / текст, цілими рядками або поточним виділенням вмістом регістра; старий текст видаляється в регістр чорних дір, тобто його немає. Він прозоро обробляє багато кутових справ і дозволяє швидко повторити за допомогою стандартної .команди. Якщо вам це не подобається, на його сторінці є посилання на альтернативи.


Чудово! Це має бути ванільний вим.
Philipp Moers
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.