Olivier Poncet
Directeur Technique · CTO

Vi : l'éditeur de texte atypique

cover🔗 publié par Olivier Poncet le 22/02/2017 à 12:00

« vi » … Les informaticiens devant travailler sous UNIX, Linux ou BSD, qu’ils soient exploitants, ingénieurs de production, administrateurs système, développeurs, etc … ont déjà entendu ce nom. Et pour ceux qui ont dû travailler avec cet éditeur de texte, pour la plupart d’entre-eux cela leur rappelle une expérience - disons - spéciale, voire frustrante, car « vi » est un éditeur de texte très atypique, du fait de son mode de saisie pouvant sembler totalement contre-intuitif. Et pourtant …

Je vais essayer de démystifier l’ovni qu’est « vi » pour que vous puissiez enfin l’utiliser sans en avoir peur … Voire en tomber amoureux et du coup abandonner votre éditeur de texte favori.

Pour l’anecdote, tous les textes de mon blog sont saisis sous « vim », le clone de « vi » le plus puissant et le plus répandu.

Retour dans le passé

Projetons nous quarante ans plus tôt. Plus précisément cette superbe année 1976 où « vi » est né (comme moi d’ailleurs). Bill Joy, alors étudiant à l’université de Californie, située à Berkeley (UCB - University of California, Berkeley), travaille sur un nouveau mode d’édition de texte visuel pour l’outil « ex », outil fonctionnant sous UNIX et permettant d’éditer du texte, mais seulement ligne à ligne. De part sa simplicité, sa puissance et les améliorations qu’il apporte par rapport à « ex », ce nouveau mode d’édition visuel est très rapidement adopté par les utilisateurs de l’époque, tant et si bien que lors de la première release de BSD Unix en 1978, il devient de-facto l’éditeur de base du système sous le nom de « vi » (signifiant simplement « VIsual mode »). Bon, le fait que Bill Joy était responsable de produire cette première release de BSD n’y est peut-être pas étranger non plus.

Petite note sur sa prononciation : cela ne se prononce pas « vé-i », mais « vie-aïe ». Le fait que cela représente le chiffre romain « 6 » est totalement le fruit du hasard, ne cherchez pas de relation particulière entre les deux.

Bon, c’était la version résumée très rapidement de l’histoire. Pour la version longue, vous pourrez la trouver en cherchant un tout petit peu sur internet. On va maintenant passer aux choses sérieuses …

Fonctionnement

Les modes

Pour commencer, il est important de comprendre que « vi » est un éditeur modal, c’est à dire qu’il possède deux modes principaux :

  • un mode commande.
  • un mode insertion.

Le mode par défaut est le mode commande. Pourquoi vous direz-vous ? Et bien cela permet de spécifier à l’éditeur comment vous allez éditer le texte que vous allez saisir, modifier, supprimer, etc … Cela vous paraîtra plus clair dans quelques instants.

Le mode « commande »

C’est le mode principal de « vi ». C’est aussi celui qui lui offre toute sa puissance et qui permet à l’utilisateur d’être productif.

Tout d’abord il faut comprendre que « vi » possède plusieurs commandes, toutes matérialisées par une lettre, voire deux, ces commandes pouvant être altérées à l’aide de modificateurs.

Le mode « insertion »

Le mode insertion permet simplement de saisir les caractères de votre texte. Ici rien de bien extravagant. Pour revenir au mode commande, il suffit de frapper la touche Echap.

Commandes

Ce billet n’a pas la prétention de remplacer la documentation de « vi ». Seront listées ci-après la majorité des commandes, mais en aucun cas l’intégralité. Le nombre de commandes peut effrayer, mais au final les noms sont logiques et simples à retenir.

Il est à noter que l’immense majorité des commandes peuvent être précédées d’un nombre permettant de signaler combien de fois la commande doit-être répétée.

  • 3dd signifie « couper 3 lignes ».
  • 5cw signifie « modifier 5 mots ».
  • 10Ifoobar{Echap} signifie « ajouter 10 fois le mot foobar en début de ligne ».
  • 80aZ{Echap} signifie « ajouter 80 fois le caractère Z après le caractère courant ».

De même certaines commandes comme copier/couper/coller peuvent être précédées d’un nom de tampon avant le nombre de répétitions. Ce nom de tampon est le caractère double-quote suivi d’une lettre minuscule de d’alphabet.

  • "ayy signifie « copier la ligne courante dans le tampon a ».
  • "z5p signifie « coller 5 fois ce qui est contenu dans le tampon z ».

Pour résumer, la majorité des commandes peuvent être saisies ainsi :

  • {commande}
  • [répétitions]{commande}
  • [tampon][répétitions]{commande}

