Skip to main content

Utilisation de vi

Qu’est-ce que vi

vi est un éditeur de texte en mode terminal présent par défaut sur pratiquement tous les systèmes Unix et Linux. Il a été créé en 1976 par Bill Joy. Aujourd’hui, la plupart des distributions embarquent en réalité vim (Vi IMproved), une version améliorée et rétrocompatible.

vi fonctionne avec un système de modes :

  • Mode normal : mode par défaut, pour naviguer et manipuler le texte
  • Mode insertion : pour saisir du texte (touche i, a, o, etc.)
  • Mode commande : pour exécuter des commandes (touche :)
  • Mode visuel : pour sélectionner du texte (touche v)

On revient toujours au mode normal avec la touche Esc.

vi vs nano : il n’y a pas de débat

On entend souvent parler de la “guerre” entre vi et nano. Soyons honnêtes : il n’y a pas vraiment de match.

nano est un éditeur simple, accessible, qui fait le travail pour modifier vite fait un fichier de conf. C’est le Bloc-notes du terminal. C’est bien pour débuter, c’est bien pour dépanner, et c’est à peu près tout.

vi, en revanche :

  • Est disponible (presque) partout. Conteneur minimal, serveur durci, système embarqué : vi est généralement là. nano, pas forcément. Quelques exceptions existent (NixOS par exemple ne l’inclut pas par défaut), mais dans l’immense majorité des cas, on peut compter sur sa présence.
  • Propose un langage d’édition composable. Là où nano repose sur des raccourcis Ctrl+lettre à mémoriser un par un, vi fonctionne par combinaison : d (delete) + w (word) = supprimer un mot, c (change) + $ (fin de ligne) = modifier jusqu’à la fin de la ligne. Une fois la logique comprise, on n’a plus besoin de retenir des raccourcis.
  • Est extensible. Avec vim, on accède aux macros, à la complétion, au split, aux plugins, etc.
  • Rend plus rapide une fois la courbe d’apprentissage passée. Et elle est moins raide qu’on le dit.

Le seul argument en faveur de nano est sa facilité d’accès. Mais un admin qui passe ses journées dans un terminal a tout intérêt à investir quelques heures dans vi. Le retour sur investissement est immédiat.

Commandes essentielles

CommandeAction
h j k lGauche, bas, haut, droite
wMot suivant
bMot précédent
0Début de ligne
$Fin de ligne
ggDébut du fichier
GFin du fichier
:nAller à la ligne n (ex: :42)
Ctrl+fDescendre d’un écran
Ctrl+bMonter d’un écran
Ctrl+dDescendre d’un demi-écran
Ctrl+uMonter d’un demi-écran

Passer en mode insertion

CommandeAction
iInsérer avant le curseur
IInsérer en début de ligne
aInsérer après le curseur
AInsérer en fin de ligne
oNouvelle ligne en dessous
ONouvelle ligne au-dessus

Édition

CommandeAction
xSupprimer le caractère sous le curseur
ddSupprimer la ligne
5ddSupprimer 5 lignes
dwSupprimer jusqu’au mot suivant
d$Supprimer jusqu’à la fin de la ligne
CSupprimer jusqu’à la fin de la ligne et passer en insertion
yyCopier la ligne
5yyCopier 5 lignes
pColler après le curseur
PColler avant le curseur
uAnnuler
Ctrl+rRétablir
.Répéter la dernière action

Fichiers et commandes externes

CommandeAction
:r fichierInsérer le contenu d’un fichier sous le curseur
:n fichierOuvrir un autre fichier
:!commandeExécuter une commande shell (ex: :!ls /tmp)

Marques (bookmarks)

Les marques permettent de poser des repères dans le fichier pour y revenir rapidement ou pour définir des zones de texte.

CommandeAction
mlPoser la marque l à la position du curseur
'lAller à la ligne de la marque l
`lAller à la position exacte de la marque l
y'lCopier de la position actuelle jusqu’à la marque l
d'lSupprimer de la position actuelle jusqu’à la marque l

On peut utiliser n’importe quelle lettre minuscule (a-z) comme marque locale au fichier. Exemple concret : on pose une marque l en haut d’un bloc avec ml, on descend à la fin du bloc, puis y'l copie tout le bloc. Il suffit ensuite de p pour le coller.

Recherche et remplacement

CommandeAction
/motifRechercher vers le bas
?motifRechercher vers le haut
nOccurrence suivante
NOccurrence précédente
:%s/ancien/nouveau/gRemplacer toutes les occurrences dans le fichier
:s/ancien/nouveau/gRemplacer sur la ligne courante
:%s/ancien/nouveau/gcRemplacer avec confirmation

Sauvegarder et quitter

CommandeAction
:wSauvegarder
:qQuitter
:wqSauvegarder et quitter
:q!Quitter sans sauvegarder
:xSauvegarder et quitter (équivalent à :wq)
ZZSauvegarder et quitter (mode normal)

Fenêtres et onglets

CommandeAction
:split fichierDiviser horizontalement
:vsplit fichierDiviser verticalement
Ctrl+w puis wBasculer entre les fenêtres
Ctrl+w puis qFermer la fenêtre
:tabnew fichierOuvrir un onglet
gtOnglet suivant
gTOnglet précédent

Les macros

Les macros permettent d’enregistrer une séquence de commandes et de la rejouer autant de fois que nécessaire. C’est l’une des fonctionnalités les plus puissantes de vi pour les tâches répétitives.

Enregistrer une macro

  1. En mode normal, appuyer sur q suivi d’une lettre (le registre) : par exemple qa pour enregistrer dans le registre a
  2. Effectuer les actions souhaitées
  3. Appuyer sur q pour arrêter l’enregistrement

Rejouer une macro

@a        → jouer la macro du registre a
5@a       → jouer la macro 5 fois
@@        → rejouer la dernière macro exécutée

Exemple pratique

On a un fichier avec une liste de serveurs et on veut ajouter le suffixe .internal.local à chaque ligne :

web01
web02
db01
db02

On se place sur la première ligne et on enregistre :

qa          → début de l'enregistrement dans le registre a
A           → aller en fin de ligne et passer en insertion
.internal.local → taper le suffixe
Esc         → retour en mode normal
j           → descendre d'une ligne
q           → fin de l'enregistrement

On joue ensuite la macro sur les lignes restantes :

3@a         → appliquer la macro 3 fois (pour les 3 lignes restantes)

Résultat :

web01.internal.local
web02.internal.local
db01.internal.local
db02.internal.local

Voir le contenu d’une macro

Pour afficher ce qui est enregistré dans un registre :

:reg a

Astuce

Il est possible de sauvegarder ses macros les plus utiles dans son fichier ~/.vimrc :

let @a = 'A.internal.local\<Esc>j'