Quantcast

Lundi 12 mars 1 12 /03 /Mars 11:06
Les macro-commandes

Dans notre précédente excursion dans les arcanes de Vim, nous avons vu qu'il existait 3 grands groupes de commandes :
- les commandes de changement de mode
- les commandes de déplacement
- les commandes de coupé-copié-collé

Nous avons vu également que nous pouvions utiliser des multiplicateurs et définir des zones de textes. Le soucis de toutes ces commandes n'est il pas que, mêmes très puissantes, elles s'adaptent difficilement aux tâches répétitives ? Vim propose pour contrer cela d'enregistrer des séquences de commandes.

«qX» enregistre une suite de commandes dans le registre 'X' («q» pour arrêter l'enregistrement).
«@X» rejoue la suite de commande enregistrée dans le registre 'X'

Lorsque que vous passez en mode «enregistrement», toutes vos entrées clavier sont alors épiées et duemment enregistrées par Vim qui se fera une joie de vous ressortir la séquence dans l'ordre. Imaginez par exemple que vous ayiez une suite de temps en microsecondes séparés par des espaces et que vous voulez en faire une liste de lignes de temps en secondes.

Pressez vous en début de la ligne et rentrez «qa», la mention «recording» apparait en bas à gauche de Vim. Saisissez alors la suite de combinaisons suivantes :
«a.<ECHAP>f<ESPACE>is<ENTREE><ECHAP>q»

Nous avons rentré la suite de commandes nécessaire pour traduire un de nos temps, nous pouvons alors réitérer le scénario en appuyant sur «@a», mieux que cela, nous pouvons même demander à Vim de l'exécuter un certain nombre de fois pour nous en tapant «5@a».

Les délimiteurs
Ces macros commandes sont bien utiles pour nous faciliter la vie sur un grand ensemble de résultats. Le soucis est que lorsque l'on cherche à automatiser une tâches, il faut que tout le contenu se ressemble le plus possible. Or les travaux que nous cherchont à faire sur le texte inclue très souvent des blocs de tests bordés de délimiteurs tels que "()'{} ou même <tag></tag>.
Vim propose un moyen de ne sélectionner que ce qui est entre (ou avec) des délimiteurs donnés. Les touches «a» et «i» si elles sont précédées d'une commandes se comportent comme des déclarateurs de délimiteurs.

«a» pour sélectionner le contenu ET les délimiteurs.
«i» pour sélectionner le contenu des délimiteurs.


Par exemple
«da'»  efface le bloc délimité par '' (quotes comprises) sur la ligne courante.
«cit»  Efface le contenu du tag SGML, HTML ou XML de la ligne et passe en mode insertion.
«gUi"» passe sur la ligne, le contenu entre "" en majuscules.
«=i{» Indente le code compris entre les acolades courantes.


Pour finir, petite cerise sur le gâteau, il est possible d'afficher la commande en cours (partielle) dans la barre de status en tapant «:set showcmd»

Substitution
La substitution est une des grandes forces de Vim. Elles permet sur une zone de texte (par défaut l'ensemble du tampon), de substituer du texte par un autre en tirant parti des expression régulières. Les opérations de substitution et recherche ne prennent place que sur la ligne de commande Vim, elles sont donc précédées d'un «:».

«:s/un/deux/» Change la première occurence de "un" par "deux" sur la ligne courante.
«:%s/un/deux/g» Change toutes les occurerences (option «g» pour "gourmand") sur l'ensemble du tampon.
«:'<,'>s/un/deux/gc» Change toutes les occurerences de "un" par "deux" sur la précédente sélection visuelle en demandant confirmation.
«:%s/^/#/» Ajoute un "#" devant toutes les lignes du tampon.
«:%s/^#//» Supprime les "#" en début de ligne sur l'ensemble du tampon.


Si vous utilisez ces commandes dans vos scripts shells vous pourrez être confronté au problème d'échapper les caractères "/" contenu dans les motifs de vos recherches ou remplacements. Vim vous propose en fait de choisir vous même les délimiteurs de la commande de substitution pour vous éviter cette tracasserie:

«:s#/var/www#/home/greg/var/www#» change la première occurence de "/var/www" par "/home/greg/var/www" dans la ligne courante.

Ce dernier exemple pourrait encore soulever des remarques, les expressions régulières me permettent en effet de ne pas forcément savoir ce que je vais remplacer. Vim nous propose là encore un raccourci pratique : le "&". Il signifie "le texte qui correspond à ma recherche". Notre exemple précédent devient :

«:s#/var/www#/home/greg&#»

Imaginez maintenant que nous ayions une liste de noms prénoms séparés par des espaces et que nous souhaitions les inverser.

 Le support des expressions régulièrs de Vim et des groupes de correspondances va nous simplifier le problème en une ligne :
«:%s/(w+)s(w+)/2 1/»


Nous avons défini des groupes dans notre expression régulière par l'utilisation des "()" et nous remplaçons le tout par les groupes dans l'ordre inverse. Vim permet même certaines choses particulièrement intéressantes comme par exemple substituer en majuscules ou l'inverse voir même capitaliser. Nous allons remplacer notre liste toute en minuscule par le nom en majuscule avec une capitale sur la première lettre du prénom :
«:%s/(w+)s(w+)/u2 U1/»


La commande "globale"
Je vois d'ici des centaines d'idées germer dans vos cerveaux fertils. Mais cela devient vite insuffisant dès que l'on doit préciser que cette opération ne doit s'appliquer qu'à certains types de lignes, les expressions régulières deviennent vites très acrobatiques. Il existe une autre commande qui va vous éviter des acrobaties complexes : la commande "globale".

La commande "globale" «:g» permet par défaut de lancer un grep sur le tampon en court. Cette commande permet en fait de lancer une commande pour les lignes vérifiant le motif fourni. Ce dernier peut, là encore, être une expression régulière.

«:g/un/»  Affiche toutes les lignes du texte qui contiennent la chaîne "un" (utilise la commande «:p» par défaut).
«:g/un/#» La même chose mais avec les numéros de ligne.
«:g/deux/d» Efface toutes les lignes du texte qui contiennent "deux"
«:g!/^#/s/un/deux/gc» Remplace tous les "un" par des "deux" sur les lignes du textes ne commençant pas par "#" en demandant confirmation à chaque fois.
«:g/un/d A» Coupe les lignes contenant "un" et les met toutes dans le buffer nommé "a" (les buffer nommés en majuscules concatènent les ajouts).


Voila, j'espère que ce deuxième article vous sera utile et vous permettra de gagner du temps dans vos traitements de fichiers textes car c'est exactement le but de Vim. Nous n'avons évidemment pas couvert toutes les fonctionnalités de l'éditeur mais c'est également ce qui fait son "charme" : «des années d'utilisation et tous les jours quelque chose de nouveau».
Par greg - Publié dans : vim
Ecrire un commentaire - Voir les 0 commentaires
Retour à l'accueil
 
Créer un blog gratuit sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus - Articles les plus commentés