Comment visualiser et éditer mon enregistrement (c.-à-d. Une macro enregistrée)?

39

J'utilise des répétitions complexes pour enregistrer mes opérations ( qqenregistrer certaines opérations , qarrêter) et j'ai commis une erreur.

Il est possible de voir ce que j'ai enregistré et de corriger l'erreur au lieu de la refaire?

Invoquer des caractères enregistrés par @qœuvres, mais je ne le vois pas dans mes correspondances ( :map q- No mapping found).

Et il n'y a pas beaucoup d' informations dans l' aide en tapant: :help recording.

Kenorb
la source

Réponses:

42

Remarque: Je suppose que vous utilisez le aregistre pour l'intégralité de cette réponse, mais vous pouvez utiliser n'importe quel registre.

Note2: <1b>est Esc; vous pouvez insérer ceci avec Ctrl+vet ensuite Esc. Il peut également apparaître comme ^[(selon le displayréglage).


Ce n'est pas une cartographie; il est donc logique que :mapcela ne fonctionne pas. Il est enregistré dans un registre et vous pouvez le voir et le modifier comme n'importe quel registre.

Tout ce que cela qfait est "effacer ce registre et y ajouter une frappe" , et tout @simplement "évaluer un registre en tant que commande" .

Il n'y a rien de "différent" dans une macro, vous pouvez invoquer n'importe quel registre en tant que macro.


Pour voir, utilisez simplement:

:echo @a

Tout comme n'importe quel registre.

Vous pouvez également utiliser :registerspour afficher tous les registres.


Pour éditer, vous pouvez faire plusieurs choses:

La façon la plus simple d’affecter est la suivante @a:

:let @a='iasd<1b>'

Cela lancera le mode insertion ( i), l'insertion asdet le retour au mode normal.

Ce n'est pas très utile pour l'édition approfondie; vous pouvez utiliser des fonctions (ie. substitute()), ou peut-être ajouter quelque chose ( :let @a=@a . 'more'), mais changer quelque chose au milieu n'est pas si facile.

J'ai trouvé que le meilleur moyen pour cela est de commencer un nouveau tampon avec :splitou :tabnewet d'éditer le registre en l'insérant ici, en l'éditant puis en le recopiant.

Vous pouvez utiliser "apqui insérera le texte dans le tampon (où se atrouve votre registre):

iThis is A<1b>

Maintenant je peux juste changer la ligne en peut-être:

iThis is an edited macro<1b>

Ensuite, je ^v$"aytire (copie) cette ligne dans le aregistre:

  • ^ pour début de ligne
  • v pour le mode visuel
  • $ pour fin de ligne
  • "ay tirez la sélection pour vous inscrire a

Si vous le souhaitez, vous pouvez le faire sans utiliser le mode visuel avec ^"ay$.

Vous pouvez maintenant utiliser @a, comme si c’était ce que vous aviez enregistré à l’origine.

Vous pouvez également simplement utiliser yy, et ensuite @", ce qui est un peu plus rapide. Cela va également copier la fin de ligne, cependant, et peut causer des effets secondaires ... Une autre façon de rendre cela plus rapide consiste à utiliser une macro :-)

Martin Tournoij
la source
2
Je ferais remarquer que le fait d'insérer un mouvement ligne par ligne dans votre registre aura pour effet secondaire d'inclure un caractère de nouvelle ligne, comme si vous aviez appuyé Enterà la fin de votre enregistrement. Dans de nombreux cas, cela peut être bénin, mais dans les scénarios où vous avez soigneusement défini la position du curseur à la fin de l'enregistrement, cela peut affecter la répétabilité.
tommcdo
@tommcdo Right; vous pouvez simplement utiliser vet sélectionner la ligne entière (sans la nouvelle ligne).
Martin Tournoij
@Carpetsmoker " v^$"aypour tirer (copier) cette ligne dans le aregistre." Cela ne devrait-il pas ^précéder la v, et avec $vous ne copiez-vous toujours pas la nouvelle ligne? Je pense que ça devrait être: 0v$h"ay(oui péniblement long!)
joeytwiddle
2
@joeytwiddle non, $passe à la fin de la ligne, mais n'inclut pas la nouvelle ligne. C'est la différence entre 0y$et yy. Mettre haprès $signifie simplement que vous manqueriez le dernier caractère.
Evilsoup
Une chose que vous pouvez faire pour rendre l'édition: laissez les commandes @ a = type plus facilement modifiables est de taper: <Ctrl-f>, sélectionnez et modifiez la ligne concernée (la dernière ligne, par défaut, si vous modifiez la dernière ligne que vous avez entrée) en utilisant vim comme d’habitude. Appuyez sur Entrée lorsque vous avez terminé d'exécuter la ligne ou sur <Ctrl-c> pour quitter.
9

Pour avoir quelque chose à travailler avec ...

qajjjq

Va commencer à enregistrer une macro dans le aregistre.

Vous pouvez voir beaucoup de vos registres actuels (utilisés pour les macros, yanking, supprimer, etc.) avec la :regcommande, ou vous pouvez spécifier un registre à afficher en fournissant son nom. Par exemple, pour afficher le registre a:

:reg a

les rendements

--- Registers ---
"a   jjj

Vous pouvez ajouter à un registre nommé existant en utilisant la lettre majuscule correspondante. Cela ne fonctionne pas uniquement pour l'enregistrement de macros, mais également pour le retrait. Par exemple:

qAkkkq
:reg a

les rendements

--- Registers ---
"a   jjjkkk

Si vous souhaitez utiliser la syntaxe let pour modifier une macro existante, vous pouvez procéder comme suit:

let @a='<C-r>a'

qui s'étendra à

let @a='jjjkkk'

et vous pouvez ensuite modifier les frappes individuelles.

Notez que vous pouvez utiliser le <C-r>(c'est-à-dire, contrôle + r) pour coller de n'importe quel registre en mode ligne de commande (ou en mode insertion, d'ailleurs).

De plus, lorsque vous êtes en mode ligne de commande, si vous tapez <C-f>ceci, une fenêtre apparaîtra pour vous permettre de voir / modifier les commandes passées passées et de modifier votre commande en cours avant de l'appeler. Appuyez sur Entrée sur la commande que vous souhaitez soumettre.

L'avantage de ceci est que vous pouvez utiliser vos commandes de mouvement / substitution normales à l'intérieur de ce tampon pour modifier votre macro. Par exemple:

let @a='<C-r>a'<C-f>

fera apparaître:

:118 reg
:119 reg a
:120 let @a='jjjkkk'

Si vous êtes sur commande 120, vous pouvez faire:

s/kkk/}
<return>
:reg a

les rendements

--- Registers ---
"a   jjj}

Vous pouvez bien sûr coller le contenu du registre dans votre tampon et le changer ici. Mais vous pouvez faire tout ce dont vous avez besoin sans contaminer votre tampon de travail.

Zach Ingbretsen
la source