Как перенумеровать список в vim?

Я написал раздел веб-страницы со следующим битом...

<span id="item01"> some first presented text</span>
<span id="item02"> some other text, presented second</span>
<span id="item03"> more text</span>
....
<span id="item15"> last bit of text.</span>

Тогда я понял, что он должен быть пронумерован от 14 до 0, а не от 1 до 15. (Да, плохой дизайн с моей стороны, а не планирование JavaScript в первую очередь.)

Вопрос. Есть ли простой способ в vim делать математику по числам в регулярном выражении? То, что я хотел бы сделать, - это поиск по тексту "item [00-99]" и вернуть текст "item (15-original number)"

Поиск кажется достаточно простым -/item ([0-9] [0-9])/ (скобки, чтобы положить найденные числа в буфер), но можно ли даже сделать математику на этом? Макрос для создания нумерованных списков в vim? дает возможность пронумеровать что-то с нуля, но я ищу метод перенумерации.

3 ответа

:%s/item\zs\d\+/\=15 - submatch(0)/

сделает то, что вы хотите. Разрушение:

  • item\zs\d\+: номера совпадений после item (\zs указывает начало совпадения)
  • \=: укажите, что replace является выражением
  • 15 - submatch(0): возвращает 15 минус сопоставленное число


Возможно, вы захотите взглянуть на плагин VisIncr. Он добавляет поддержку для увеличения/уменьшения столбцов чисел, дат и имен дней в различных форматах. Очень удобно, когда вам приходится иметь дело с такими вещами.


Если у вас есть vim с perl (у многих дистрибутивов это по умолчанию), вы можете используйте команды :perldo для этого. (Лучше решение @Marth)

:perldo s/(?<=item)(\d+)/15 - $1/e

licensed under cc by-sa 3.0 with attribution.