Aller au contenu
Administration Linux medium

Vi sous Linux : modes, commandes essentielles et comment sortir

30 min de lecture

Vous êtes connecté en SSH sur un serveur, vous devez corriger un fichier de configuration, et le seul éditeur disponible est vi. Pour en sortir immédiatement : appuyez sur Esc une ou deux fois, puis tapez :wq suivi d'Entrée pour sauvegarder et quitter, ou :q! suivi d'Entrée pour quitter en abandonnant les modifications. Ce guide vous apprend ensuite à ouvrir un fichier, le modifier et le sauvegarder avec vi, pas à pas : les trois modes, les déplacements au clavier, la suppression, la copie, la recherche et le remplacement. Vous repartirez avec les réflexes pour éditer n'importe quel fichier texte sur un système Linux minimal, conteneur Alpine ou serveur en mode rescue compris.

  • Ouvrir, modifier et quitter vi (la base absolue)
  • Le système de modes qui rend vi unique
  • Naviguer rapidement dans un fichier
  • Chercher et remplacer du texte

vi (prononcé « vi-aille », comme les initiales de visual) est un éditeur de texte en ligne de commande créé en 1976 par Bill Joy. Il est installé par défaut sur tous les systèmes Unix et Linux, y compris les conteneurs Docker les plus minimalistes et les serveurs d'urgence.

vi couvre le strict nécessaire : ouvrir un fichier, s'y déplacer, le modifier, l'enregistrer. Il ne fournit ni coloration syntaxique, ni plugins, ni fichier de configuration persistant, ces fonctions relèvent de vim. En contrepartie, il démarre sur un système en mode rescue, dans une image BusyBox ou sur un équipement embarqué, là où aucun autre éditeur n'est installé.

CaractéristiqueviÉditeur graphique (VS Code, etc.)
DisponibilitéPartout, même sans bureau graphiqueNécessite un environnement graphique
PoidsQuelques KoPlusieurs centaines de Mo
Courbe d'apprentissageForte au début, puis rapideIntuitive dès le départ
Usage typiqueDépannage serveur, édition rapideDéveloppement au quotidien

Ce tableau explique pourquoi vi survit à des éditeurs bien plus confortables : sa disponibilité ne dépend de rien. Même si vous travaillez sous VS Code ou nano au quotidien, quatre situations vous y ramèneront. Un serveur démarré en mode rescue, où aucun autre éditeur n'est installé. Un conteneur construit sur une image Alpine ou BusyBox, qui embarque vi et rien d'autre. Une connexion SSH vers un équipement réseau ou un système embarqué. Enfin le dépannage en urgence, où installer un paquet supplémentaire est soit impossible, soit une mauvaise idée sur une machine en production. Dans ces quatre cas, savoir taper i, Esc et :wq fait la différence entre corriger le fichier et rappeler quelqu'un.

  • Un terminal Linux (physique, VM ou WSL)
  • Aucune connaissance préalable de vi

Pour vérifier que vi est disponible sur votre système :

Fenêtre de terminal
which vi

Résultat attendu : /usr/bin/vi (ou un chemin similaire).

Avant d'apprendre toutes les commandes, commençons par la seule chose qui compte quand on découvre vi : le cycle complet « ouvrir un fichier, taper du texte, sauvegarder et quitter ».

