Сопоставление и замена всего визуального диапазона в vim

#regex #vim #substitution

#регулярное выражение #vim #замена

Вопрос:

Я хотел визуально отметить несколько строк, а затем окружить весь диапазон <p> и </p> . После долгой возни я придумал эту команду замены, которая должна работать:

:'<,'>s/^(_.*)%V/<p>1</p>/

Есть ли лучший способ сделать это или кто-нибудь может объяснить, почему это работает?

_. соответствует всем символам, включая конец строки. Швы ^ (начало строки) и %V (соответствие визуальному диапазону) ведут себя странно. Например, в документации предлагается использовать два, %V чтобы окружить ваше выражение, но это не обязательно. Использование no %V или наличие только одного в начале соответствует всему буферу. Удаление ^ приводит к тому, что последняя строка сопоставляется и заменяется отдельно. A $ в конце швы также не нужны.

Ответ №1:

1. Используйте объемный vim

Вы можете использовать surround.vim в визуальном режиме:

s<p Enter

Например vat (визуальный тег выбора «вокруг»), s<p окружающий с <p>...</p>

Разбивка:

  • vat (визуально выберите тег; сделайте любой визуальный выбор, который вы хотели)
  • s< (окружить тегом), в данном случае, p

2. Используйте команды ex с маркерами диапазона

Редактировать: без объемного звучания вы могли бы либо

:C-u'<iEnter <p> Esc

:'>aEnter </p> Esc

3. Используйте плагин yank и XML filetype для вставки содержимого регистра:

Или намного проще:

dO <p> 1C-r"Esc

Обратите внимание, что в 1 мой плагин XML filtetype (я думаю, он установлен по умолчанию) автоматически предоставил закрывающий тег ( </p> ), поэтому мы можем просто вставить извлеченное содержимое, используя C-r"—, даже не выходя из режима вставки!

Комментарии:

1. Также добавлены альтернативы без объемного звучания: IMO, всегда лучше знать подход, подобный vim, прежде чем расширять его с помощью плагинов. Таким образом, вы можете делать то, что плагины не делают для вас 🙂

2. Большое вам спасибо! Я собирался преобразовать текстовый документ с заголовками и абзацами в HTML. surround.vim швы работают довольно хорошо. Только две проблемы, сначала я получил surround.vim: Visual mode s has been removed in favor of S , поэтому я использовал S вместо этого. Во-вторых, есть ли способ не вставлять новые строки до и после и не делать отступ, как S это делается?

3. @MattiasWadman: я думаю :he vgS , это должно дать вам то, что вам нужно