2016-03-23 52 views
0

我有一个包含ids行的文件。我需要通过并将相同的模式组添加到每个ID组。这里是我的意思的例子:如何在vim中通过视觉选择运行多行宏?

randomstring#morerandom 
randomstring#morerandom 
randomstring#morerandom 

randomstring#morerandom 
randomstring#morerandom 
randomstring#morerandom 

# pattern to add 
thingA; 
thingB; 
thingC; 

假设randomstrings实际上是随机的,可能有数百个这样的线,且各组都是平等的尺寸,但也可以大于3行。我想在每组行的#号之后插入三个东西。这是输出应该是什么样子:

randomstring#thingA;morerandom 
randomstring#thingB;morerandom 
randomstring#thingC;morerandom 

randomstring#thingA;morerandom 
randomstring#thingB;morerandom 
randomstring#thingC;morerandom 

我最初的计划是猛拉东西添加到寄存器A,B,C和创建开始于一个组的开头宏,插入每一件事在#之后,结束于下一组的乞讨。 ^f#"apj^f#"bpj^f#"cpjj^

我试着运行这个宏,突出显示我想运行的区域,然后做一个:normal @q。然而,这是奇怪的事情,似乎每行添加多件事情。

只是用一个数字运行我的宏,并猜测文件的长度是最好的方法来做到这一点?即[email protected]

另外,是否有更好的方法来将事物插入连续的寄存器中,而不是手动拉开每个寄存器?

+0

如果你在每组有100行,你如何分配“_three things_”来分配?或者如果你有100条线,那么你也有100条东西? – zdim

+0

@zdim事物的数量总是等于每组的行数。 –

回答

0

确保每个块(包括最后一个块)下面都有一个空行,就像在你的示例中一样;那么你可以运行这个:

:'<,'>g/\n\n/normal [email protected] 

这应该在每个块的第一行上运行你的宏,只限于视觉选择。

或者,删除你的视觉块,将其粘贴到一个新的缓冲区,然后只需要使用普通微距环(通过视觉选择无限制)改造的东西,然后把它放回原来的缓冲区:

d:enew<CR>[email protected]@[email protected]:bd!<CR>P 

(如果我没有搞错地方)

+0

你能解释一下:'<,'> g/\ n \ n/normal 2k @ q部分? 2k在做什么? –

+0

'2k'上升两行,因为搜索'\ n \ n'会将您置于该块的最后一行。 – Amadan