Как я могу вставить (перезаписать) с vim?


31

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

Ответы:


27

По умолчанию команды вставки используют "регистр («без имени») . По сути, любая команда, которая записывает данные в регистр, также записывает данные в неназванный регистр, так что все изменения, изменения и изменения на нее влияют. Вот почему ваша последовательность yank-delete-paste вставляет удаленный текст вместо восстановленного.

0Регистр может помочь здесь. Любые команды янки, которые не указывают регистр, помещают янкированный текст в регистр 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 »вырезает строку в регистр« 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
Даниэль Куллманн

Всего один p.
Аарон Тома

2

Я использую команду c«изменить» довольно часто для такого рода вещей в сочетании с обычным поиском. Вы можете искать файл для каждой интересующей вас строки / фрагмента текста, а затем использовать последовательные n.команды ( nдля следующего, а затем .для повторения последнего изменения).

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

Если вы хотите изменить строку на строку, уже находящуюся в файле, вы можете просто скопировать ее в свой входной буфер (при условии, что ваш GUI это разрешает) и затем вставить, чтобы получить содержимое первой команды изменения.

Как и во всем, vi - хорошая идея иметь в своем кармане много опций, в зависимости от того, какой вид редактирования вы хотите сделать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.