我想在宏中记录一个宏,如下所示:

qa
    [ first macro ... ]
    qb
        [ second macro ... ]
    q
    [ some more stuff, involving @b ... ]
q


但是,第二个q被解释为停止第一个宏的请求,其余的是

是否有任何方法可以开始在宏中记录第二个宏?一定顺序的按键,而已经在宏中了?

评论

您不能先记录宏b然后记录宏a调用@b吗?

@statox问题是b具有破坏性作用,所以我不能先录制它(除非我想录制它,按u几次,然后再开始录制a)。

我认为这是您最好的解决方案。请注意,您也可以将其记录在另一个缓冲区(enew,recording,bd)中,或者通过在文件中写入宏内容然后通过将字符放在“ by”中来“记录”它来直接编辑b寄存器。

#1 楼

AFAIK,您无法通过qx...q一次拍摄两个宏。根据您的要求,您必须先通过b创建一个qb....q,然后再创建qa...@bq。例如。 b定义一个宏let @b='whatever'删除当前缓冲区的所有内容而无需“记录”。

有一个宏定义技巧,可能与您的问题无关。它是递归宏,而不是嵌套宏。也就是说,您可以执行以下操作:

@b

这将递归重播宏let @b='ggdG'。当我们不知道要重播宏多少次时,它有时很有用。因为发生错误时,宏重放将自动停止。例如,它保存b

#2 楼

将击键记录到宏@a与拉动与那些击键对应的文本以注册a相同。将某物存储在寄存器中后,您可以将其放置或作为宏/按键来播放。因此,您可以开始通过qa将宏记录到@a,然后在记录宏时,通过使用"bye之类的方法将一些文本拉到寄存器b中。与未指定寄存器b的情况不同,将文本拉到另一个寄存器中的所有操作。现在寄存器b中包含一些文本,您可以按@b将该文本作为按键回放。您甚至可以在仍记录宏@a的情况下执行此操作。

它的主要缺点是编写一些可以执行所需功能的vimscript函数,然后在宏录制过程中调用它可能会更容易。宏的美丽之处在于您可以在录制时看到录制内容的效果,但是这种元宏录制技术可以使录制效果有所收获。