vim: використовувати рядок пошуку в команді заміну


16

Я часто використовую /команду пошуку vim для перевірки своїх регулярних виразів (просто щоб побачити, що вона відповідає). Після цього я зазвичай використовую команду :%sзаміну, де я використовую цей регулярний вираз з пошуку як рядок, який потрібно замінити, наприклад, спочатку шукаю такий рядок:

/TP-\(\d\{5\}\)-DD-\d\{3\}

Він відповідає саме тому, що я хочу, тому я замінюю:

:%s/TP-\(\d\{5\}\)-DD-\d\{3\}/\1/g

Але мені доведеться знову написати цілий регулярний вираз. Зазвичай цей regexp набагато довший, тому я шукаю рішення:

Чи існує який-небудь існуючий сценарій ярлика або vim-скрипта для вставки цього пошукового шаблону безпосередньо в команду заміну?

Я використовую vim у терміналі (без gvim).

Відповіді:


20

Взагалі порожній регулярний вираз означає використовувати раніше введений регулярний вираз, тому :%s//\1/gслід робити те, що ви хочете.


Вау, це так просто! Саме те, що мені було потрібно, дякую.
kars7e

10
Крім того, якщо ви хочете перевірити або змінити останній використаний шаблон, ви можете використовувати Control-r,/ щоб потім вставити вміст регістра шаблону пошуку ( /) безпосередньо в частково набраний командний рядок (наприклад, відразу після :%s/).
Кріс Джонсен

це дуже корисний натяк. Дякую @Chris! +1
kars7e

Що робити, якщо я хочу продовжити "\ 1" з числом, як, наприклад, 23? Як я можу не допустити, щоб його інтерпретували як "\ 123"?
Чамп

@Champ Оскільки задні посилання йдуть лише до цього \9, неоднозначності немає.
Kusalananda

4

Ще один хороший спосіб побачити попередні пошукові регекси, а також команди Ex та змінити їх - редагувати ці команди в звичайному режимі. У цьому режимі у вас будуть усі ваші повноваження vim, включаючи копіювання та вставлення.

  • Пошук: замість ?або /для пошуку, спробуйте q/абоq?
  • для команд Ex, а не для :спробq:
  • для виходу з цього режиму використовуйте CtrlC

Детальніше див :help q:.

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