在Vim中,如何将涉及换行的宏应用于多行

In Vim, how to apply macro that involves making a new line to multiple lines

鉴于:

This is nearly identical 
My answer looks like an o
I am glad you did because
Thank you so much, romain

想要的输出,只需复制该行并在末尾添加 2

This is nearly identical 
This is nearly identical 2
My answer looks like an o
My answer looks like an o2
I am glad you did because
I am glad you did because2
Thank you so much, romain
Thank you so much, romain2

我已经录制了一个宏@q,它将从第一行开始,复制该行(光标现在在第二行),附加2,然后转到下一行(光标是现在在第三行)。如果我一直输入 @q 直到文件末尾,宏就可以很好地工作(永远不需要移动光标,宏可以正确处理光标移动)。

但是如果我尝试使用 :'<,'>norm! @q 方法 (seen here),我会得到这个:

This is nearly identical 
This is nearly identical 2
This is nearly identical 22
This is nearly identical 222
This is nearly identical 2222
My answer looks like an o
I am glad you did because
Thank you so much, romain

这是您的代码段,但带有行号以帮助您发现问题:

1 This is nearly identical 
2 My answer looks like an o
3 I am glad you did because
4 Thank you so much, romain

范围实际上只是一个行号列表,[1, 2, 3, 4] 在这种情况下,这意味着您的宏应用于第 1、2、3 和 4 行。

由于您的宏在当前行下方添加了一行,因此之前称为 2 的行现在为 3:

1 This is nearly identical 
2 This is nearly identical 2
3 My answer looks like an o
4 I am glad you did because
5 Thank you so much, romain

并且您的宏在实际第 2 行播放:

1 This is nearly identical 
2 This is nearly identical 2
3 This is nearly identical 22
4 My answer looks like an o
5 I am glad you did because
6 Thank you so much, romain

然后在第 3 行:

1 This is nearly identical 
2 This is nearly identical 2
3 This is nearly identical 22
4 This is nearly identical 222
5 My answer looks like an o
6 I am glad you did because
7 Thank you so much, romain

然后在第 4 行:

1 This is nearly identical 
2 This is nearly identical 2
3 This is nearly identical 22
4 This is nearly identical 222
5 This is nearly identical 2222
6 My answer looks like an o
7 I am glad you did because
8 Thank you so much, romain

为了避免这种情况,您必须首先标记范围内的每一行。这是通过 :help :global:

完成的
:'<,'>g/^/norm! @q

其中 '<,'>g/^/ 标记范围内的每一行,norm! @q 执行宏。

你试过制作宏,然后4@q

我试图重新创建您的宏,运行 4@q:

这几乎是一样的 这几乎相同 2 我的回答看起来像一个 o 我的回答看起来像 o2 我很高兴你这样做是因为 我很高兴你这么做了因为2 非常感谢,罗曼 非常感谢,romain2

这样就不必进行视觉选择。