如何在vim中重新编号列表?

Jes*_*lin 5 regex math 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>
Run Code Online (Sandbox Code Playgroud)

然后我意识到它应该从14到0编号,而不是1到15.(是的,我的设计不好,而不是先计划好JavaScript.)

题.在vim中有一个简单的方法来对正则表达式中的数字进行数学运算吗?我想要做的是搜索文本"item [00-99]",并让它返回文本"item(15-original number)"

搜索似乎很容易 - /item([0-9] [0-9])/(用于将找到的数字放入缓冲区的括号),但是甚至可以对此进行数学运算吗?
用于在vim中编号的列表的宏?给出了一种从头开始编号的方法,但我正在寻找一种重新编号的方法.

Mar*_*rth 10

:%s/item\zs\d\+/\=15 - submatch(0)/
Run Code Online (Sandbox Code Playgroud)

会做你想做的.
打破它:

  • item\zs\d\+:匹配后item的数字(\zs表示匹配的开头)
  • \=:表示替换是一个表达式
  • 15 - submatch(0):返回15减去匹配的数字


Bor*_*ski 6

另一种有趣的方法是使用g<CTRL-a>:help v_g_CTRL-A了解更多信息)

从...开始

<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>
Run Code Online (Sandbox Code Playgroud)

使用视觉块模式将所有数字重置为00

  • <CTRL-V>选择所有号码
  • r0将所有数字替换为零

你应该被看到:

<span id="item00">   some first presented text</span>
<span id="item00">   some other text, presented second</span>
<span id="item00">   more text</span>
....
<span id="item00">  last bit of text.</span>
Run Code Online (Sandbox Code Playgroud)

现在恢复您的块选择gv或仅选择所有行V并按g<CTRL+a>

<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="item015">  last bit of text.</span>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这里需要进行最后一次清理。正如您所看到的,所有两位数字都位于0前面。再次使用视觉块模式<CTRL+v>选择并删除不需要的零。

<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>
Run Code Online (Sandbox Code Playgroud)

现在你已经完成了:)