使用 vim 多次粘贴块(增加)编号

Paste block multiple times with (increasing) numbering using vim

我在 yaml 文件中有一个块,我想将其复制并粘贴几次:

- probeNumber: 1
  probeLocation: [0, 0, 0.1]

是否可以在每个块中自动增加probeNumberprobeLocation的值?像这样:

- probeNumber: 1
  probeLocation: [0, 0, 0.1]

- probeNumber: 2
  probeLocation: [0, 0, 0.15]

- probeNumber: 3
  probeLocation: [0, 0, 0.20]

probeLocation不是整数,它在每个块中增加一个固定值(0.05)。我需要大约 1000 个这样的块,所以手动执行此操作是不可行的。

在您的文本文件中创建一个模板,假设从第 1 行开始。

- probeNumber: 1
  probeLocation: [0, 0, 0.1]

- probeNumber: 1
  probeLocation: [0, 0, 0.1]

...repeat the number as you want, e.g. copy the first block and do 100p for 100 copy

然后使用以下命令更新值:
用于更新 probeNumber

:%s!1$!\=printf("%d", line('.')/3+1)!g

用于更新probeLocation

:%s!0\.1!\=printf("%0.2f", 0.10+(line('.')/3)*0.05)!g

其中0.10为初始值,0.05为增量。

感谢 SergioAraujo 指出原表达式的错误
:%s!0\.1$!\=printf("0.%d", 10+(line('.')/3)*5)!g
失败,因为替换值永远不会大于 1。

主要思想是使用line函数更新值,您可以查看Replace a pattern with current line number and Insert line numbers了解更多详情。

我找到了解决这个问题的另一种方法:

如果剪贴板上有前三行,这意味着前两行和一个空行,您可以使用以下内容创建文件:

:for i in range(999) | silent! 0put + | endfor

为了增加probeNumber行数:

:let c=1 | g/\d\+$/ s//\=c/ | let c+=1

现在带有 probeLocation 的行:

:let c=0.10 | g/0\.1\ze]/ s//\=printf("%0.2f", c)/ | let c+=0.05