« Comment je sors de vi ? » reste la frustration numéro 1 des débutants. Vous avez la réponse courte en tête de page ; la séquence ci-dessous la remet dans son contexte, du fichier ouvert au fichier écrit sur le disque.

  1. Ouvrir vi sur un fichier de test

    Créez un fichier temporaire pour vous entraîner sans risque :

    Fenêtre de terminal
    vi /tmp/test-vi.txt

    Vi s'ouvre. L'écran affiche des tildes (~) sur les lignes vides. Vous êtes en mode commande : les touches du clavier n'écrivent pas de texte, elles déclenchent des actions.

  2. Passer en mode insertion pour écrire

    Appuyez sur la touche i (comme insert). En bas de l'écran, vous voyez -- INSERT -- apparaître. Vous êtes maintenant en mode insertion : vous pouvez taper du texte normalement.

    Tapez quelques lignes :

    Ceci est mon premier fichier édité avec vi.
    Ligne numéro deux.
    Et une troisième ligne pour s'entraîner.
  3. Revenir en mode commande

    Appuyez sur la touche Esc. Le message -- INSERT -- disparaît. Vous êtes de retour en mode commande.

  4. Sauvegarder et quitter

    Tapez :wq puis appuyez sur Entrée.

    • : ouvre le mode Ex (la ligne de commande en bas de l'écran)
    • w signifie write (écrire/sauvegarder)
    • q signifie quit (quitter)
  5. Vérifier que le fichier a bien été sauvegardé

    De retour dans le terminal, affichez le contenu du fichier :

    Fenêtre de terminal
    cat /tmp/test-vi.txt

    Vous devriez voir vos trois lignes de texte.

Refaites cette séquence trois fois de suite avant de poursuivre. L'objectif n'est pas de comprendre, il est de rendre le cycle i → texte → Esc:wq automatique. C'est le geste que vous répéterez à chaque intervention sur un serveur, souvent dans un contexte où votre attention est ailleurs, sur l'incident que vous êtes en train de traiter.

Voici une démonstration animée de ce cycle complet :

GIF de démonstration du cycle ouvrir, écrire, sauvegarder avec vi

Toutes ces commandes se tapent depuis le mode commande, donc après un Esc. La logique tient en trois lettres : w écrit le fichier sur le disque, q ferme l'éditeur, et le point d'exclamation ! force l'opération malgré un refus. Sans le !, vi bloque la sortie si le tampon contient des modifications non enregistrées, c'est une protection, pas un bug. Repérez dans le tableau la colonne du milieu : c'est elle que vous taperez, la troisième colonne dit ce que vous perdez ou conservez.

SituationCommandeCe que ça fait
Sauvegarder et quitter:wq puis EntréeÉcrit le fichier et ferme vi
Quitter sans sauvegarder:q! puis EntréeAbandonne les modifications
Juste sauvegarder:w puis EntréeÉcrit le fichier, reste dans vi
Juste quitter (rien à sauvegarder):q puis EntréeFerme vi (échoue si modifications non sauvegardées)
Raccourci sauvegarde + quitZZ (majuscules, sans :)Équivalent de :wq
Sauvegarder sous un autre nom:w nouveau_nomCrée une copie du fichier
Quitter tous les fichiers ouverts:qa!Ferme tout sans sauvegarder

Contrairement à nano ou à un éditeur graphique, vi ne fonctionne pas en mode « taper du texte » par défaut. C'est ce qui déroute les débutants.

Le mécanisme est le suivant : vi maintient un état interne, le mode, et interprète chaque touche du clavier en fonction de cet état. En mode commande, la touche d déclenche une suppression ; en mode insertion, la même touche d écrit la lettre « d » dans le fichier. Ce ne sont pas deux claviers différents, c'est la même frappe routée vers deux tables d'actions distinctes.

Cette conception explique la mésaventure classique du débutant : il ouvre un fichier, tape son texte sans avoir appuyé sur i, et déclenche une dizaine de commandes au hasard. Rien n'est perdu pour autant, u annule et :q! referme le fichier sans rien écrire sur le disque.

La séparation paraît coûteuse, elle achète en réalité une densité de commandes qu'un éditeur non modal ne peut pas atteindre : en mode commande, chaque touche du clavier est un raccourci disponible, sans modificateur. Là où un éditeur graphique doit recourir à une combinaison du type Ctrl+Maj+K pour supprimer une ligne, vi demande dd, deux frappes sur la rangée de repos. C'est ce qui rend l'éditeur très rapide une fois les gestes acquis, et c'est aussi ce qui le rend déroutant pendant les premières heures.

Lisez ce tableau par la colonne de droite d'abord : savoir comment sortir d'un mode compte plus que savoir y entrer, parce qu'un blocage vient toujours d'un mode dont on ignore la sortie. Notez aussi qu'un seul mode, le mode commande, est accessible depuis les deux autres. C'est pour cette raison que Esc répété est la manoeuvre de secours universelle.

ModeComment y entrerCe qu'il faitComment le quitter
CommandeEsc (ou à l'ouverture)Naviguer, supprimer, copier, collerTapez i, a, o ou :
Insertioni, a, o, OÉcrire du texteAppuyez sur Esc
Ex: (depuis le mode commande)Commandes longues (:w, :q, :%s/…)Entrée pour exécuter, Esc pour annuler

Le mode commande est le point de passage obligé : on ne bascule jamais directement du mode insertion au mode Ex, il faut repasser par lui. Prenez l'habitude d'appuyer sur Esc dès qu'une action est terminée, vous saurez toujours où vous en êtes.

Un réflexe simple : regardez en bas à gauche de l'écran. Cet affichage dépend de l'option showmode, activée par défaut dès que l'éditeur tourne en mode nocompatible, ce qui est le cas de vim lancé dans un terminal classique. Sur une implémentation strictement compatible vi (BusyBox, ou vim -C), l'indicateur peut ne jamais apparaître : ne vous fiez alors qu'au comportement des touches.

L'absence d'indication est elle aussi une information, elle signale le mode commande. C'est la ligne à retenir dans le tableau, les trois autres se reconnaissent au premier coup d'oeil.

Ce que vous voyezMode actif
-- INSERT --Mode insertion
-- REPLACE --Mode remplacement
Rien de spécialMode commande
: suivi de texteMode Ex

Le meilleur moyen d'ancrer cette lecture est de faire l'aller-retour vous-même. Ouvrez vi /tmp/test-vi.txt : rien ne s'affiche en bas de l'écran, vous êtes en mode commande. Appuyez sur i, -- INSERT -- apparaît ; tapez quelques lettres, puis Esc, l'indicateur disparaît. Tapez :, le curseur descend sur la dernière ligne de l'écran, et Esc vous ramène au mode commande. Cinq passages suffisent en général pour que le réflexe soit pris et que vous cessiez de deviner votre mode.

Vous connaissez i pour passer en mode insertion, mais vi offre plusieurs portes d'entrée selon où vous voulez commencer à écrire. Chacune vous fait gagner du temps dans une situation précise.

ToucheActionSituation typique
iInsère avant le curseurCas général, correction au milieu d'un mot
aInsère après le curseurAjouter du texte à la suite d'un mot
IInsère au début de la ligneAjouter un commentaire # devant une ligne
AInsère à la fin de la ligneCompléter une ligne existante
oOuvre une nouvelle ligne en dessousAjouter une directive dans un fichier de config
OOuvre une nouvelle ligne au-dessusInsérer une ligne au-dessus de la ligne courante

Exemple concret : vous éditez /etc/hosts et le curseur se trouve sur la ligne 127.0.0.1 localhost. Voici ce que fait chaque touche :

  • i → le curseur clignote avant le 1 de 127 : vous écrivez avant
  • a → le curseur se place après le 1 de 127 : vous écrivez après
  • A → le curseur saute à la fin de localhost : vous pouvez ajouter un alias
  • o → une ligne vide apparaît en dessous : vous pouvez ajouter une entrée

Pour sentir la différence entre ces touches, ouvrez /tmp/test-vi.txt, placez le curseur au milieu d'un mot, puis essayez successivement a suivi de texte et Esc, A suivi de texte et Esc, enfin o suivi d'une ligne entière et Esc. La comparaison la plus instructive reste celle entre i et a sur le même caractère : un caractère d'écart au démarrage, et toute la différence entre corriger un mot et le compléter.

Avec vi, pas de souris. Tout se pilote au clavier. Au début, c'est déroutant. Mais une fois les commandes en mémoire musculaire, c'est bien plus rapide qu'un clic.

Les quatre touches de base sont positionnées sous votre main droite. Ce placement date des terminaux ADM-3A de 1976, dont le clavier portait ces flèches gravées sur h, j, k et l. Retenez surtout qu'un compteur peut précéder n'importe laquelle : 10j descend de dix lignes d'un coup, 5l avance de cinq caractères. Ce préfixe numérique fonctionne avec presque toutes les commandes de vi, c'est ce qui rend l'éditeur rapide.

k
← h l →
j
ToucheDirectionAstuce pour retenir
hGauche ←La touche la plus à gauche du groupe
jBas ↓Le j « descend » sous la ligne de base
kHaut ↑Le k « monte » (pensez à kick vers le haut)
lDroite →La touche la plus à droite du groupe

Sur la plupart des systèmes modernes, les touches fléchées fonctionnent aussi, et personne ne vous reprochera de les utiliser au début. Le gain de h, j, k et l est ailleurs : elles gardent les mains sur la rangée de repos, sans aller chercher le pavé fléché. Sur une implémentation strictement compatible vi, en revanche, appuyer sur une flèche depuis le mode insertion peut insérer des lettres parasites (A, B, C, D) au lieu de déplacer le curseur, parce que l'éditeur reçoit la séquence d'échappement du terminal caractère par caractère. C'est le cas où hjkl cesse d'être une préférence de puriste.

Pour aller plus vite que caractère par caractère, vi permet de sauter de mot en mot :

ToucheActionExemple sur server_name localhost;
wMot suivant (début)Saute de server_name à localhost
eFin du mot courantSaute au e de server_name
bMot précédent (début)Revient de localhost à server_name

Ajouter une majuscule (W, E, B) fait sauter entre les mots séparés par des espaces uniquement, ce qui est utile dans les scripts.

Le piège de ce tableau est la différence entre 0 et ^. Le zéro ramène à la colonne 1, donc devant l'indentation ; l'accent circonflexe s'arrête au premier caractère non blanc. Sur un fichier YAML ou un nginx.conf indentés, c'est ^ que vous voulez presque toujours. Retenez aussi 0 et $, ils reviennent plus loin comme portées de suppression (d0, d$) et comme ancres dans les recherches.

ToucheAction
0 (zéro)Début de la ligne
^Premier caractère non vide (utile pour les fichiers indentés)
$Fin de la ligne

Quand systemctl status ou nginx -t vous répond « erreur ligne 42 », vous voulez y aller directement, sans compter les lignes. Trois commandes couvrent ce besoin, et la première est de loin la plus utilisée en dépannage.

CommandeAction
:42Aller à la ligne 42
ggAller à la première ligne du fichier
GAller à la dernière ligne du fichier

Deux variantes valent d'être connues. 42G fait la même chose que :42 sans passer par le mode Ex, et G précédé d'un nombre suit donc la logique de préfixe numérique vue plus haut. Activez :set number (voir la section sur les options) pour vérifier d'un coup d'oeil que vous êtes bien sur la ligne annoncée par le message d'erreur.

Ces commandes raisonnent en fenêtre affichée, pas en fichier : H place le curseur sur la première ligne visible, pas sur la première ligne du fichier. La distinction devient évidente au milieu d'un journal de 10 000 lignes, où H ne bouge que de quelques lignes tandis que gg remonte tout en haut. Ctrl+f et Ctrl+b font défiler d'un écran entier et sont le moyen le plus rapide de parcourir un long fichier de configuration sans le modifier.

ToucheAction
HHaut de l'écran visible (High)
MMilieu de l'écran (Middle)
LBas de l'écran (Low)
Ctrl+fPage suivante (forward)
Ctrl+bPage précédente (backward)

Un fichier réel vaut mieux qu'un fichier de test pour cet exercice. Ouvrez vi /etc/passwd, présent sur tout système Linux et sans risque puisque vous n'y écrirez rien : descendez de cinq lignes avec j, sautez à la fin avec G, remontez avec gg, allez à la ligne 10 avec :10, puis parcourez une ligne mot à mot avec w et b. Quittez avec :q, sans point d'exclamation. Si vi refuse de se fermer, c'est que le fichier a été modifié sans que vous le vouliez : :q! règle le cas sans rien écrire sur le disque.

Quand vous travaillez sur un long fichier, vous pouvez poser des repères pour revenir rapidement à un endroit :

  • ma : pose une marque nommée a à la position du curseur
  • 'a : revient à la ligne marquée a

Les marques vont de a à z, soit 26 repères par fichier. Elles ne sont pas persistantes : elles disparaissent à la fermeture de l'éditeur. Une nuance utile sur les longues lignes, l'apostrophe simple 'a repositionne le curseur sur le premier caractère non blanc de la ligne marquée, tandis que l'accent grave suivi de la même lettre restaure la position exacte, colonne comprise.

En mode commande, vi propose des commandes de suppression qui évitent de sélectionner laborieusement du texte avec la souris. Chaque commande suit une logique simple : d + portée (d pour delete).

Les deux premières lignes du tableau (x et X) agissent sur un seul caractère et n'attendent pas de portée. Les suivantes suivent toutes le schéma d + portée, où la portée est exactement une commande de déplacement déjà vue : w, $, 0. Cette régularité vous évite d'apprendre une liste par coeur, toute nouvelle commande de déplacement devient automatiquement une portée de suppression. Un détail à connaître : dw supprime jusqu'au début du mot suivant, donc il emporte aussi l'espace qui sépare les deux mots. Sur server_name localhost;, un dw au tout début laisse localhost; collé à la marge.

CommandeCe que ça supprimeQuand l'utiliser
xLe caractère sous le curseurCorriger une faute de frappe
XLe caractère avant le curseurSupprimer en arrière (comme Retour arrière)
dwDu curseur jusqu'au mot suivantSupprimer un mot
ddLa ligne entièreSupprimer une ligne de configuration
d$Du curseur à la fin de la ligneSupprimer la fin d'une ligne
d0Du curseur au début de la ligneSupprimer le début d'une ligne

Vous pouvez combiner un nombre avec dd :

3dd

Supprime 3 lignes à partir de la ligne courante. Très pratique pour supprimer un bloc de configuration.

Exemple concret : vous éditez un fichier nginx.conf et vous voulez supprimer un bloc location de 5 lignes. Placez le curseur sur la première ligne du bloc, puis tapez 5dd.

Un point à connaître avant d'aller plus loin : dans vi, supprimer, c'est couper. Tout ce qu'effacent d et x part dans un registre en mémoire et se recolle avec p. Une suppression malencontreuse se rattrape donc de deux façons, u pour annuler ou p pour recoller le texte ailleurs. Le corollaire est moins agréable : un dd écrase ce que vous veniez de copier avec yy, puisque les deux commandes utilisent le même registre par défaut.

Au-delà de la suppression, vi propose des commandes pour remplacer et modifier du texte sans quitter le mode commande.

La commande r est la plus économique de vi pour corriger une coquille isolée : elle consomme deux frappes et vous laisse en mode commande, sans le Esc de retour. C'est exactement ce dont vous avez besoin sur un fichier de configuration où un seul chiffre ou une seule lettre est faux.

  • r suivi d'un caractère : remplace le caractère sous le curseur sans passer en mode insertion.

Exemple : le curseur est sur le a de Poat 22. Tapez r puis r → résultat : Port 22. Rapide, précis, sans changer de mode.

Quand la correction porte sur une suite de caractères de même longueur, un masque de sous-réseau ou un numéro de port par exemple, le mode remplacement évite de supprimer puis réécrire. Le repère visuel est l'indicateur -- REPLACE -- en bas de l'écran, à ne pas confondre avec -- INSERT -- : en mode remplacement, votre frappe écrase le texte existant au lieu de le décaler. C'est le mode dans lequel les débutants tombent en appuyant sur Insert par mégarde.

  • R : active le mode remplacement. Chaque caractère que vous tapez écrase celui qui se trouve sous le curseur. Appuyez sur Esc pour revenir en mode commande.

La commande c (change) combine suppression et insertion en une seule action :

CommandeAction
cwSupprime le mot et passe en insertion
ccSupprime la ligne et passe en insertion
c$Supprime jusqu'à la fin de la ligne et passe en insertion

Exemple concret : dans un fichier sshd_config, le curseur est sur le mot yes de la ligne PermitRootLogin yes. Tapez cw, puis tapez no, puis Esc. Résultat : PermitRootLogin no.

Ces trois touches sont le filet de sécurité qui rend l'apprentissage de vi sans risque : tant que vous n'avez pas tapé :w, rien n'est écrit sur le disque et :q! remet le fichier dans son état d'origine. La commande . mérite une attention particulière : elle rejoue la dernière modification, pas le dernier déplacement. Enchaîner n puis . permet donc de corriger occurrence par occurrence sans retaper la commande.

CommandeAction
uAnnule la dernière action (comme Ctrl+Z)
UAnnule toutes les modifications sur la ligne courante
.Répète la dernière commande

Le comportement de u diffère selon l'implémentation, et la différence est de taille. Dans vi « original », u n'annule que la dernière action, et un second u rétablit ce que le premier venait d'annuler : c'est une bascule, pas un historique. Dans vim, u annule de manière illimitée. Le meilleur moyen de savoir laquelle des deux implémentations vous avez sous les doigts est de faire le test : modifiez une ligne, appuyez deux fois sur u, et regardez si la modification revient.

Enchaînez ces quatre gestes sur votre fichier de test pour les fixer. Sur un caractère, r suivi d'une autre lettre le remplace. Sur un mot, cw puis un nouveau mot puis Esc le change entièrement. u ramène le mot d'origine. Enfin . rejoue la dernière modification à l'endroit où se trouve le curseur : c'est cette dernière touche, apparemment anodine, qui change le rythme de travail dans vi, parce qu'elle transforme une correction en geste répétable.

Dans vi, ces opérations portent des noms différents issus du jargon Unix. Le vocabulaire compte parce qu'il explique les lettres des commandes : y vient de yank, p de put. Elles partagent toutes le même emplacement de stockage, le registre sans nom, ce qui explique qu'une suppression écrase ce que vous veniez de copier.

Opération habituelleNom dans viCommande
CopierYank (tirer)y
CouperDelete (supprimer)d
CollerPut (poser)p

La copie reprend le schéma déjà rencontré avec d : verbe + portée. Le doublement de la lettre (yy) désigne la ligne entière, comme dd pour la suppression. La copie ne modifie pas le fichier et ne déplace pas le curseur. Sur une seule ligne, elle n'affiche aucun message et vous n'avez donc pas de confirmation visuelle ; à partir de trois lignes, un 3 lignes copiées s'affiche en bas de l'écran.

CommandeCe que ça copie
yyLa ligne entière
ywUn mot
y$Du curseur à la fin de la ligne
3yy3 lignes à partir du curseur

Comme vu dans la section suppression, toute commande d coupe le texte (il reste en mémoire pour être collé) :

CommandeCe que ça coupe
ddLa ligne entière
dwUn mot
d3wTrois mots

Le comportement de p dépend de ce qui a été copié, et c'est la source de surprise la plus fréquente. Si la copie portait sur des lignes entières (yy, dd), le collage insère de nouvelles lignes sous la ligne courante. Si elle portait sur des caractères (yw, y$), le texte s'insère à l'intérieur de la ligne, juste après le curseur. Le contenu du registre n'est pas consommé : vous pouvez appuyer sur p plusieurs fois de suite pour dupliquer un bloc.

CommandeAction
pColle après le curseur (ou sous la ligne si on a copié une ligne entière)
PColle avant le curseur (ou au-dessus de la ligne)

Imaginons que vous éditez un fichier nginx.conf et qu'une directive est mal placée. Pour déplacer la ligne 5 vers l'emplacement de la ligne 10 :

  1. Aller à la ligne 5 : tapez :5 puis Entrée

  2. Couper la ligne : tapez dd

  3. Aller à la destination : tapez :9 (la ligne 9 est devenue l'ancienne ligne 10 après la coupe)

  4. Coller en dessous : tapez p

Par défaut, chaque copie ou coupe remplace ce qui était en mémoire. Si vous avez besoin de stocker plusieurs morceaux de texte, utilisez les registres nommés (de a à z) :

"ayy → copie la ligne dans le registre a
"byy → copie la ligne dans le registre b
"ap → colle le contenu du registre a
"bp → colle le contenu du registre b

Le guillemet double " sert de préfixe : il annonce que la lettre qui suit désigne un registre, et non une commande. Vous disposez ainsi de 26 emplacements indépendants, a à z, en plus du registre sans nom utilisé par défaut. Détail utile lors d'un tri de configuration : nommer le registre en majuscule ("Ayy) ajoute la ligne au contenu déjà stocké dans a au lieu de l'écraser, ce qui permet de rassembler plusieurs lignes éparses avant de les coller d'un bloc.

Quand vous travaillez sur un fichier de configuration de 200 lignes, chercher un paramètre à l'oeil est inefficace. Vi dispose de commandes de recherche puissantes et d'un système de remplacement comparable au « chercher et remplacer » des éditeurs graphiques.

La recherche se lance depuis le mode commande avec / pour descendre dans le fichier et ? pour remonter. Le caractère tapé s'affiche en bas de l'écran, suivi du motif que vous saisissez, et la recherche démarre à la validation par Entrée. Le curseur se positionne alors sur la première occurrence rencontrée dans la direction choisie, à partir de la position courante et non du début du fichier.

  • /motif puis Entrée : cherche vers le bas du fichier
  • ?motif puis Entrée : cherche vers le haut

Exemple : pour trouver toutes les occurrences de Port dans sshd_config :

/Port

Vi saute à la première occurrence trouvée. Si le motif est absent, l'éditeur affiche Motif introuvable et laisse le curseur où il était, sans rien modifier.

Une fois la recherche lancée, vous n'avez plus à retaper le motif. Deux points à garder en tête. D'abord, n et N sont relatifs à la direction initiale : après un ?motif, c'est n qui remonte le fichier. Ensuite, la recherche boucle en fin de fichier grâce à l'option wrapscan, active par défaut : vi repart du haut du fichier et signale La recherche a atteint le BAS, et continue en HAUT. Voir ce message veut dire que vous avez fait le tour de toutes les occurrences.

  • n : occurrence suivante (dans la même direction)
  • N : occurrence précédente (direction opposée)

Vi interprète le motif de recherche comme une expression régulière, pas comme du texte littéral. Cela a une conséquence pratique immédiate : chercher un chemin comme /etc/ssh/sshd_config échoue si vous oubliez que le . de sshd_config n'est pas un point mais un joker. Pour chercher un caractère spécial tel quel, précédez-le d'une barre oblique inverse : /version\.1 ne trouve que version.1.

Les quatre motifs du tableau couvrent la quasi-totalité des besoins en administration. Les deux derniers, ^ et $, sont les plus rentables : ils ancrent la recherche en début ou en fin de ligne et évitent les faux positifs au milieu du texte.

MotifSignificationExemple
.N'importe quel caractère/s.rv trouve serv et surv
*Zéro ou plusieurs du caractère précédent/ab*c trouve ac, abc, abbc
^Début de ligne/^# trouve les lignes commentées
$Fin de ligne/;$ trouve les lignes terminées par ;

La substitution utilise la commande :s en mode Ex. Sa syntaxe se lit toujours de la même façon : une plage de lignes, puis s, puis le motif cherché, puis le texte de remplacement, puis des drapeaux. Ce qui change d'un onglet à l'autre ci-dessous, c'est uniquement la plage et les drapeaux. Sans plage, la substitution ne touche que la ligne courante ; sans le drapeau g, elle ne remplace que la première occurrence de chaque ligne. C'est l'oubli du g qui explique la plupart des substitutions « qui n'ont pas tout remplacé ».

Remplacer la première occurrence sur la ligne :

:s/ancien/nouveau/

Remplacer toutes les occurrences sur la ligne :

:s/ancien/nouveau/g

Exemple concret : dans un fichier Apache, vous voulez remplacer le port 8080 par 443 partout :

:%s/8080/443/g

Entraînez-vous sur /tmp/test-vi.txt, où une substitution ratée ne coûte rien : cherchez un mot avec /mot et parcourez les occurrences avec n, remplacez-le sur la ligne courante avec :s/ancien/nouveau/, puis dans tout le fichier avec :%s/ancien/nouveau/g. Comparez ensuite le nombre de substitutions annoncé en bas de l'écran avec ce que vous attendiez : c'est le contrôle le plus simple d'une substitution, et il révèle immédiatement un g oublié.

Vi est minimaliste, mais quelques réglages le rendent plus confortable. Ces options s'activent en mode Ex (:) et restent actives le temps de la session.

Le tableau se lit par paires : chaque option booléenne s'annule en préfixant son nom par no. Sur un serveur, deux d'entre elles rendent service immédiatement. :set number affiche les numéros de ligne, indispensable quand un service refuse de démarrer en pointant « erreur ligne 87 ». :set autoindent conserve l'indentation de la ligne précédente, ce qui évite de casser un fichier YAML en ajoutant une clé. Revers connu de autoindent : coller un bloc déjà indenté avec la souris produit un escalier, car l'indentation collée s'ajoute à celle générée. Désactivez l'option avec :set noautoindent avant un copier-coller volumineux.

CommandeCe que ça fait
:set numberAffiche les numéros de ligne
:set nonumberMasque les numéros de ligne
:set ignorecaseRecherche insensible à la casse
:set noignorecaseRecherche sensible à la casse
:set autoindentConserve l'indentation lors d'un retour à la ligne
:set tabstop=4Définit la largeur des tabulations à 4 espaces
:set showmodeAffiche le mode actif en bas (INSERT, REPLACE)

Pour activer plusieurs options en une seule commande :

:set number autoindent tabstop=4

Pour voir toutes les options actives, tapez :set sans argument.

Ces réglages ne survivent pas à la fermeture, parce que vi n'a pas de fichier de configuration : vous retaperez :set number à chaque ouverture. C'est l'une des raisons de passer à vim dès que la machine n'est plus un système de secours, son fichier .vimrc rendant ces mêmes options permanentes.

Presque tous les blocages en vi ont la même origine : le mode actif n'est pas celui que vous croyez. Avant de chercher plus loin, appuyez sur Esc et regardez la ligne du bas. Deux symptômes font exception, les codes E212 et E45 : ils viennent des droits sur le fichier, pas du mode, et se règlent avec sudo ou une écriture forcée. Lisez donc la colonne « Cause » avant la colonne « Solution », elle vous dit s'il s'agit d'un problème de mode ou de permissions.

ProblèmeCauseSolution
Je tape du texte mais rien ne s'afficheVous êtes en mode commandeAppuyez sur i pour passer en insertion
Des commandes s'exécutent quand je tapeVous êtes en mode commande alors que vous voulez écrireAppuyez sur i, a ou o
Je n'arrive pas à quitter viVous avez des modifications non sauvegardéesTapez :wq (sauvegarder et quitter) ou :q! (quitter sans sauvegarder)
Vi affiche E212: Can't open file for writingVous n'avez pas les droits d'écritureOuvrez le fichier avec sudo vi fichier
Le texte que je tape remplace des caractèresVous êtes en mode remplacement (R)Appuyez sur Esc pour revenir en mode commande
:wq affiche E45: 'readonly' option is setLe fichier est en lecture seuleUtilisez :w! pour forcer l'écriture (si vous êtes root)
J'ai fait une mauvaise manipulationVous avez modifié le fichier par erreurTapez u pour annuler, ou :q! pour tout abandonner

Vi est fiable et universel, mais il a des limites héritées de sa conception en 1976 :

Ce que vi ne fait pasAlternative dans vim
Pas de coloration syntaxique:syntax on
Annulation limitée à 1 niveauAnnulation illimitée avec u
Pas de complétion de texteCtrl+n / Ctrl+p
Pas de pluginsDes milliers de plugins disponibles
Pas de fichier de configuration.vimrc pour personnaliser de manière permanente
Pas d'édition multi-fichier intuitiveOnglets, splits, buffers

Sur la plupart des distributions Linux modernes, la commande vi lance en réalité vim (Vi IMproved). Pour vérifier :

Fenêtre de terminal
vi --version | head -1

Si vous voyez VIM - Vi IMproved, vous utilisez déjà vim. Vous pouvez aller directement au guide vim pour découvrir les fonctionnalités avancées.

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • vi est partout : c'est le seul éditeur garanti sur tout système Unix/Linux, y compris les conteneurs minimaux et les modes rescue.
  • Le cycle de base : i (insertion) → texte → Esc (mode commande) → :wq (sauvegarder et quitter).
  • Esc ramène toujours en mode commande : c'est la seule touche dont l'effet est identique quel que soit le mode actif.
  • Les commandes suivent une logique : d + portée pour supprimer, y + portée pour copier, c + portée pour changer.
  • Chercher est rapide : /motif pour chercher, n pour l'occurrence suivante.
  • vi n'est qu'un début : une fois les bases acquises, passez à vim pour la coloration syntaxique, les plugins et la personnalisation permanente.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn