Dans Vim, une macro est une fonctionnalité qui vous permet d'enregistrer une séquence de commandes que vous utilisez pour effectuer une tâche donnée. Vous exécutez ensuite cette macro plusieurs fois pour répéter le même travail de manière automatisée.
Les macros rendent gérables les tâches fastidieuses et répétables en exécutant la tâche une seule fois, puis en utilisant la puissance de Vim pour l'automatiser. Les macros améliorent votre flux de travail et vous font gagner beaucoup de temps.
Dans cet article, nous allons explorer le concept des macros Vim en l'appliquant à un exemple pratique.
Le problème
Supposons que vous receviez un fichier CSV contenant une liste d'hôtes de votre réseau à partir d'un système de surveillance hypothétique. Vous voulez le convertir en /etc/hosts
format pour activer la résolution de noms locale pour les hôtes.
Le fichier d'origine est celui-ci :
$ 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
La sortie attendue est la suivante :
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
Pour obtenir la sortie attendue, vous devez modifier l'entrée en changeant la position de certains champs, en supprimant les guillemets et en insérant des caractères de tabulation ou de commentaire (# ) de manière appropriée. Utilisons les macros Vim pour gérer cette tâche.
Résolvez le problème et enregistrez la macro
Le flux de travail de base d'une macro Vim consiste à enregistrer vos commandes et vos frappes tout en effectuant les modifications nécessaires pour résoudre le problème sur la première ligne, en enregistrant la séquence de commandes dans un registre, puis en rejouant la macro pour faire de même sur les lignes restantes.
Pour enregistrer une macro et la sauvegarder dans un registre, tapez la touche q suivi d'une lettre de a à z qui représente le registre pour enregistrer la macro, suivi de toutes les commandes que vous souhaitez enregistrer, puis tapez la clé q à nouveau pour arrêter l'enregistrement.
q<register><commands>q
Par exemple, pour enregistrer une macro de base qui insère une nouvelle ligne et l'enregistrer pour enregistrer a , utilisez cette séquence :
qao<ESC>q
Bien que cette macro ne soit pas utile, elle illustre la séquence requise pour enregistrer toute autre macro.
L'enregistrement de macros dans Vim est un exercice de logique et d'utilisation appropriée des commandes Vim. Gardez à l'esprit que vous voulez que cette macro soit reproductible sur d'autres lignes, même si l'entrée varie quelque peu. Par exemple, il est préférable d'utiliser la commande dw pour supprimer un mot plutôt que de répéter la commande x pour supprimer des caractères, car le nombre de caractères dans le mot peut varier d'une ligne à l'autre.
Maintenant, enregistrons une macro qui convertit la première ligne de notre fichier CSV au format requis et enregistrons-la sur le registre h . Commencez par placer le curseur n'importe où sur la première ligne que nous voulons modifier dans le fichier :
"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca
Ensuite, commencez à enregistrer la macro en appuyant sur q et h pour l'enregistrer pour enregistrer h :
qh
Pendant que vous enregistrez la macro, la ligne d'état en bas affiche ce message :
recording @h
Ensuite, il est recommandé de déplacer votre personnage vers une position connue, de sorte que la macro fonctionne de la même manière indépendamment de l'emplacement du curseur au démarrage de la macro. Utilisons le début de la ligne comme point de départ en appuyant sur 0 :
0
Ce premier champ est la description, qui devient le commentaire à la fin de la ligne dans la sortie. Pendant que vous y êtes, remplacez le guillemet " caractère avec le caractère de commentaire # , nous n'avons donc pas besoin de le faire lorsque nous déplacerons ce champ à la fin de la ligne plus tard :
r#
Ensuite, supprimez le guillemet suivant en déplaçant le curseur dessus à l'aide du f commande et en appuyant sur x pour le supprimer :
f"x
À ce stade, votre première ligne ressemble à ceci :
#OCP Master Node 1,ocpmaster01,192.168.0.20,ocpmaster01.home.ca
Ensuite, déplacez le curseur d'une position vers la droite en utilisant l , et supprimez le nom d'hôte entier jusqu'à la prochaine virgule :
ldf,
N'oubliez pas que lorsque vous supprimez du texte dans Vim, vous le copiez également. Maintenant, collons-le à la fin de la ligne. Insérez du texte à la fin en utilisant A et en insérant une virgule, puis appuyez sur
A,<ESC>p
Maintenant, les champs sont presque dans l'ordre souhaité. Déplaçons le commentaire à la fin de la ligne. Pour ce faire, déplacez le curseur au début avec 0 , et en supprimant tout le commentaire jusqu'à la virgule suivante avec df, :
0df,
Ensuite, déplacez le curseur à la fin de la ligne avec $ , collez le texte avec p , et supprimez la virgule finale avec x :
$px
Tous les champs sont maintenant dans la position souhaitée, et votre ligne ressemble à ceci :
192.168.0.20,ocpmaster01.home.ca,ocpmaster01,#OCP Master Node 1
Enfin, remplacez toutes les virgules par un caractère de tabulation en utilisant les s commande :
:s/,/\t/g<ENTER>
La ligne correspond à la sortie souhaitée :
192.168.0.20 ocpmaster01.home.ca ocpmaster01 #OCP Master Node 1
Terminez votre macro en déplaçant le curseur sur la ligne suivante en appuyant sur j afin que vous puissiez utiliser la macro à plusieurs reprises. Enfin, arrêtez l'enregistrement en appuyant sur q :
jq
Vous avez enregistré une macro et elle est prête à être utilisée. Voyons comment vous pouvez le vérifier ensuite.
Afficher et charger des macros
Étant donné que les macros sont enregistrées dans les registres Vim, vous pouvez afficher les macros enregistrées à l'aide de la commande :reg pour voir le contenu de tous les registres :
:reg
--- Registers ---
"" ,
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj
"- ,
...
Vous pouvez également consulter le registre spécifique, dans notre registre de cas h, en le fournissant en paramètre au :reg commande :
:reg h
--- Registers ---
"h 0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj
En utilisant les deux méthodes, vous pouvez voir le contenu du registre h correspond à la macro que nous avons enregistrée auparavant. Notez que les caractères spéciaux comme ESC et ENTRER ont été remplacés par la représentation Vim ^[ et ^M respectivement.
Vous pouvez également charger des macros dans des registres. Tout d'abord, copiez le contenu de la macro et collez-le dans une ligne vide du tampon. Remplacez ensuite les caractères spéciaux par leur représentation Vim en utilisant Ctrl+v+
"hy$
Ensuite, rejouons la macro pour mettre à jour les lignes restantes dans le fichier.
Rejouer les macros
Après avoir enregistré la macro et vérifié son contenu, utilisez la macro pour effectuer les mêmes modifications sur les lignes restantes.
Pour rejouer la macro une fois, déplacez le curseur sur la ligne suivante et appuyez sur @h où h représente le registre sur lequel vous avez enregistré la macro.
Notez que la macro déplace automatiquement le curseur vers la ligne suivante selon les besoins. Cela vous permet de répéter son exécution. Pour répéter l'exécution de la macro, appuyez sur @@ .
Enfin, vous pouvez répéter la macro sur toutes les lignes restantes en utilisant Vim number
Cela fonctionne bien si vous savez exactement combien de fois vous voulez exécuter la macro. Si vous souhaitez exécuter la macro sur toutes les lignes jusqu'à la fin du fichier, quel que soit le nombre de lignes existantes, utilisez cette syntaxe :
:%:normal @h
Toutes les lignes du fichier correspondent maintenant à la sortie attendue. Pour terminer les modifications, supprimez la ligne de titre au début.
Quelle est la prochaine ?
Les macros Vim sont une ressource puissante qui vous permet d'étendre les fonctionnalités de Vim et d'exécuter rapidement des tâches complexes.
Vous pouvez voir les avantages de l'exécution d'une macro dans un fichier de huit lignes. Imaginez si vous deviez faire quelque chose de similaire dans un fichier contenant des centaines ou des milliers d'entrées. Vous pouvez même tester cela en copiant ces huit lignes et en les collant des centaines de fois, puis en réappliquant la macro.
Si vous utilisez des macros sur un fichier avec des milliers de lignes, jetez un œil au set lazyredraw commande pour améliorer les performances. Ce paramètre empêche Vim de redessiner l'écran à chaque itération de la macro.
La création de macros Vim vous oblige à penser et à exécuter des tâches de manière optimisée. C'est un bon exercice lorsque vous utilisez Vim pour réfléchir à la façon d'effectuer des tâches de manière à les rendre répétables et vous permettre de les convertir en macros si nécessaire.
En faisant cela, vous devenez plus compétent avec Vim et, en retour, vous bénéficiez de fonctionnalités plus avancées pour améliorer votre flux de travail et gagner du temps.
[ Vous voulez en savoir plus sur Vim ? Téléchargez cette feuille de triche Vim gratuite. ]