Проблема может быть решена с помощью счетчика, отдельного от встроенного в
Команда :substitute
: используйте переменную Vim-script для хранения номера шаблона
Матчи. Удобный способ зарегистрировать каждый матч и изменить конкретный
переменная, соответственно, это использовать замену с
особенность выражения команды :substitute
(см. :help sub-replace-\=
).
Идея состоит в том, чтобы использовать замену, которая оценивает выражение, увеличивающееся
счетчик в каждом случае, и не меняет текст, который он работает
на.
Первая часть техники не может быть реализована напрямую
потому что запрещено использовать команды Ex в выражениях (включая \=
замещающие выражения), и поэтому невозможно использовать :let
Команда для изменения переменной. Ответ на вопрос " gVim найти / заменить
со счетчиком", я предложил простой прием, чтобы преодолеть это ограничение,
который основан на использовании списка из одного элемента (или словаря, содержащего один
пара ключ-значение). Поскольку функция map()
преобразует список или словарь
вместо этого этот единственный элемент может быть изменен в контексте ограниченного выражения.
Для этого нужно вызвать функцию map()
, передав выражение
вычисление нового значения вместе со списком, содержащим текущее значение.
Вторая половина техники - как избежать изменения текста при использовании
команда замещения. Для этого можно сделать шаблон
иметь нулевую ширину, добавляя \ze
или добавляя к нему \zs
атомов (см.
:help /\zs
, :help /\ze
). Таким образом, измененный шаблон захватывает
строка нулевой ширины непосредственно перед или после появления начального
шаблон. Таким образом, если текст замены также пуст, замена не
вызвать любое изменение содержимого буфера. Сделать замену
выражение вычисляется в пустую строку, можно просто извлечь пустую
подстрока или подсписок из результирующего значения этого выражения.
Обе идеи воплощаются в следующую команду.
:let n=[0] | bufdo %s/pattern\zs/\=map(n,'v:val+1')[1:]/ge