Une banniere sur Vim

La cheatsheet Vim que je ressors sans arrêt

De temps en temps, je vois quelqu’un ouvrir Vim sur un serveur, paniquer, et se rabattre sur nano. Et je dois admettre que, parfois, il peut s’agir de moi. Voici la cheatsheet que je garde à portée de main à la place : les commandes que j’utilise vraiment au quotidien en tant que développeur, plus une poignée de techniques avancées qui transforment Vim de « l’éditeur dont on ne sait pas sortir » en l’outil le plus rapide du terminal.

Les modes : le modèle mental

Tout dans Vim devient logique dès qu’on accepte que c’est un éditeur modal. On est toujours dans un mode, et les touches changent de sens selon celui-ci. Il y en a quatre à connaître : Normal (se déplacer et agir), Insertion (taper du texte), Visuel (sélectionner) et Ligne de commande (lancer des commandes :).

Diagramme d’états des modes de Vim : Normal au centre, avec les modes Insertion, Visuel et Ligne de commande accessibles via i/v/: et quittés avec Échap
ToucheAction
iInsérer avant le curseur
IInsérer en début de ligne
aAjouter après le curseur
AAjouter en fin de ligne
oOuvrir une ligne en dessous
OOuvrir une ligne au-dessus
vMode visuel caractère
VMode visuel ligne
Ctrl+vMode visuel bloc
EscRevenir en mode Normal
:Entrer en mode Ligne de commande

En cas de doute, appuyez sur Esc. Le mode Normal est le camp de base - tous les workflows ci-dessous partent de là.

Se déplacer

Les déplacements sont le vocabulaire de Vim : chaque commande d’édition ci-dessous se combine avec eux (d comme delete + w comme word = dw).

ToucheAction
h j k l← ↓ ↑ → (caractère)
w / WDébut du mot / MOT suivant
b / BDébut du mot / MOT précédent
e / EFin du mot / MOT
0Début de ligne
^Premier caractère non blanc
$Fin de ligne
ggPremière ligne du fichier
GDernière ligne du fichier
:NAller à la ligne N
%Sauter au crochet correspondant
{ / }Ligne vide précédente / suivante
Ctrl+dDéfiler d’une demi-page vers le bas
Ctrl+uDéfiler d’une demi-page vers le haut
zzCentrer le curseur à l’écran

Éditer

ToucheAction
xSupprimer le caractère sous le curseur
XSupprimer le caractère avant le curseur
ddSupprimer (couper) la ligne courante
DSupprimer jusqu’à la fin de la ligne
dwSupprimer jusqu’au mot suivant
yyCopier (yank) la ligne courante
ywCopier le mot
pColler après le curseur
PColler avant le curseur
ccChanger la ligne entière
cwChanger le mot
CChanger jusqu’à la fin de la ligne
rRemplacer un seul caractère
REntrer en mode Remplacement
~Inverser la casse du caractère
JFusionner la ligne suivante avec la courante

Annuler & refaire

ToucheAction
uAnnuler le dernier changement
UAnnuler tous les changements de la ligne
Ctrl+rRefaire
.Répéter le dernier changement

. est la touche la plus sous-estimée de Vim. Faites un changement une fois, puis rejouez-le n’importe où d’une seule frappe.

Rechercher & remplacer

ToucheAction
/patRechercher le motif vers l’avant
?patRechercher le motif vers l’arrière
nOccurrence suivante
NOccurrence précédente
*Rechercher le mot sous le curseur →
#Rechercher le mot sous le curseur ←
:%s/old/new/gTout remplacer dans le fichier
:%s/old/new/gcTout remplacer avec confirmation
:s/old/new/gRemplacer dans la ligne courante
:nohEffacer le surlignage de recherche

Fichiers, buffers, fenêtres & onglets

Vim édite volontiers plusieurs fichiers à la fois : les buffers sont les fichiers ouverts, les fenêtres des vues sur ces buffers, les onglets des ensembles de fenêtres.

