Эта строка удалит все пустые строки в <pre>
блоках:
<code>:%s_<pre>\zs\_.\{-}\ze
_ \ = substitute (submatch (0), '\ n \ n \ @ =', '', 'g') _ g
WTF:
:%s_
: запускает команду подстановки для всех строк в буфере. Вы можете использовать любой символ после s
; использование того, который вы не используете в шаблоне (в данном случае _
), означает, что вам не нужно избегать его в шаблоне.
\zs\_.\{-}\ze
: минимальное многострочное совпадение всех символов в <pre>
блоках.
_
: отделяет строку соответствия от замены
\=
: указание этого слова в начале замены означает, что замена является выражением vimscript, которое необходимо оценить.
substitute(submatch(0), '\n\n\@=', '', 'g')
:
- Выражение замены - это вызов функции
substitute(...)
.
submatch(0)
: это дает полное внешнее совпадение, в данном случае все между \zs
и \ze
.
\n\n\@=
: этот RE соответствует любой новой строке, за которой следует новая строка, фактически не продвигаясь после этой второй новой строки. Элемент \@=
известен как «прогнозное утверждение нулевой ширины»; :help /\@
даст вам больше деталей.
- Все остальное довольно просто, просто замените символ новой строки на все случаи жизни. Обратите внимание, что символ новой строки second (тот, что был обнаружен прогнозом) не считается частью совпадения и поэтому не заменяется (по крайней мере, до следующей итерации, когда он будет заменен за ним следует третий последовательный перевод строки).
Наконец, _g
просто закрывает выражение флагом g
, чтобы указать, что все экземпляры должны быть заменены. Я думаю, что мнемоника является «глобальной».