Comment enregistrer une macro imbriquée?

11

Je veux enregistrer une macro dans une macro, comme ceci:

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

Cependant, la seconde qest interprétée comme une requête pour arrêter la première macro et le reste est interprété comme des commandes.

Existe-t-il un moyen de commencer à enregistrer une deuxième macro dans une macro?

Sinon, existe-t-il un autre moyen d'obtenir l'effet souhaité de répéter une certaine séquence de touches, tout en étant déjà dans une macro?

Poignée de porte
la source
1
Vous ne pouvez pas d'abord enregistrer la macro b, puis enregistrer l' aappel de macro @b?
statox
@statox Le problème est que cela ba des effets destructeurs, donc je ne peux pas l'enregistrer en premier (à moins que je veuille l'enregistrer, appuyer plusieurs ufois, puis commencer l'enregistrement a).
Poignée de porte
1
Je pense que c'est votre meilleure solution. Notez que vous pouvez également l'enregistrer dans un autre tampon ( enew, enregistrement, bd) ou éditer directement le bregistre en écrivant dans votre fichier le contenu de votre macro puis "l'enregistrer" en plaçant les caractères dans le registre avec "by.
statox

Réponses:

10

AFAIK, vous ne pouvez pas enregistrer deux macros qx...qen une seule fois. Pour votre besoin, vous devez créer une macro d' bici qb....qqa...@bq.

Si vous ne voulez pas "enregistrer", bvous pouvez let @b='whatever'alors @brelire la macro. Par exemple, let @b='ggdG'définissez une macro bpour supprimer tout le contenu de votre tampon actuel sans "enregistrer".

Il existe une astuce de définition de macro, qui peut ne pas correspondre à votre question. C'est une macro récursive, pas une macro imbriquée. Autrement dit, vous pouvez faire:

qa..whatever..@aq

cela rejouera récursivement la macro a. C'est parfois utile, lorsque nous ne savons pas combien de fois nous voulons rejouer la macro. Parce que lorsque l'erreur se produit, la relecture de macro s'arrête automatiquement. Il sauve 999@apar exemple.

Kent
la source
1

L'enregistrement de touches sur la macro @a revient à tirer le texte correspondant à ces touches pour enregistrer a. Une fois que quelque chose est stocké dans un registre, vous pouvez le mettre ou le jouer en tant que macro / touches. Vous pouvez donc commencer à enregistrer une macro sur @a via qa, puis pendant que la macro enregistre, tirez du texte pour enregistrer b, peut-être en utilisant quelque chose comme "bye. Tout ce que cela fait, c'est de taper du texte dans un registre différent de ce qu'il serait si vous n'aviez pas spécifié le registre b. Maintenant que le registre b contient du texte, vous pouvez lire ce texte sous forme de frappes en appuyant sur @b. Vous pouvez même le faire pendant que la macro @a est encore en cours d'enregistrement. C'est métamacrolicieux!

Le principal inconvénient de cela est qu'il serait probablement plus facile d'écrire une fonction vimscript qui fait ce que vous voulez, puis de l'appeler pendant un enregistrement de macro. La beauté des macros est que vous pouvez voir l'effet de ce que vous enregistrez pendant que vous l'enregistrez, mais cette technique d'enregistrement de méta macro enlève un peu cela.

still_dreaming_1
la source