Une session Vim avec deux fenêtres verticales affichant du code C replié

Opérations sur les fichiers

ToucheAction
:wÉcrire (enregistrer) le fichier
:w fileEnregistrer sous file
:qQuitter
:q!Quitter sans enregistrer
:wqEnregistrer et quitter
ZZEnregistrer et quitter (raccourci)
ZQQuitter sans enregistrer (raccourci)
:e fileOuvrir / éditer file
:r fileInsérer le fichier dans le buffer
:waEnregistrer tous les buffers ouverts
:qa!Tout fermer, abandonner les changements

Buffers & fenêtres

ToucheAction
:lsLister les buffers ouverts
:bnBuffer suivant
:bpBuffer précédent
:bdSupprimer (fermer) le buffer
:spScinder la fenêtre horizontalement
:vspScinder la fenêtre verticalement
Ctrl+w wPasser d’une fenêtre à l’autre
Ctrl+w h/j/k/lNaviguer entre fenêtres ← ↓ ↑ →
Ctrl+w qFermer la fenêtre courante
Ctrl+w =Égaliser la taille des fenêtres

Onglets

ToucheAction
:tabnewOuvrir un nouvel onglet
:tabe fileOuvrir un fichier dans un nouvel onglet
gtOnglet suivant
gTOnglet précédent
:tabcloseFermer l’onglet courant
:tabonlyFermer tous les autres onglets

Mode visuel

ToucheAction
yCopier la sélection
dSupprimer la sélection
cChanger la sélection
>Indenter la sélection vers la droite
<Indenter la sélection vers la gauche
~Inverser la casse de la sélection
uSélection en minuscules
USélection en majuscules
:Lancer une commande ex sur la plage
gvResélectionner la dernière sélection

Marques & sauts

