06 · Éditeur Vi

moyen  ·  Durée estimée : 30 min

🎯 Objectif

Maîtriser vi, l'éditeur de texte omniprésent sur tous les systèmes Unix/Linux depuis 1976. Il est souvent le seul éditeur disponible sur un serveur minimal, et il est obligatoire de savoir s'en servir pour éditer un fichier de configuration.

Sur Alpine et Kali, la version moderne s'appelle vim (vi improved). Les commandes de base sont identiques.

1. Installer vi/vim

Sur Alpine, vi est fourni par BusyBox mais limité. Pour avoir une vraie version complète :

apk add vim

Vérifie l'installation :

vi --version
Sur Kali, vim est installé par défaut. Le raccourci vi pointe souvent vers vim.
2. Les trois modes de vi

C'est LA notion à comprendre. Vi fonctionne différemment de tous les éditeurs modernes : il a plusieurs modes, et le clavier fait des choses différentes selon le mode.

Mode normal (par défaut)

Les touches du clavier sont des commandes : déplacer le curseur, supprimer, copier, coller, etc. C'est le mode dans lequel tu arrives en ouvrant vi.

Mode insertion (édition)

Les touches tapent du texte normalement. Tu y entres avec i, a, o, etc. Tu en sors avec Échap.

Mode commande (ligne de commande)

Tu tapes : depuis le mode normal, puis une commande comme w (sauvegarder), q (quitter), wq (sauvegarder et quitter). Termine par Entrée.

Si tu tapes du texte qui ne s'affiche pas comme prévu, c'est que tu n'es probablement pas dans le bon mode. Réflexe : appuie sur Échap pour revenir au mode normal.
3. Ouvrir un fichier
vi mon_fichier.txt

Si le fichier n'existe pas, vi le crée à la première sauvegarde. Si tu quittes sans sauvegarder, il disparaît.

Ouvrir un fichier à une ligne précise :

vi +25 fichier.txt      # ouvre à la ligne 25

Ouvrir plusieurs fichiers :

vi f1.txt f2.txt        # naviguer avec :n et :prev
:e autre_fichier.txt depuis vi permet d'ouvrir un autre fichier sans fermer l'éditeur.
4. Entrer en mode insertion

Depuis le mode normal, plusieurs façons :

i       → insérer AVANT le curseur
a       → insérer APRÈS le curseur (append)
I       → insérer au début de la ligne
A       → insérer à la fin de la ligne
o       → nouvelle ligne EN DESSOUS
O       → nouvelle ligne AU-DESSUS
s       → remplacer un caractère
S       → remplacer toute la ligne
i est le plus utilisé. Retiens-le.
Pour sortir du mode insertion et revenir au mode normal : Échap. Appuie plusieurs fois si tu n'es pas sûr.
5. Sauvegarder et quitter

Depuis le mode normal, tape : puis une de ces commandes, terminée par Entrée :

:w              → sauvegarder
:w nom.txt      → sauvegarder sous un autre nom
:wq             → sauvegarder et quitter
:x              → sauvegarder et quitter (équivalent)
:q              → quitter (échoue si modifs non sauvegardées)
:q!             → quitter SANS sauvegarder (forcer)
:e!             → recharger le fichier (annuler modifs)
:q! avec le point d'exclamation abandonne toutes les modifications depuis la dernière sauvegarde. C'est la sortie de secours quand tu es bloqué. À utiliser en connaissance de cause.
Réflexe si tu es coincé dans vi : Échap → :q! → Entrée. Ça te sort toujours.
Ouvre vi, tape du texte, sauvegarde avec :wq, puis rouvre le fichier pour vérifier.
cat fichier.txt doit afficher ton texte.
6. Se déplacer dans le fichier

En mode normal, utilise ces touches (pas les flèches !) :

h       → gauche
j       → bas
k       → haut
l       → droite

0       → début de ligne
$       → fin de ligne
w       → mot suivant
b       → mot précédent
gg      → début du fichier
G       → fin du fichier
:25     → aller à la ligne 25
Ctrl+d  → page suivante
Ctrl+u  → page précédente
Les flèches fonctionnent dans vim moderne, mais hjkl est plus rapide une fois habitué. Sur un vieux serveur, les flèches peuvent ne pas marcher.
Crée un fichier avec plusieurs lignes, puis navigue avec gg, G, w, b.
Tu dois pouvoir te déplacer sans utiliser les flèches.
7. Supprimer, copier, coller

En mode normal :

x       → supprimer le caractère sous le curseur
dd      → supprimer la ligne entière
dw      → supprimer un mot
d$      → supprimer jusqu'à la fin de la ligne
D       → idem que d$

yy      → copier la ligne (yank)
yw      → copier un mot
y$      → copier jusqu'à la fin de la ligne

