За замовчуванням команди вставки використовують "
реєстр ("без імені") . Ефективно, будь-яка команда, яка записує в регістр, також пише в неіменований реєстр, тому янки, видалення та зміни на них впливають. Ось чому ваша послідовність yank-delete-paste вставляє видалений текст замість викрученого тексту.
Тут може допомогти 0
реєстр . Будь-які команди yank, які не вказують реєстр, ставлять текст, що перетягується, у реєстр 0
(крім "
). На це не впливають операції видалення або зміни, тому ви можете використовувати його для вставки декількох разів викресленої лінії, навіть якщо ви робите проміжні видалення або зміни.
yy
: Регістри 0
і "
обидва тепер мають випрямлену лінію.
- Перейдіть на лінію для заміни.
dd
: Реєстрація "
тепер має видалений рядок, але реєстр 0
все ще має викреслену лінію.
"0P
: Вставте з регістра первісно витягнуту лінію 0
.
- Перейдіть до наступного рядка для заміни.
dd"0P
(само, як і вище)
(Через те, як працює позиціонування курсору під час заміни останнього рядка буфера, ви хочете використовувати "0p
замість "0P
.)
Це дуже близько до відповіді Брюса Едігера , за винятком того, що вам не доведеться вказувати реєстр при первинному похованні. Використання одного або декількох іменованих регістрів може бути дуже зручним, хоча якщо вам потрібно (наприклад) замінити деякі рядки на AAA
, а інші рядки на BBB
(поставити AAA
в регістр a
і BBB
в регістр b
(або залишити один з них в реєстрі 0
), а потім вставити їх відповідно ).
Ви також можете вставити в 0
в візуальному режимі лінійного мудрий ( V
) , щоб зберегти натискання клавіші: V"0p
.
Якщо вам не подобається вводити "0
, ви можете знайти зручніше картування:
noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p
Альтернативний підхід - це видалення до _
регістра ("чорний отвір") . Коли ви видаляєте до нього, на "
реєстр це не впливає, тому ваша послідовність yank-delete-paste все ще може вставити вирваний текст з безіменного регістра.
yy
: Зареєструйтесь, 0
і "
обидва тепер мають витягнуту лінію.
"_dd
: Ніяких змін до регістрів.
P
: Вставте з реєстру оригінально витягнутий текст "
.
Знову, вам може бути зручніше відображення:
noremap <Leader>d "_d
yy
(перехід до рядка, який потрібно замінити)S<C-r>0<Esc>
. Має перевагу повторюваність за допомогою.
команди.