Wie kann ich ein verschachteltes Makro aufzeichnen?

11

Ich möchte ein Makro in einem Makro wie folgt aufzeichnen:

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

Das zweite qwird jedoch als Aufforderung zum Stoppen des ersten Makros interpretiert, und der Rest wird als Befehl interpretiert.

Gibt es eine Möglichkeit, ein zweites Makro innerhalb eines Makros aufzuzeichnen?

Wenn nicht, gibt es eine andere Möglichkeit, den gewünschten Effekt zu erzielen, wenn Sie eine bestimmte Folge von Tastenanschlägen wiederholen, während Sie sich bereits in einem Makro befinden?

Türknauf
quelle
1
Können Sie nicht zuerst die Makro aufzeichnen bund dann die Makro aufzeichnen acalling @b?
statox
@statox Das Problem ist, dass bes destruktive Auswirkungen hat, sodass ich es nicht zuerst aufnehmen kann (es sei denn, ich möchte es aufnehmen, drücke ueinige Male und beginne dann mit der Aufnahme a).
Türknauf
1
Ich denke, dass es Ihre beste Lösung ist. Beachten Sie, dass Sie es auch in einem anderen Puffer enewaufzeichnen ( , aufzeichnen bd) oder das bRegister direkt bearbeiten können , indem Sie den Inhalt Ihres Makros in Ihre Datei schreiben und ihn dann "aufzeichnen", indem Sie die Zeichen in das Register mit einfügen "by.
statox

Antworten:

10

AFAIK, Sie können nicht zwei Makros qx...qauf einmal aufnehmen. Für Ihre Anforderung, müssen Sie Makro erstellen bdurch qb....q, dann qa...@bq.

Wenn Sie auf „Record“ nicht möchten , bkönnen Sie tun , let @b='whatever'dann @bdas Makro wiedergeben wird. Zum Beispiel let @b='ggdG'definieren ein Makro bohne „Aufnahme“ den gesamten Inhalt Ihres aktuellen Puffer zu entfernen.

Es gibt einen Makrodefinitionstrick, der für Ihre Frage möglicherweise nicht relevant ist. Es ist ein rekursives Makro, kein verschachteltes Makro. Das heißt, Sie können Folgendes tun:

qa..whatever..@aq

Dadurch wird das Makro rekursiv wiedergegeben a. Es ist manchmal nützlich, wenn wir nicht wissen, wie oft wir das Makro abspielen möchten. Denn wenn ein Fehler auftritt, stoppt die Makro-Wiedergabe automatisch. Es spart 999@azum Beispiel.

Kent
quelle
1

Das Aufnehmen von Tastenanschlägen in das Makro @a ist dasselbe wie das Ziehen des Textes, der diesen Tastenanschlägen entspricht, um a zu registrieren. Sobald etwas in einem Register gespeichert ist, können Sie es entweder ablegen oder als Makro / Tastenanschlag abspielen. Sie können also ein Makro in @a über qaaufzeichnen. Ziehen Sie dann während der Aufzeichnung des Makros Text in das Register b, und verwenden Sie möglicherweise etwas wie "bye. Das Einzige, was Sie tun müssen, ist, Text in ein anderes Register zu ziehen, als wenn Sie das Register b nicht angegeben hätten. Nachdem sich in Register b Text befindet, können Sie diesen Text durch Drücken von als Tastendruck wiedergeben @b. Sie können dies sogar tun, während das Makro @a noch aufgezeichnet wird. Es ist metamacrolicious!

Der Hauptnachteil dabei ist, dass es wahrscheinlich einfacher ist, eine Vimscript-Funktion zu schreiben, die das tut, was Sie wollen, und sie dann möglicherweise während einer Makroaufnahme aufzurufen. Das Schöne an Makros ist, dass Sie den Effekt der Aufnahme sehen können, während Sie sie aufnehmen. Diese Meta-Makro-Aufnahmetechnik nimmt Ihnen dies jedoch etwas ab.

still_dreaming_1
quelle