p       → coller après le curseur
P       → coller avant le curseur

u       → annuler la dernière action (undo)
Ctrl+r  → refaire (redo)
.       → répéter la dernière commande
Pour supprimer 5 lignes : 5dd
Pour copier 3 lignes : 3yy
Pour coller 10 fois : 10p
La touche . (point) répète la dernière action. C'est extrêmement puissant pour les modifications répétitives.
Dans un fichier de 10 lignes, supprime les lignes 3 à 5 avec 3G puis 3dd.
:wq puis cat doit montrer 7 lignes restantes.
8. Rechercher et remplacer

En mode normal :

/mot        → chercher "mot" vers le bas
?mot        → chercher "mot" vers le haut
n           → occurrence suivante
N           → occurrence précédente

Remplacement depuis le mode commande :

:%s/ancien/nouveau/g         → remplacer partout
:%s/ancien/nouveau/gc        → avec confirmation
:s/ancien/nouveau/g          → sur la ligne courante
:10,20s/ancien/nouveau/g     → lignes 10 à 20
:%s/localhost/127.0.0.1/g remplace toutes les occurrences de "localhost" par "127.0.0.1" dans le fichier.
:%s/ est l'une des commandes les plus utiles de vi pour éditer des fichiers de config. % signifie "tout le fichier".
Crée un fichier avec plusieurs fois "toto", puis remplace toutes les occurrences par "titi" avec :%s/toto/titi/g.
cat doit afficher "titi" à la place de "toto".
9. Afficher les numéros de ligne
:set nu         → afficher les numéros
:set nonu       → masquer
:set ic         → recherche insensible à la casse
:set noic       → sensible à la casse
:syntax on      → coloration syntaxique

Pour rendre ces options permanentes, ajoute-les dans ~/.vimrc :

echo "set nu" >> ~/.vimrc
echo "syntax on" >> ~/.vimrc
:set nu est très pratique pour déboguer un script ou un fichier de config référencé par numéro de ligne.
Active :set nu, navigue à la ligne 5 avec :5, puis reviens au début avec gg.
Les numéros doivent s'afficher à gauche du texte.
10. Cas pratique — éditer /etc/hosts

Un cas d'usage classique : ajouter une entrée DNS manuelle.

vi /etc/hosts

Le fichier ressemble à :

127.0.0.1   localhost
::1         localhost

Pour ajouter une ligne, va à la fin (G), crée une nouvelle ligne (o), tape :

192.168.1.10   monserveur.local

Puis Échap → :wq → Entrée.

Sur jslinux, tu ne pourras probablement pas écrire dans /etc/hosts (droits root requis). Utilise plutôt un fichier dans ton dossier personnel pour t'entraîner, comme ~/hosts_test.
Copie /etc/hosts dans ton home (cp /etc/hosts ~/hosts_test), puis édite-le avec vi pour ajouter une ligne.
cat ~/hosts_test doit montrer la nouvelle ligne.
🎓 Récapitulatif
OUVRIR
vi fichier.txt              → ouvrir/créer
vi +25 fichier.txt          → ouvrir à la ligne 25

MODES
i / a / o                   → entrer en insertion
Échap                       → revenir au mode normal
:                           → entrer en mode commande

SAUVEGARDER / QUITTER
:w                          → sauvegarder
:wq  ou  :x                 → sauvegarder et quitter
:q!                         → quitter sans sauvegarder

NAVIGATION
hjkl                        → flèches
0 / $                       → début / fin de ligne
w / b                       → mot suivant / précédent
gg / G                      → début / fin du fichier
:25                         → aller à la ligne 25

ÉDITION
x / dd / dw                 → supprimer
yy / yw                     → copier
p / P                       → coller
u / Ctrl+r                  → annuler / refaire
.                           → répéter

RECHERCHE
/mot  puis n                → chercher
:%s/a/b/g                   → remplacer partout

OPTIONS
:set nu                     → numéros de ligne
:syntax on                  → coloration

Réflexe de survie

Échap  :q!  Entrée

Cette séquence te sort toujours de vi, quoi qu'il arrive.

🏆 Défi final
  1. Créer un fichier script.sh avec vi
  2. Y écrire ces 3 lignes :
    #!/bin/sh
    echo "Bonjour $USER"
    echo "Aujourd'hui : $(date)"
  3. Sauvegarder et quitter
  4. Rendre exécutable : chmod +x script.sh
  5. Lancer : ./script.sh
  6. Rouvrir le fichier et ajouter une ligne d'option (set nu visible en commentaire)
  7. Sauvegarder
./script.sh doit afficher ton nom d'utilisateur et la date du jour.
Tu viens d'écrire, sauvegarder et exécuter un script shell avec vi. C'est l'enchaînement de base que tu feras des centaines de fois en administration Linux.
📚 Sommaire