Позвольте мне предложить альтернативную реализацию описанной вами методики.
:?\\begin\>\zs\*\=?s//\='*'[submatch(0)!='']/|norm!``
Вышеприведенная команда состоит из двух отдельных команд, связанных |
(см.
:help :bar
) в одну строку. Первый является заменой (см. :help :s
)
выполняется для каждой строки в указанном диапазоне,
?\\begin\>\zs\*\=?
В соответствии с синтаксисом диапазона (см. :help :range
), этот диапазон определяет
единственная строка, то есть предыдущая строка, где шаблон \\begin\>\zs\*\=
соответствует слову begin
, которому предшествует обратная косая черта, за которым следует необязательный
символ звезды. 1 Атом \zs
между частями узора
соответствие \begin
и *
устанавливает начало матча там. Итак, матч
всего шаблона либо пустой, либо содержит один символ звезды. это
нет необходимости указывать строку в диапазоне, это полезно для повторного использования
тот же шаблон позже в команде :substitute
, где только эта звезда
персонаж или его пустое место должны быть заменены. Для получения подробной информации о
синтаксис шаблона см. :help /\>
, :help /\=
, :help /\zs
.
Сама замена,
s//\='*'[submatch(0)!='']/
заменяет первое вхождение последнего шаблона поиска (который устанавливается
обратный поиск в диапазоне) со строкой, к которой относится выражение
'*'[submatch(0)!='']
оценивает (см. :help sub-replace-\=
). Как образец
соответствует только пустой строке или символу звезды, подвыражение
submatch(0)!=''
оценивается как ноль, если после \begin
нет звезды, или
один иначе. Нулевой индекс из строки '*'
приводит к подстроке
содержащий первый символ этой односимвольной строки. Индекс один
равна длине строки, поэтому нижний индекс приводит к пустому
строка. Таким образом, когда после \begin
появляется звезда, она заменяется на
пустая строка, когда звезды нет, интервал нулевой ширины сразу после
\begin
заменяется *
.
Вторая команда,
:norm!``
использует тот факт, что команда :substitute
сохраняет текущий
положение курсора до того, как он фактически начнет замену. Движение ``
команда переходит обратно в положение до последнего прыжка (который происходит в
вышеупомянутая команда замещения) восстановление положения
курсор. 2
1 Будьте осторожны с поиском, поскольку в диапазонах, как обычно, он переносится
в конце файла, когда опция wrapscan
включена (включена
по умолчанию).
2 Не путайте ``
с командой ''
, которая перемещает
курсор на первый непустой символ в строке местоположения перед
последний прыжок.