#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
, это должно дать вам то, что вам нужно