如何记录嵌套宏?


11

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

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

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

有什么方法可以开始在宏中记录第二个宏吗?

如果不是,是否还有其他方法可以在宏中进行某些特定的击键重复操作来达到预期效果?


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

@statox问题在于b具有破坏性的作用,因此我无法首先进行记录(除非我想对其进行记录,先按u几次,然后再开始记录a)。
门把手

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

Answers:


10

AFAIK,您不能qx...q一次拍摄两个宏。为了您的要求,您必须创建宏bqb....qqa...@bq

如果您不想“录制” blet @b='whatever'@b可以重播宏。例如,let @b='ggdG'定义一个宏b以删除当前缓冲区的所有内容,而无需“记录”。

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

qa..whatever..@aq

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


1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.