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

时间:2015-09-25 07:41:19

标签: 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>

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

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

搜索似乎很容易 - / item([0-9] [0-9])/ (将找到的数字放入缓冲区的括号),但是甚至可以对此进行数学处理吗? Macro for making numbered lists in vim?提供了一种从头开始编号的方法,但我正在寻找一种重新编号的方法。

4 个答案:

答案 0 :(得分:10)

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

会做你想做的事。
打破它:

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

答案 1 :(得分:2)

您可能需要查看VisIncr plugin。它增加了对以各种格式增加/减少数字,日期和日期名称列的支持。当你必须处理这些事情时非常方便。

答案 2 :(得分:1)

如果您使用perl的vim(默认情况下有许多发行版),您可以 使用:perldo命令来执行此操作。 (@Marth解决方案更好)

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

答案 3 :(得分:1)

另一种有趣的方式是使用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>

使用可视块模式将所有数字重置为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>

现在使用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>

不幸的是,这里需要最后一次清理。如您所见,所有两位数字都位于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>

现在您已经完成了:)