GNU/Linux >> Tutoriels Linux >  >> Linux

Macros Vim récursives :un pas de plus dans l'automatisation des tâches répétitives

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 (@ ). C'est l'essence même des macros récursives, qui s'appellent lorsqu'elles s'exécutent.

À 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 , n'exécutant rien et mettant fin à l'enregistrement.

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 , tapez toutes les commandes ci-dessus et terminez en appuyant sur q .

2) Définir le registre

Vous pouvez définir un registre à l'aide de la commande suivante :let @='' et l'utiliser plus tard comme relecture de macro. Dans ce cas, vous ne pouvez pas exécuter cette commande directement car la macro a des touches spéciales comme 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 \ à leur code clé ^[ 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 @ ou @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 @ comme dernière commande. Pensez également à un point d'arrêt pour votre macro. Si vous modifiez jusqu'à la fin du fichier, utilisez 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 .


Linux
  1. Fractionnement d'une grande arborescence de répertoires en morceaux de taille spécifiée ?

  2. Analyser un champ d'un tableau Json dans un tableau Bash ?

  3. MultiCD - Un script Shell pour combiner plusieurs ISO amorçables en un seul CD

  4. Fusionner/convertir plusieurs fichiers PDF en un seul PDF

  5. Comment fusionner deux bibliothèques ar statiques en une seule?

Comment joindre plusieurs lignes en une seule dans un fichier sous Linux

Comment fusionner plusieurs fichiers PDF en un seul PDF sous Linux

Comment joindre/fusionner plusieurs fichiers audio en un seul sous Linux

3 puissants mousquetaires de l'éditeur Vim - macro, marque et carte

Comment compresser plusieurs fichiers dans un seul fichier gz?

Combinez plusieurs commandes Unix en une seule sortie