Як я можу вставити (перезаписати) vim?


31

В vimЯ використовую yyі pвесь час смикати і вставити рядки. Однак якщо я хочу замінити один рядок декількома місцями у файлі, я не можу його використовувати, yy p dd pоскільки dd видаляє рядок у буфер обміну / регістр. Хоча я, мабуть, повинен знати, як краще використовувати регістри, я відчуваю, що, мабуть, існує спосіб, pякий замінить поточний рядок.

Відповіді:


27

За замовчуванням команди вставки використовують "реєстр ("без імені") . Ефективно, будь-яка команда, яка записує в регістр, також пише в неіменований реєстр, тому янки, видалення та зміни на них впливають. Ось чому ваша послідовність yank-delete-paste вставляє видалений текст замість викрученого тексту.

Тут може допомогти 0реєстр . Будь-які команди yank, які не вказують реєстр, ставлять текст, що перетягується, у реєстр 0(крім "). На це не впливають операції видалення або зміни, тому ви можете використовувати його для вставки декількох разів викресленої лінії, навіть якщо ви робите проміжні видалення або зміни.

  1. yy: Регістри 0і "обидва тепер мають випрямлену лінію.
  2. Перейдіть на лінію для заміни.
  3. dd: Реєстрація "тепер має видалений рядок, але реєстр 0все ще має викреслену лінію.
    "0P: Вставте з регістра первісно витягнуту лінію 0.
  4. Перейдіть до наступного рядка для заміни.
  5. 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 все ще може вставити вирваний текст з безіменного регістра.

  1. yy: Зареєструйтесь, 0і "обидва тепер мають витягнуту лінію.
  2. "_dd: Ніяких змін до регістрів.
    P: Вставте з реєстру оригінально витягнутий текст ".

Знову, вам може бути зручніше відображення:

noremap <Leader>d "_d

2
Або, tl; dr, просто використовуйте yy(перехід до рядка, який потрібно замінити) S<C-r>0<Esc>. Має перевагу повторюваність за допомогою .команди.
Wildcard

11

Схоже, у Кевіна є досить гарна відповідь, але якщо ви хочете закласти очі на кожен видалений рядок, то замініть, існує трохи інше рішення.

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

Цей рецепт дозволяє використовувати відповідність шаблонів для пошуку рядків для видалення та заміни, і ви можете повернутися до початку файлу (1G) і шукати вперед так часто, як вам подобається. Якщо у мене є 2 або більше рядків для збору та розміщення повторно, я використовую "ayyдля першого рядка, "byyдля другого, "cyyдля третього і так далі. Я зробив звичку (що зменшує загальність рецепту) зменшити розумове навантаження на мене.


Дуже хороша. Тож якщо я використовую "ayyі потім dd, ddне замінюватиме те, що є a, але якщо я введу, pвін вставить те, що тільки що було видалено за допомогою dd. І якби я хотів замінити те, що є, на "ayyте, що я видаляю, то я би використав "add- чи правильно це?
cwd

"ayy копіює рядок в регістр" a "." dd "скорочує рядок до регістру за замовчуванням, а не" a ". p" вставляє регістр за замовчуванням, виправляйте. І так, "add cut cut line in register" a " , яка замінила б вміст із "команди ayy"
Брюс Едігер

5

Існує кілька способів зробити це за допомогою :sзалежно від того, яку кількість друку ви хочете зробити. Найпростіший спосіб - простий пошук і заміна:

:%s/find this line/replace with this/

%Буде шукати весь файл і замінити всі входження.

Якщо для вас це занадто багато, ви можете витягнути рядок призначення ( yy) та скористатися "регістром (за замовчуванням), вставивши його за допомогою Ctrl+r ":

:%s/<ctrl+r><">/replacement/

Або, якщо у вас є копія рядка заміни, ви можете з’єднати ці два в окремі регістри з, "ayyа "byyтакож потрапити в регістри aта bрегістри відповідно (ви можете використовувати будь-який лист для своїх регістрів). Потім використовуйте Ctrl+r aта Ctrl+r bвставляйте їх у поля пошуку та заміни.

Не для одного Брюса, але якщо ви хочете перевірити рядки перед тим, як замінити їх, просто додайте cпараметр:

:%s/find this line/replace with this/c

2

Ви можете Vвиділити лінію, яку потрібно замінити у візуальному режимі, а потім натисніть, ppщоб вставити її.

Це додає лише один натискання клавіші, тому це здається досить хорошим рішенням.


Це не працює: після вставки в буфер обміну міститься текст, який був позначенийV
daniel kullmann

Просто один p.
Аарон Тома

2

Я використовую команду c"змінити" досить часто для подібних речей у поєднанні з регулярним пошуком. Ви можете шукати файл у кожному рядку / фрагменті тексту, який вас цікавить, а потім використовувати послідовні n.команди ( nдля наступного, а потім .для повторення останньої зміни.)

/^hello- знайти рядок, що починається з привіт;
c$goodbye- змінити лінію на прощання;
n.- повторити знаходження, повторити зміну

Якщо ви хочете змінити рядок на один, який вже є у файлі, ви можете просто скопіювати його у вхідний буфер (якщо припустимо, що ваш графічний інтерфейс дозволяє), а потім вставити, щоб отримати вміст першої команди зміни.

Як і у всіх випадках vi, хороша ідея мати багато варіантів у кишені, залежно від того, який тип редагування ви хочете зробити.

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