Копирование и вставка Vim

Мой предыдущий вопрос кажется немного двусмысленным, я перефразирую его:

У меня есть такой файл:

copythis abc
replacethis1 xyz
qwerty replacethis2
hasfshd replacethis3 fslfs
And so on...

ПРИМЕЧАНИЕ: replacethis1, replacethis2, replacethis3, ... могут быть любыми словами

Как мне заменить "replacethis1", "replacethis2", "replacethis3", .. word словом "copythis", используя минимум команд vim.

Один из способов сделать это - выполнить следующие действия:

  1. удалите "replacethis1", "replacethis2", "replacethis3", ... используя 'dw'
  2. скопируйте "copythis" с помощью 'yw'
  3. переместите курсор туда, где было "replacethis1", и сделайте 'p'; переместите курсор туда, где было "replacethis2", и сделайте 'p' и так далее ...

Есть ли лучший способ сделать это в VIM (используя меньшее количество команд vim)?

Ответов (9)

Решение

Поскольку вы изменили свой вопрос, я сделаю это так:

Перейдите к первому «replacethis1» и введите cw (изменить слово), затем введите «copythis» вручную.

Перейдите к следующему «replacethis», нажмите. (повторить последнюю операцию)

Перейдите к следующему "replacethis", нажмите.,

И так далее, и так далее.

Если «copythis» - короткое слово, я думаю, это лучшее решение.

:%s/copythis/replacethis/g

Чтобы заменить все вхождения copythis на replacethis. Или вы можете указать диапазон номеров строк, например:

:8,10 s/copythis/replacethis/g

Обратите внимание, что / g в конце укажет ему заменить все вхождения. Если вы не укажете это, он просто сделает первый.

если вам нужно выполнить одно и то же действие несколько раз - замените первое слово одной строки вторым словом следующей строки, я говорю, что вы можете записать макрос и вызывать его всякий раз, когда вам нужно

  1. создать это сопоставление:

    : map z cwcopythis ^ [

    (^ [- это escape-символ, вы можете ввести его в vim, используя Ctrl + V Ctrl + [)

  2. перейдите к каждому слову, которое хотите заменить, и нажмите z

Вы можете переназначить , например , на m клавишу в нормальном режиме , чтобы удалить слово под курсором и вставить буфер: :nnoremap m "_diwP . Затем вы можете просто скопировать нужное слово, переместить курсор в любое место на слово, которое нужно заменить, и ввести m .

РЕДАКТИРОВАТЬ: сопоставление с m - плохая идея, поскольку он используется для отметки местоположений. Но вы все ; равно можете использовать, например .

Вы пробовали замену строк?

%s/replacethis/copythis

Для точной настройки замены возможно множество других параметров. Подробнее читайте в справке Vim. Еще несколько примеров здесь .

Учитывая, что «replacethis [1-3]» могут быть произвольными не связанными словами, самый быстрый / простой способ сделать это глобально:

:%s/replacethis1\|replacethis2\|replacethis3/copythis/g

(Обратите внимание, что вам нужно использовать \ |, чтобы каналы работали как "или". В противном случае vim будет искать буквальный символ |.)

Цифра должна быть включена, и в каждой строке может быть более одного экземпляра:

:%s/replacethis\d/copythis/g

Я тоже долго боролся с этим, я думаю, что просто разработал самый чистый способ:

Используйте самую чистую команду, чтобы скопировать это в регистр r:

/copythis
"rye

Затем перейдите к замене и замените его содержимым r:

/replacethis
cw<CTRL-R>r<ESC>

Тогда вы можете просто n.n.n.n.n.n.n. для остальных из них, или, если они сильно отличаются, просто перейдите к началу каждого и нажмите .

Ключ заменяется и вставляется за один шаг, чтобы вы могли использовать его . позже.