По умолчанию команды вставки используют "
регистр («без имени») . По сути, любая команда, которая записывает данные в регистр, также записывает данные в неназванный регистр, так что все изменения, изменения и изменения на нее влияют. Вот почему ваша последовательность yank-delete-paste вставляет удаленный текст вместо восстановленного.
0
Регистр может помочь здесь. Любые команды янки, которые не указывают регистр, помещают янкированный текст в регистр 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>
. Преимущество повторяемости с.
командой.Похоже, у Кевина довольно неплохой ответ, но если вы хотите увидеть каждую удаляемую строку, то замените, существует немного другое решение.
Этот тип рецепта позволяет вам использовать сопоставление с образцом, чтобы найти строки, которые нужно удалить и заменить, и вы можете вернуться к началу файла (1G) и искать вперед столько раз, сколько захотите. Если у меня есть 2 или более строк для повторного сбора и размещения, я использую
"ayy
первую строку,"byy
вторую,"cyy
третью и так далее. У меня появилась привычка (которая уменьшает общность рецепта), чтобы уменьшить умственную нагрузку на меня.источник
"ayy
и затемdd
,dd
не заменит то, что естьa
, но если я наберу,p
он вставит то, что было просто удалено с помощьюdd
. И если бы я хотел заменить то, что находится внутри,"ayy
тем, что я удаляю, то я бы использовал"add
- это правильно?Есть несколько способов сделать это
:s
, в зависимости от того, сколько печатать вы хотите. Самый простой способ - это простой поиск и замена:%
Будет искать весь файл и заменить все вхождения.Если это слишком много для печати, вы можете восстановить строку назначения (
yy
) и использовать"
регистр (по умолчанию), вставив его с помощью Ctrl+r ":Или, если у вас есть копия строки замены, вы можете восстановить два в отдельные регистры с
"ayy
и"byy
дергать вa
иb
регистры, соответственно (вы можете использовать любую букву для ваших регистров). Затем используйте Ctrl+r aи, Ctrl+r bчтобы вставить их в поля поиска и замены.Не для Брюса, но если вы хотите проверить строки перед их заменой, просто добавьте
c
опцию:источник
Вы можете использовать,
V
чтобы выделить строку, которую вы хотите заменить в визуальном режиме, а затем нажать,pp
чтобы вставить эту строку.Это добавляет только одно нажатие клавиши, так что это кажется довольно хорошим решением.
источник
V
p
.Я использую команду
c
«изменить» довольно часто для такого рода вещей в сочетании с обычным поиском. Вы можете искать файл для каждой интересующей вас строки / фрагмента текста, а затем использовать последовательныеn.
команды (n
для следующего, а затем.
для повторения последнего изменения)./^hello
- найти строку, начинающуюся с привет;c$goodbye
- изменить строку на прощание;n.
- повторить поиск, повторить изменениеЕсли вы хотите изменить строку на строку, уже находящуюся в файле, вы можете просто скопировать ее в свой входной буфер (при условии, что ваш GUI это разрешает) и затем вставить, чтобы получить содержимое первой команды изменения.
Как и во всем, vi - хорошая идея иметь в своем кармане много опций, в зависимости от того, какой вид редактирования вы хотите сделать.
источник