ToucheAction
maPoser la marque a au curseur
`aSauter à la marque a (position exacte)
'aSauter à la marque a (ligne)
``Revenir à la position précédente
Ctrl+oListe de sauts - plus ancien
Ctrl+iListe de sauts - plus récent
:marksLister toutes les marques

Macros & registres

ToucheAction
qaEnregistrer une macro dans le registre a
qArrêter l’enregistrement
@aExécuter la macro du registre a
@@Répéter la dernière macro
5@aExécuter la macro a × 5
:regAfficher tous les registres
"ayCopier dans le registre a
"apColler depuis le registre a
"+yCopier vers le presse-papiers système
"+pColler depuis le presse-papiers système

Objets textuels

Les objets textuels sont la raison pour laquelle ciw semble magique : ils décrivent sur quoi agir (mot entier, intérieur des guillemets…), indépendamment de la position du curseur à l’intérieur.

ToucheAction
ciwChanger le mot entier (inner word)
cawChanger le mot et son espace (around word)
ci"Changer à l’intérieur des guillemets
ci(Changer à l’intérieur des parenthèses
ci{Changer à l’intérieur des accolades
ci[Changer à l’intérieur des crochets
ditSupprimer l’intérieur d’une balise HTML
yipCopier le paragraphe
vasSélectionner la phrase entière
vapSélectionner le paragraphe entier

Indentation & repliage

ToucheAction
>>Indenter la ligne vers la droite
<<Indenter la ligne vers la gauche
=GAuto-indenter jusqu’à la fin du fichier
gg=GAuto-indenter tout le fichier
gqFormater / couper le texte sélectionné
zaBasculer le repli sous le curseur
zo / zcOuvrir / fermer le repli
zR / zMOuvrir / fermer tous les replis

Commandes Ex utiles

La ligne de commande (:) est un langage d’édition à part entière - et q: ouvre même un historique consultable de tout ce qu’on y a tapé.

La fenêtre de ligne de commande de Vim affichant l’historique des commandes Ex exécutées
ToucheAction
:set nuAfficher les numéros de ligne
:set rnuNuméros de ligne relatifs
:set icRecherche insensible à la casse
:set pasteMode collage (sans auto-indentation)
:syntax onActiver la coloration syntaxique
:! cmdLancer une commande shell
:r !cmdInsérer la sortie d’une commande shell
:sortTrier les lignes sélectionnées
:g/pat/dSupprimer les lignes contenant le motif
:v/pat/dSupprimer les lignes NE contenant PAS le motif

Techniques avancées

Les tableaux ci-dessus sont le vocabulaire. Voici la grammaire - les combinaisons qui justifient la courbe d’apprentissage.

Commenter un bloc de lignes avec le bloc visuel

Pour les commentaires # (Python / Bash / YAML) - identique pour // ou -- :

  1. Placez-vous sur la première ligne à commenter, en première colonne.
  2. Entrez en mode Visuel Bloc : Ctrl+v.
  3. Sélectionnez jusqu’à la dernière ligne avec j (ou un compteur comme 9j).
  4. Appuyez sur I (i majuscule - insertion en début de bloc).
  5. Tapez #, puis Esc - le # apparaît sur toutes les lignes sélectionnées.

Pour décommenter : placez le curseur sur le # de la première ligne, Ctrl+v, descendez avec j, puis x - toute la colonne de # disparaît d’un coup.

Commenter une plage avec :norm

  1. Sélectionnez les lignes visuellement (avec V) ou utilisez une plage comme :5,20.
  2. Lancez :'<,'>norm I# - insère # en début de chaque ligne.
  3. Pour décommenter : :'<,'>norm ^x - va au premier caractère non blanc et le supprime.

:norm rejoue n’importe quelle séquence de touches du mode Normal sur chaque ligne d’une plage. Combinez-la avec ce que vous voulez - c’est de l’édition en masse sans enregistrer de macro.

Ajouter du texte en fin de plusieurs lignes

  1. Visuel Bloc : Ctrl+v, sélectionnez les lignes avec j.
  2. Appuyez sur $ pour étendre la sélection jusqu’à la fin de chaque ligne.
  3. Appuyez sur A, tapez votre texte, puis Esc.

Exemple : ajouter une virgule à 10 lignes pour corriger un CSV - Ctrl+v9j$A,Esc.

Incrémenter des nombres en colonne

  1. Visuel Bloc : Ctrl+v, sélectionnez la colonne de nombres.
  2. g Ctrl+a - incrémente chaque nombre séquentiellement (1, 2, 3…) ; Ctrl+a seul incrémente tout de 1.
  3. g Ctrl+x - décrémente séquentiellement.

Recherche globale et exécution

  • :g/TODO/d - supprime toutes les lignes contenant TODO.
  • :g/def /norm O# --- - insère une bannière avant chaque fonction Python.
  • :v/import/d - ne garde que les lignes contenant import (global inversé).

Répéter un changement dans tout le fichier avec .

  1. Faites le changement une fois (p. ex. ciw → tapez le remplacement → Esc).
  2. Sautez à la cible suivante avec n.
  3. Répétez avec . - enchaînez n . n . à travers le fichier.

Plus chirurgical que :%s///g - vous vérifiez chaque occurrence avant d’appliquer.

Trier et dédupliquer

  • :sort - trie les lignes sélectionnées alphabétiquement ; :sort! inverse l’ordre.
  • :sort u - trie et supprime les doublons.
  • :sort n - trie numériquement.

Lancer une macro sur chaque ligne correspondante

  1. Enregistrez la macro dans le registre q : qqq.
  2. Lancez :g/pattern/norm @q - elle s’exécute sur chaque ligne correspondant au motif.

:wq - écrire. quitter. livrer.


Images : logo Vim (GPL) et diagramme des modes de Vim par Harp (CC BY-SA 4.0) ; capture d’écran des fenêtres scindées (GPL) et capture de l’historique des commandes par Vitaly Zdanevich (CC0) - toutes via Wikimedia Commons.