【问题标题】:How to increment integers on the current line by 1如何将当前行的整数加 1
【发布时间】:2026-01-12 00:10:01
【问题描述】:

我正在研究 nand2tetris,我最终得到了很多看起来像这样的文件:

Bit(in=in[0], load=load, out=out[0]);
Bit(in=in[1], load=load, out=out]1]);
...
Bit(in=in[15], load=load, out=out[15]);

所以我一直在拉第一行,然后使用 15p,然后执行 :s/0/i/g 15 次(其中 i 是我需要的索引)。我注意到我可以用:s/\[\d\]/\[i\]/g 替换它,但即使在这里我每次运行命令时手动设置i 的值。有没有我可以运行的命令,以便自动将i 计算为\d+1,我可以对每一行重复该命令,而无需手动指定值?

【问题讨论】:

  • 我也想要答案。但恐怕我们不能只用正则表达式来实现它。
  • 您可以使用替换,但您需要使用\=。例如:s/\d\+/\=str2nr(submatch(0))+1/。请参阅:h :s\= 了解更多信息。
  • @PeterRincker 我不认为 str2nr 是必要的。
  • @FDinoff 太棒了!你是对的。这也确实缩短了它::s/\d\+/\=submatch(0)+1/

标签: vim nand2tetris


【解决方案1】:

一种方法是使用 Vim 宏。

概述

复制该行,然后粘贴该行。增加两个数字。

qqyyp<c-a>l<c-a>q

注意,这会将宏保存到寄存器q

通过@q 执行宏或通过14@q 一起执行。

如需更多帮助,请参阅:

:h q
:h ctrl-a

【讨论】:

    【解决方案2】:

    我会像 Peter Rincker 那样做(即时宏很棒),但这里有另一个解决方案,只是为了它:

    yy                         " yank current line
    15p                        " paste 15 times
    :,']s/0/\=line('.')-1/g    " substitute every 0 from cursor to last
                                 pasted line with the current line number
    

    【讨论】:

    • +1 有选择总是好的!应该注意的是,如果文件中的代码块较低,您可能需要将-1 调整为其他数字。或者你可以做一些像:,']s/0/\=line('.')-line("'[")/g这样的诡计。
    【解决方案3】:

    如果我理解您想要正确执行的操作,您应该可以在 vim 中使用 increment 包。使用 15p 将第一行文本粘贴 15 次:

    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    Bit(in=in[0], load=load, out=out[0]);
    

    您可以选择第一行的“0”,然后使用 Ctrl-V 进入可视块模式。在可视块模式下突出显示到底部,以便突出显示所有 0。然后你可以输入:Inc&lt;CR&gt;。这将增加数字,本质上是对文本中的行进行编号:

    Bit(in=in[ 0], load=load, out=out[0]);
    Bit(in=in[ 1], load=load, out=out[0]);
    Bit(in=in[ 2], load=load, out=out[0]);
    Bit(in=in[ 3], load=load, out=out[0]);
    Bit(in=in[ 4], load=load, out=out[0]);
    Bit(in=in[ 5], load=load, out=out[0]);
    Bit(in=in[ 6], load=load, out=out[0]);
    Bit(in=in[ 7], load=load, out=out[0]);
    Bit(in=in[ 8], load=load, out=out[0]);
    Bit(in=in[ 9], load=load, out=out[0]);
    Bit(in=in[10], load=load, out=out[0]);
    Bit(in=in[11], load=load, out=out[0]);
    Bit(in=in[12], load=load, out=out[0]);
    Bit(in=in[13], load=load, out=out[0]);
    Bit(in=in[14], load=load, out=out[0]);
    Bit(in=in[15], load=load, out=out[0]);
    

    【讨论】:

      最近更新 更多