A propos de Vi

Au démarrage de ma carrière, j’ai eu le choix comme la plupart des utilisateurs d’Unix ou de Linux de travailler avec les éditeurs de texte Vi et Emacs.

Comme en plus du développement C je participais aux installations de machines, j’ai laissé tomber Emacs qui n’était jamais installé d’origine sur les serveurs contrairement à Vi qui était installé par défaut sur tous les Unix.

C’est ainsi que, finalement je n’ai plus utilisé que Vi pour faire du développement C comme un bon tiers des développeurs avec qui je travaillais à la fin des années 80.

Depuis bien des années Vim a pris la place de Vi et quand je fais le bilan de mon utilisation de Vim, je note que j’en suis quasiment resté à la stricte utilisation de Vi ! Et dans Vi, je n’utilise pas plus d’un vingtaine de commandes !!!

Le bilan, c’est qu’avec les années, je connais le minimum de commandes qui me permettent de faire le maximum (tout faire ou presque) !

Quelle est la liste des commandes que j’utilise ?

En mode commande pour me déplacer

Dans cet article, j’écris les touches comme elles sont écrites sur le clavier :
j minuscule sera écrit J dans le texte qui suit.
j majuscule sera écrit Maj+J. S’il n’y a pas Maj, c’est que c’est une minuscule.

A noter que les commande ont très souvent une signification qu’il faut absolument connaître pour pouvoir les mémoriser « facilement ».

Je me déplace avec les lettres H, J, K, L, ou W (word) et B (backward) et parfois « espace ». Ca permet de conserver les touches naturelles à beaucoup de programmes Unix/Linux. Je n’utilise jamais les flèches du pavé numérique. D’ailleurs je n’utilise jamais le pavé numérique sur les consoles, car lorsque j’installais des serveurs Unix dans les années 80, les pavés numériques n’était jamais reconnus… Maintenant, ils le sont, mais je suis bien content de ne pas avoir à les utiliser, comme ça sur les portables, je continue à utiliser les mêmes touches.

Pour me déplacer plus vite, j’utilise Ctrl+U et Ctrl+D pour défiler par demi écrans, ça permet de conserver un oeil et de faire la liaison avec le texte qu’on vient de voir, pour les fichiers de configuration par exemple.

Et Ctrl+F (forward) Ctrl+B (backward) pour défiler par écran, par exemple les fichiers de logs…

G pour aller à la fin de l’écran, et 1G pour aller au début, ou nG pour aller ligne n. Ctrl+G pour savoir où je suis dans le fichier.

Et /chaîne pour chercher la « chaîne » de caractère et N pour chercher dans l’autre sens. J’utilise très rarement ?chaîne qui est la recherche vers le haut… Je fais / puis N pour repartir dans l’autre sens.

Pour éditer

Quelques basiques

O ou Maj+O pour Ouvrir (Open) une nouvelle ligne au-dessous ou au-dessus du curseur
A ou Maj+A pour ajoute (Append) après le curseur ou à la fin de la ligne
I ou Maj+I pour insérer (Insert) avant le curseur ou au début de la ligne

Suppressions

X, 2X, nX…. pour supprimer 1, 2 ou n caractères, DD, 2DD, nDD pour supprimer 1, 2 ou n lignes.
Mais aussi DW, 2DW, NDW pour supprimer 1, 2 ou 3 mots.
CW (change word) pour remplacer un mot par un autre

Les marques

Les marques permettent de sélectionner des blocs, en mode natif et non pas en mode « visual ». J’utilise toujours une seule marque avec la lettre « A ».
En mode commande, je tape MA, la ligne sous le curseur correspond à la marque A.
Le rappel de la marque, se fait par 'A. En mode commande dès qu’on tape 'A, on indique la ligne qu’on avait marquée A.

Donc si on marque une ligne, qu’on va 3 lignes plus bas, et qu’on saisit D'A, on supprime les trois lignes entre la marque A et le curseur !
Si on s’est trompé, il suffit de taper U pour undo ou Maj+P pour les coller au dessus du curseur. Notre buffer courant contient les 3 lignes, qu’on peut recoller à volonté avec P ou Maj+P !

On peut décaler la ligne courante, le shiftwidth en langage Vi, vers la droite ou vers la gauche avec >> et << . Mais on peut l’appliquer à toutes les lignes entre le curseur et la marque : >'A ou <'A

L’utilisation du buffer

C’est un des principes de l’informatique que permettent les buffers. Faire du copier/couper/coller. A chaque fois qu’on supprime, par X, DD, nX, nDD, on remplit le buffer courant, qui peut être collé avec P ou Maj+P.

Mais on peut aussi mettre dans le buffer sans couper, en copiant :
YY, Maj+Y pour copier la ligne courante (yanked), 2Maj+Y, nMaj+Y pour copier 2 lignes, n lignes, qu’on pourra coller avec P ou Maj+P

On peut aussi mettre un bloc dans le buffer, avec une marque.
Si j’ai mis une marque 3 ligne au-dessus de mon curseur, si je tape Y'A, je mets dans le buffer les lignes qui se trouvent entre mon curseur et la marque A.

La répétition de la dernière commande

