Le récent article Utiliser les macros Vim pour automatiser les tâches fréquentes par Ricardo Gerardi a exploré ce qu'est une macro et les avantages de l'utilisation de macros pour automatiser les tâches répétitives. Dans cet article, vous allez aller plus loin et explorer quelles macros récursives sont des exemples où elles pourraient être utiles, et quelques pièges que vous pourriez rencontrer.
Le flux de travail des macros de base comprend l'enregistrement, la relecture et le profit. Lors de l'enregistrement, sélectionnez dans quel registre il le fera. Il existe des registres de a
à z
disponible.
[ Vous pourriez également aimer : Comment utiliser Ansible pour configurer Vim ]
Une fois que vous avez ouvert Vim, pour enregistrer une macro, commencez par appuyer sur q
et spécifiez le registre dans lequel l'enregistrer. Tapez ensuite une séquence de commandes à exécuter et q
pour terminer et sauvegarder l'enregistrement. Après cela, relancez la macro en appuyant sur @ et le registre.
Par exemple, enregistrez une macro comme qaA - suffixESCjq
, puis rejouez-le en appuyant sur @a
combien de fois nécessaire. Pour faciliter la relecture de la macro, après l'avoir exécutée une fois, tapez @@
pour le rejouer.
En savoir plus sur le fonctionnement des macros
Creuser un peu plus dans les macros et explorer certains de ses composants internes. Une macro cessera de s'exécuter si elle ne peut pas exécuter l'une de ses commandes. Par exemple, si f
( (ce qui signifie trouver ( et placez le curseur dessus ) ne peut pas être exécuté, la relecture de la macro s'arrêtera immédiatement. Vous pensez peut-être que c'est un problème, mais il s'agit en fait d'une fonctionnalité, et vous pouvez l'utiliser en votre faveur.
Lors de l'enregistrement d'une macro, une séquence de commandes est entrée. Cela signifie que vous pouvez utiliser n'importe quelle commande, y compris la macro d'exécution (@
À ce stade, vous pouvez simplement commencer à enregistrer et à rejouer certaines macros récursives. Mais avant de faire cela, regardez encore une chose avant de vous lancer directement. Lors de l'enregistrement d'une macro, les commandes saisies sont exécutées au fur et à mesure de l'enregistrement. Ainsi, si vous rejouez une macro dans le cadre de l'enregistrement et que le registre associé a déjà quelque chose d'enregistré, il s'exécute et apportera probablement des résultats inattendus.
Voici le premier conseil :assurez-vous que le registre est vide avant d'enregistrer une macro récursive. Effacer un registre en exécutant q
q
, ce qui équivaut à démarrer un enregistrement sur
Avec tout cela, il est enfin temps d'explorer certains scénarios où les macros récursives vous feront gagner du temps d'édition supplémentaire.
Enregistrer et rejouer des macros récursives
Pour commencer, prenons le problème résolu dans l'article précédent :Convertir le fichier CSV suivant produit par un système de surveillance hypothétique en un /etc/hosts
formater le fichier.
$ cat hosts.csv
Description,Hostname,IPAddress,FQDN
"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca
"OCP Master Node 2",ocpmaster02,192.168.0.21,ocpmaster02.home.ca
"OCP Master Node 3",ocpmaster03,192.168.0.22,ocpmaster03.home.ca
"OCP Worker Node 1",ocpnode01,192.168.0.30,ocpnode01.home.ca
"OCP Worker Node 2",ocpnode02,192.168.0.31,ocpnode02.home.ca
"OCP Worker Node 3",ocpnode03,192.168.0.32,ocpnode03.home.ca
"Ansible Host 1",ansibleh01,192.168.0.144,ansibleh01.home.ca
"Ansible Host 2",ansibleh02,192.168.0.145,ansibleh02.home.ca
Voici le résultat attendu :
192.168.0.20 ocpmaster01.home.ca ocpmaster01 #OCP Master Node 1
192.168.0.21 ocpmaster02.home.ca ocpmaster02 #OCP Master Node 2
192.168.0.22 ocpmaster03.home.ca ocpmaster03 #OCP Master Node 3
192.168.0.30 ocpnode01.home.ca ocpnode01 #OCP Worker Node 1
192.168.0.31 ocpnode02.home.ca ocpnode02 #OCP Worker Node 2
192.168.0.32 ocpnode03.home.ca ocpnode03 #OCP Worker Node 3
192.168.0.144 ansibleh01.home.ca ansibleh01 #Ansible Host 1
192.168.0.145 ansibleh02.home.ca ansibleh02 #Ansible Host 2
La macro qui a été enregistrée pour aider à convertir le format de fichier est la suivante :
0r#f"xldf,A,<ESC>p0df,$px:s/,/\t/g<ENTER>j
En supposant que vous venez d'ouvrir Vim et que la macro ci-dessus n'est pas encore enregistrée, vous avez quelques options pour remplir n'importe quel registre avec le contenu de la macro :
1) Enregistrez la macro et tapez toutes les commandes
Commencez par appuyer sur q
puis le q
.
2) Définir le registre
Vous pouvez définir un registre à l'aide de la commande suivante :let
@Esc
et Enter
. Pour contourner ce problème, utilisez le :execute
commande. Il permet de saisir les touches spéciales comme séquences d'échappement. En mode normal, tapez :
puis collez la ligne suivante et appuyez sur Enter
:
execute "let @h='0r#f\"xldf,A,\<Esc>p0df,$px:s/,/\\t/g\<Enter>j'"
Assurez-vous que le registre h
le contenu a été défini correctement. Cela peut être fait en exécutant :reg
ou : reg h
dans ce cas :
:reg h
--- Registers ---
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj
Le contenu du registre est légèrement différent de ce qui a été défini par le :execute
commande. C'est parce que :execute
converti \^[
et ^M
respectivement. C'est ce que Vim utilise en interne pour "appuyer" sur les touches.
A ce stade, le registre h
contient exactement la même macro enregistrée dans l'article Utiliser les macros Vim pour automatiser les tâches fréquentes. La prochaine étape consiste à le rendre récursif. De cette façon, vous pouvez le déclencher une fois, et il se répète de manière récursive jusqu'à ce qu'il atteigne la fin du fichier.
Il existe une petite astuce pour modifier la macro déjà enregistrée et la rendre récursive. Vous pouvez également l'utiliser pour ajouter des commandes manquantes et apporter des modifications sans enregistrer l'intégralité de la macro.
Commencez par :let @h='
, puis Ctrl-r
Ctrl-r h
, tapez @h'
à la fin, et enfin appuyez sur Enter
. Ctrl-r Ctrl-r
insère littéralement le contenu du registre. Il s'agit du même contenu affiché lors de l'inspection de :reg h
.
Pour vérifier si vous avez tout, exécutez :reg
et vérifier le contenu. Cela devrait ressembler à ceci :
:reg h
--- Registers ---
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj@h
Une fois cela en place, accédez à la deuxième ligne sur hosts.csv
et relancez la macro @@h
dans cet exemple. Il continuera jusqu'à la fin du fichier en mettant à jour toutes les lignes. C'était possible car la macro avait 0
au début et j
avant de se rejouer récursivement. Cela l'a fait descendre d'une ligne et lors de la réexécution de la macro, il a positionné le curseur au début de la ligne.
Aussi, observez que la macro est allée jusqu'à la fin du fichier et s'est arrêtée car elle ne pourra plus descendre avec j
c'était notre condition d'arrêt pour l'exécution récursive.
[ Vous souhaitez en savoir plus sur l'automatisation du système ? Démarrez avec The Automated Enterprise, un livre gratuit de Red Hat. ]
Récapitulez
Ce fut un long voyage, mais vous disposez désormais d'un autre outil pour vous aider à automatiser les tâches répétitives, même si cette tâche répétitive répète une macro encore et encore.
Vous avez également exploré l'édition d'une macro, donc à ce stade, vous êtes peut-être familiarisé avec l'enregistrement d'une macro à partir de zéro. Si vous enregistrez au lieu d'éditer une macro, assurez-vous de vider le registre cible avant de commencer et d'avoir @j
va le faire.
Un autre avantage d'une macro récursive est que si quelque chose ne va pas, il peut être inversé en utilisant un seul annuler .