【问题标题】:How do I renumber a list in vim?如何在 vim 中重新编号列表?
【发布时间】:2015-09-25 07:41:18
【问题描述】:

我写了一段网页,其中有以下内容......

<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? 提供了一种从头开始编号的方法,但我正在寻找一种重新编号的方法。

【问题讨论】:

  • 似乎是您应该从数组中以编程方式生成的东西,而不是在 HTML 中进行硬编码?只是一个想法。
  • 就像我说的那样,我的设计很糟糕 :) 我正在做的是生成一个固定大小的文本网格(每个单元格中都有可变文本)。我最初在左上角有 (0,0) 坐标,但网格的数学在左下角有 (0,0)。我希望能够根据需要访问每个单元格,而不是在每次更新时输出整个表格。

标签: regex math vim


【解决方案1】:
:%s/item\zs\d\+/\=15 - submatch(0)/

会做你想做的。
分解:

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

【讨论】:

  • 由于使用了\zs,您可以去掉正则表达式中的括号,在替换中只引用submatch(0) 而不是submatch(1)
  • 我建议使用g 命令仅对包含item::%g/item/s/\d\+/\=15 - submatch(0)/ 的行应用替换。它允许摆脱\zs(即使有些人可能会认为它不如原始答案精确)。
【解决方案2】:

另一种有趣的方式是使用g&lt;CTRL-a&gt;: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

  • &lt;CTRL-V&gt;选择所有号码
  • 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&lt;CTRL+a&gt;

<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。再次使用可视块模式&lt;CTRL+v&gt; 来选择和删除不需要的零。

<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>

现在你已经完成了:)

【讨论】:

    【解决方案3】:

    如果你有带 perl 的 vim(许多发行版默认都有),你可以 使用:perldo 命令来做到这一点。 (@Marth 解决方案更好)

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-05-12
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 2018-11-04
        • 2011-01-02
        • 1970-01-01
        • 2019-09-22
        • 1970-01-01
        相关资源
        最近更新 更多