On a vu quelques commandes un peu plus complexes, comme par exemple décaler un bloc vers la droite en tapant >'A

Taper . exécute à nouveau la commande précédente. Donc si on veut décaler le bloc d’un shiftwidth supplémentaire (>>), il suffit de taper .

D’une manière plus générale, . exécute à nouveau la dernière modification que l’on vient d’effectuer là où se trouve le curseur. Si on supprime une ligne avec DD, . supprime à nouveau une ligne, . la suivante, etc…

Si on insère un ; à la de la ligne, avec la suite de touches : Maj+A pour ajouter en fin de ligne, ; et Esc pour finaliser la saisie, si on se place sur une autre ligne et qu’on tape . on ajoute le ; à la fin de la ligne courante !

Mais ça marche aussi avec les remplacement, les suppressions, les insertions.

Par exemple, si dans un fichier je dois remplacer www.arditi.fr par alain.arditi.fr, je vais faire la recherche « /www.arditi.fr » puis CWalainEsc qui va remplacer www par alain. Si je me positionne sur le www.arditi.fr suivant, grâce à N (next), . va refaire le remplacement de www par alain. Et je peux continuer ainsi avec N., N., N. !!!!

Cette facilité à ré-exécuter des commandes plus ou moins complexes, mais une commande unique malgré tout, va nous contraindre à trouver comment faire des modifications en une seule commande, de manière à pouvoir la répéter avec . !!

C’est avec cet objectif en tête qu’on va travailler sous Vi quand on fait des modifications de fichiers de configuration. Activité d’édition quasiment majoritaire d’un administrateur système.

Par exemple, si je veux remplacer www.arditi.fr par alain.arditi.net, si je fais un CW pour alain et un autre CW pour net, le . n’exécutera que la dernière des deux commandes…. Si je veux utiliser . il faut que je trouve commande modifier tout d’un coup. Un moyen simple, c’est de compter les mots (words) et changer le bon nombre de mots. Ici 5CW remplace www.arditi.fr, il faut saisir alain.arditi.net puis Esc. N. fera le même remplacement sur le prochain www.arditi.fr !!!

Petit à petit, on essaie de trouver comment modifier d’un seul coup le bloc qu’on cherche à remplacer plusieurs fois !

D’où l’intérêt des commandes :

CW, CMajW pour changer jusqu’au prochain espace, C$ pour changer jusqu’à la fin de la ligne ou C/pattern pour changer jusqu’à la pattern !!! Mais dans ce dernier cas, le N suivant prend la pattern….
Il y a quelques tricks à connaître. Mathieu Blanc qui a travaillé quelques années avec moi, utilise 7CW pour remplacer une adresse IPV4. Après l’avoir fait quelques fois, ça reste à tout jamais ancré dans le cerveau !

Alors vous me direz, mais pourquoi ne pas utiliser, le mode commande :
:1,$ s/www.arditi.fr/alain.arditi.net/g
Parce que dans le mode commande, on remplace tout. Notez le s pour substitute. Alors, on pourrait le faire 1 par 1, mais dans la pratique, pour un fichier de configuration avec quelques remplacements, j’utilise C, car je vois la ligne avant chaque remplacement et quand il y a beaucoup de remplacements, largement plus d’une dizaine, j’utilise :s, car là, il faut souvent travailler plus finement le remplacement…

Commenter un bloc

Il y a des cas, où il est intéressant de mettre un bloc en commentaire, c’est à dire, mettre des # en début de ligne dans un Shell script.

Alors, on peut faire I#Esc pour insérer le #, puis J pour aller à la ligne suivante et taper ., puis J., J., etc…

Mais on peut, lorsque le bloc est plus grand que quelques lignes, passer en mode visual et insérer le # pour toutes les lignes du bloc :
Ctrl+V passage en mode bloc
Sélectionner le bloc avec les flèches, et laisser le curseur en début de ligne, puis taper
Maj+I#Esc et tout le bloc va se retrouver avec un # en début de ligne.

Effacer ses modifications

Avec U ou Maj+U on peut effacer une modification et revenir en arrière, mais on peut aussi revenir au fichier dans l’état de sa dernière sauvegarde avec :e! On relit le fichier en cours depuis le disque.

Sauvegarder son travail

Il y a plusieurs manières de quitter Vi, plus d’une dizaine, plus ou moins subtiles. Mais j’utilise le set minimal suivant, par ordre d’utilisation :

:WQ sauvegarde et quitte (write and quit)
:Q! quitter sans sauvegarder
:W! pour sauvegarder alors qu’on n’a pas les droits d’écriture, puis :Q quitter
:Wnom_de_fichier quand on n’a pas réussi à écraser le fichier par la commande précédente. On sauvegarde dans un nouveau fichier.

D’une manière générale, si on ne souhaite pas modifier un fichier, mais uniquement voir son contenu, le mieux est d’utiliser les commandes « less » ou « view ».
« view » est l’équivalent de « Vi » en mode lecture seule.
Si une fois dans « less » ou »view » vous souhaitez faire une modification, alors dans « less » taper :v et dans « view » faire les modifications comme dans Vi et terminer par :w! pour sauvegarder en passant outre la contrainte « lecture seule ».

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.