【问题标题】:How can I run a multiline macro over a visual selection in vim?如何在 vim 中的可视选择上运行多行宏?
【发布时间】:2016-07-11 06:28:31
【问题描述】:

我有一个包含多组 id 行的文件。我需要通过并将同一组模式添加到每组 id 中。这是我的意思的一个例子:

randomstring#morerandom
randomstring#morerandom
randomstring#morerandom

randomstring#morerandom
randomstring#morerandom
randomstring#morerandom

# pattern to add
thingA;
thingB;
thingC;

假设 randomstrings 实际上是随机的,可以有数百行这样的行,并且组的大小都相同但可能大于 3 行。我想在每组行的 # 之后插入三个 thing。输出应该是这样的:

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。但是,这会做一些奇怪的事情,并且似乎每行添加了多个内容。

只是用数字运行我的宏并猜测文件的长度是最好的方法吗?即10@q?

另外,有没有更好的方法将内容拉入连续的寄存器,而不是手动拉出每个?

【问题讨论】:

  • 如果每个组有 100 行,你如何分配“三件事”来分配?还是说如果你有 100 行,那么你也会有 100 个东西?
  • @zdim 事物的数量总是等于每组的行数。

标签: vim macros


【解决方案1】:

确保每个块(包括最后一个块)下方有一个空行,就像您的示例一样;然后你可以运行这个:

:'<,'>g/\n\n/normal 2k@q

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

或者,删除您的视觉块,将其粘贴到新缓冲区中,然后只需使用正常的宏循环(不受视觉选择限制)来转换事物,然后将其放回原始缓冲区:

d:enew<CR>Pqrqqr@q@rq@rggdG:bd!<CR>P

(如果我没有在某个地方搞砸的话)

【讨论】:

  • 你能解释一下 :'g/\n\n/normal 2k@q 部分吗? 2k 在做什么?
  • 2k 上升了两行,因为搜索\n\n 将把你带到块的最后行。
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多