Gestion des fichiers

Commande Description
:e recharge le fichier s’il n’y a pas eu de modifications
:e! recharge le fichier même s’il y a eu des modifications
:e {fichier} édite le fichier spécifié
:r ajouter le fichier courant après la ligne courante
:r {fichier} ajouter le fichier spécifié après la ligne courante
:w {fichier} enregistre dans le fichier spécifié
:n passe au fichier suivant
:q quitter s’il n’y a pas eu de changements
:q! quitter même s’il y a eu des changements
:wq enregistrer et quitter
:x enregistrer si le fichier a été modifié et quitter
ZZ enregistrer s’il y a eu des changements et quitter

Se déplacer

Commande Description
h déplace le curseur à gauche
j déplace le curseur en bas
k déplace le curseur en haut
l déplace le curseur à droite
w déplace le curseur vers le début du mot suivant
W déplace le curseur vers le début du mot suivant délimité par un espace
b déplace le curseur vers le début du mot précédent
B déplace le curseur vers le début du mot précédent délimité par un espace
e déplace le curseur vers la fin du mot courant/suivant
E déplace le curseur vers la fin du mot courant/suivant délimité par un espace
( déplace le curseur vers le début de la phrase courante
) déplace le curseur vers le début de la phrase suivante
{ déplace le curseur vers le paragraphe précédent
} déplace le curseur vers le paragraphe suivant
% se déplace vers le caractère associé « () », « {} » ou « [] »
0 déplace le curseur au début de la ligne
$ déplace le curseur à la fin de la ligne
G déplace le curseur à la dernière ligne
{n}G déplace le curseur vers la ligne {n}
f{c} déplace le curseur vers le caractère {c} suivant
F{c} déplace le curseur vers le caractère {c} précédent
T déplace le curseur en haut de l’écran
M déplace le curseur au milieu de l’écran
L déplace le curseur en bas de l’écran
:{ligne} déplace le curseur vers la ligne spécifiée
Ctrl+B remonter d’une page
Ctrl+F descendre d’une page
Ctrl+G affiche les informations sur la dernière ligne

Editer

Commande Description
a ajoute du texte après le curseur
A ajoute du texte en fin de ligne
i insère du texte avant le curseur
I insère du texte en début de ligne
o ajoute une ligne après la ligne courante
O ajoute une ligne avant la ligne courante
r remplace le caractère courant
R remplace une suite de caractères
x efface le caractère courant
X efface le caractère précédent
J joindre la ligne suivante à la ligne courante

Modifier

Commande Description
C modifie du caractère courant jusqu’à la fin de ligne
cc modifie toute la ligne
cw modifie du caractère courant jusqu’à la fin du mot
c$ modifie du caractère courant jusqu’à la fin de ligne

Copier

Commande Description
Y copie la ligne courante
yy copie la ligne courante
yw copie du caractère courant jusqu’à la fin du mot
y$ copie du caractère courant jusqu’à la fin de ligne
:y copie la ligne courante

Couper

Commande Description
D coupe du caractère courant jusqu’à la fin de ligne
dd Coupe la ligne courante
dw coupe du caractère courant jusqu’à la fin du mot
d$ coupe du caractère courant jusqu’à la fin de ligne
:d coupe la ligne courante

Coller

Commande Description
p colle ce qui est présent dans le tampon après le curseur ou après la ligne courante
P colle ce qui est présent dans le tampon avant le curseur ou avant la ligne courante

Divers

Commande Description
. répéter la commande précédente
~ inverser la casse des caractères
u défaire
Ctrl+R refaire

Chercher

Commande Description
/{regex} recherche en avant l’expression régulière
?{regex} recherche en arrière l’expression régulière
n recherche l’occurrence suivante
N recherche l’occurrence précédente

Remplacer

Commande Description
:s/{regex}/{chaine}/{drapeaux} remplace l’expression régulière avec la chaine spécifiée
  • Le drapeau c demande une confirmation pour chaque occurrence.
  • Le drapeau g permet de remplacer toutes les occurrences de chaque ligne.

Entraînez-vous

Avec un peu d’exercice, votre productivité est rapidement décuplée. La mise de fond étant d’apprendre les commandes de base, le reste n’étant que pratique. Avec une bonne pratique des expressions régulières, editer des textes avec « vi » devient une tâche incroyablement simple et rapide, le tout sans que les mains ne quittent jamais le clavier.

What else ?

J’espère que dorénavant vous n’aurez plus peur d’utiliser « vi » et qu’il deviendra pour vous un outil d’édition de texte que vous utiliserez naturellement.