Как заменить всю строку текстом в буфере в VIM? - PullRequest
2 голосов
/ 09 июля 2011

Вот текст, над которым я работаю:

line1: website = "a.com";
...
line3: website = "b.com";
...
line5: website = "c.com";

Предположим, я хочу изменить весь веб-сайт на "stackoverflow.com", я могу сделать:
- измените «a.com» на «stackoverflow.com»
- дернуть всю линию (Y)
- перейти к строке 3, нажать p, k, dd, чтобы вставить из буфера и удалить старую строку «b.com».

Теперь проблема в том, что, поскольку dd помещает "b.com" в буфер, вместо строки 5 мне придется снова выдернуть всю строку.
Есть ли простой способ, чтобы я мог быстро заменить line3 и line5 уже выдернутой линией?

UPDATE:
Спасибо за ответы, теперь есть несколько способов сделать это: удалить в черную дыру, восстановить из именованного буфера и т. Д. Я обнаружил, что это мой любимый метод (я использую ключ R вместо r, поскольку иногда мне нужно заменить один символ):

В Vim есть способ удалить без внесения текста в реестр?

Я поместил несколько ссылок на подобные вопросы SO ниже:

Как удалить (нужный текст), удалить (нежелательный текст) и вставить (нужный текст) в Vim
В Vim есть способ удалить без внесения текста в реестр?

Ответы [ 6 ]

4 голосов
/ 09 июля 2011

Перво-наперво

Вы можете сделать это лучше, если вам не нужно явно удалять строку:

  1. вернуть всю строку в регистр x: "xY
  2. перейти на следующую строку, чтобы заменить
  3. визуально выделите всю строку: V
  4. вставьте выделение из регистра x: "xp

Теперь удаленная строка находится в регистре ", как всегда, но выдернутая строка все еще находится в регистре x, так что вы можете повторять шаги со 2 по 4 без повторного нажатия.

Повторяющиеся вещи повторяются

К сожалению, вы не можете использовать . , чтобы повторить шаги 3 + 4. Поэтому, если вам нужно сделать это для большого количества строк, вставьте еще несколько шагов для записи макроса:

  1. вытянуть всю строку в регистр x: "xY
  2. перейти на следующую строку, чтобы заменить
  3. запись макроса в регистр w: qw
  4. визуально выделите всю строку: V
  5. вставьте выбор из регистра x: "xp
  6. остановить запись: q
  7. перейти на следующую строку, чтобы заменить
  8. воспроизвести макрос, записанный в w: @ w
  9. перейти на следующую строку, чтобы заменить
  10. и теперь, наконец, вы можете повторить то же, что и в прошлый раз: @@

Затем вы можете просто повторить шаги 9 и 10 для следующих 50 строк, которые нужно заменить.

Последние (повторные) вещи в прошлом

На самом деле, если вы найдете следующую строку путем поиска , то вам следует использовать этот поиск, чтобы перейти и к строке first . Потому что тогда n , который вы используете для перехода к следующей строке, может быть включен как часть макроса - в основном вы просто меняете шаги 6 и 7.

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

Ссылки

3 голосов
/ 09 июля 2011

Это не ответ на поставленный вопрос, но, я думаю, это ответ на ваш реальный вопрос.

Техника 1: Вам известно о :s?Если вы просто хотите заменить все совпадения, вы можете сделать что-то вроде этого:

:%s/^website = "\zs.*\ze\.com";$/stackoverflow/

Так как вы не указали точный формат всего этого и хотите ли вы заменить все или только некоторыеЯ не могу сказать, хотите ли вы этого или нет.

Техника 1b: Даже если вы хотите заменить только некоторые, есть полезный и не очень широко известный флаг для :s: c, «подтвердить».(См. :help :s_flags и более конкретно :help :s_c.) Затем вы можете решить с каждым из них, хотите ли вы заменить его или нет.

:%s/^website = "\zs.*\ze\.com";$/stackoverflow/c

Техника 2: Вы также можетепоиск, замена и затем повторить./^website = "\zs.*\ze\.com";$, затем cwstackoverflow Esc , чтобы заменить слово "stackoverflow".Затем n, чтобы перейти к следующему совпадению, и если вы хотите заменить его на «stackoverflow», используйте ..

3 голосов
/ 09 июля 2011

Для этого вы можете использовать именованные буферы вместо безымянного буфера по умолчанию: "lY затем "lp для восстановления соотв.вставьте из регистра l, затем позвольте dd использовать буфер по умолчанию.

2 голосов
/ 09 июля 2011
0 голосов
/ 12 октября 2013
  • ci " - изменить внутри" "
  • ctrl-r 0 - поставить регистр по умолчанию
  • jj - сдвинуться на две строки
  • . - повторить последнюю команду
  • JJ
  • .
0 голосов
/ 11 июля 2011

Регистр "0 всегда содержит ваш последний дерганный текст.Тогда вы можете сделать:

  • изменить "a.com" на "stackoverflow.com"
  • восстановить всю строку (Y)
  • перейти к строке 3, нажмите«0p, k, dd для вставки из буфера и удаления старой строки« b.com ».
  • перейдите к строке 5, нажмите« 0p, k, dd для вставки из буфера и удаления старой »c.com" линия.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...