L’éditeur vim

VIM est un traitement texte assez ancien encore utilisé par des développeurs, car il permet de se passer de la souris. Il peut de plus s’avérer extrêmement utile en cas de manipulation de fichiers très volumineux, qu’il est possible de traiter avec des expressions régulières de très haut niveau.

2025.05.29 -- 2025.06.14 (en cours) – Cette page suit les recommandations de 1990 pour une orthographe réformée

Si l’application vim est installée sur votre système, elle s’ouvre en saisissant vim ou vim montexte.txt dans une console.

Le mode par défaut, à l’ouverture de vim, est appelé mode «commande» (également appelé «normal») : les touches ont une fonction qui n’insère pas de caractères dans le texte courant mais qui permet de nombreux modes de déplacement du curseur et des effets sur le texte (suppression, copie…). C’est la succession des caractères frappés (souvent deux) qui décide quand la commande est interprétable.

Du mode «commande», les touches Ins., i, a, o… lancent le mode «insertion» (R pour le mode «recouvrement»), qui permet d’éditer le texte courant caractère après caractère. Esc. ou °c permet de revenir au mode «commande».

Du mode «commande» également, : donne accès à la ligne d’exécution en bas de la fenêtre, qui permet une commande plus complexe (recherche ou substitution, paramétrage…). Après l’exécution en ligne de commande, vim revient normalement en mode «commande», sinon Esc. ou °c permet de revenir à ce mode.

Pour passer du mode «exécution» au mode «insertion» (et vice versa), il faut repasser par le mode «commande» et donc presser Esc. ou °c. Voici le schéma du passage entre ces modes :

               ----->  [Esc] / °c  <-----
             /              v             \
            /       ----------------       \
 exécution :  <--- | Mode  commande | --->  [Ins.] i a o insertion
 recherche /       |   ou  normal   |       R recouvrement
à l’envers ?        ----------------

vim -c "help" ouvre directement l’éditeur sur la page générale d’aide (en anglais) ; sur un système Unix, la documentation se trouve en /usr/share/vim/vim90/doc

1. Le mode «insertion»

L’éditeur vim lancé se trouve en mode «commande». Pour saisir du texte, il est nécessaire de passer en mode «insertion».

1.1 Passages au mode «insertion»

À partir du mode «commande», il est possible de rentrer en mode «insertion» de différentes manières :

i passe au mode «insertion» à la position du curseur
Ins. comme i, cette touche permet également de passer du mode «insertion» au mode «recouvrement» et vice versa
I curseur en début de ligne

a après la position du curseur
$a ou A passe en mode édition en fin de la ligne courante

o insertion d’une nouvelle ligne en dessous du curseur
O insertion d’une nouvelle ligne au-dessus du curseur

s suppression du caractère courant avant d’entrer en mode «insertion»
S suppression de la ligne courante avant d’entrer en mode «insertion»

r mode remplacement pour un seul caractère puis retour en mode «commande»
R quitte le mode «commande» pour le mode «insertion» («recouvrement»)

Esc ou °c permet à tout moment de passer en mode «commande».

Note : il est possible de visualiser le mode actuel (INSERTION ou REMPLACEMENT) sur la ligne du fond avec Esc. :set showmode. Cela reste limité à la session actuelle. Pour un effet permanent, voir le paramétrage par .vimrc

1.2 Commandes du mode «insertion»

Del. efface le caractère sous le curseur
BackSp ou °h efface le caractère précédent le curseur, remontant au besoin à la fin de la ligne précédente
Enter ou °m envoie le caractère du curseur et les suivant sur une nouvelle ligne

Tab ou °i insère une tabulation (paramétrage avec :set tabstop=4)
°t indente la ligne courante (paramétrage avec :set shiftwidth=2)
°d désindente la ligne courante

°f liste les fichiers du répertoire courant et introduit le résultat dans le texte
°o + cmd permet de basculer en mode «commande» ; revient automatiquement en mode «insertion»

°w supprime la partie de mot située avant le curseur ; en début de ligne, remonte à la fin de la ligne précédente
°u supprime toute la partie de la ligne avant le curseur ; en début de ligne, remonte à la fin de la ligne précédente

°n liste les mots du texte pour complétion, position sur le premier mot
°p liste les mots du texte pour complétion, position sur le dernier mot

°y recopie le caractère situé sur la ligne au dessus de celle du curseur
°e recopie le caractère situé sur la ligne en dessous de celle du curseur

°c quitte le mode «insertion» pour le mode «commande»

°x préfixe des commandes en deux caractères :

1.3 Registres

En mode «insertion».

Il est possible de coller le contenu d’un registre sur un fichier et de rechercher une des dernières suppressions avec :

°r" la dernière chaine copiée (°r0) ou supprimée (°r1)
°r0 la dernière copie
°r1 à 9 les dernières suppressions (°r1 est la plus récente)
°r- une petite suppression qui n’affecte pas °r0
°r. la dernière insertion
°r: la dernière commande via la ligne d’exécution
°r% le nom du fichier actuel
°r/ la dernière recherche

°ra, °rb… permet d’insérer le contenu d’une macro de a à z (si elle a été définie) ; elle n’est alors pas considérée comme une commande mais comme un simple texte.

°o@· utilise une macro (· représente une lettre de a à z) en quittant le mode «insertion» juste pour la commande.

En mode «commande», Esc. :reg liste les registres et les macros.

Pour définir une macro, il faut passer par les modes commande ou exécution.

1.4 Expressions évaluées

En mode «insertion».

°r= ouvre une ligne d’exécution permettant d’insérer une expression VimScript dont le résultat après validation Enter est inséré dans le texte. Exemples :

2. Le mode «commande»

Au démarrage, Vim est en mode «commande». Appuyer sur une touche ne modifie pas directement le texte, mais déclenche des actions. La touche Esc. permet de revenir à ce mode à tout moment.

°g affiche le titre et le nombre de lignes, et la position actuelle du curseur (% du nombre total de lignes)

2.1 Déplacements

En mode «commande».

Les déplacements sont très importants car ils sont repris pour les commandes de suppression () et de copie ().

h, ou BackSp un caractère à gauche
l, ou Space un caractère à droite
j ou une ligne plus bas si c’est possible, même colonne si la ligne arrive jusque-là
k ou une ligne plus haut si c’est possible, même colonne si la ligne arrive jusque-là

Ces déplacement par lettre est un héritage du temps où les claviers ne disposaient pas nécessairement de touches fléchées ; elles permettent également de toujours garder les mains sur le clavier et limitent les déplacements.

Enter se positionne sur le premier caractère non-espace de la ligne d’en dessous

- remonte le curseur d’une ligne, sur la première colonne
+ descend le curseur d’une ligne, sur la première colonne
4- et 3+ permettent de remonter ou descendre le curseur de plusieurs lignes
5G positionne le curseur sur le premier caractère non espace de la cinquième ligne

w au début du mot ou de la ponctuation suivante
W au début du mot suivant, sans considérer la ponctuation
e à la fin du mot ou de la ponctuation suivante
E à la fin du mot suivant, sans considérer la ponctuation
b ou ge au début du mot ou de la ponctuation ou élision précédente
B ou gE au début du mot précédent, ponctuation et élision incluse

0 (zéro!), | ou Home en début de ligne
^ ou _ sur le premier caractère autre qu’espace de la ligne
$ ou End en fin de ligne
g_ au dernier caractère non espace de la ligne

# à l’occurrence précédente du mot courant si elle existe
* à l’occurrence suivante du mot courant si elle existe
% si le curseur est sur une parenthèse (), [] ou {} ouvrante ou fermante, saute à la correspondante

Recherche d’un caractère, limitée à la ligne courante :

se positionne sur le prochain caractère précisé avec ·
se positionne juste avant le prochain caractère précisé avec ·
remonte au caractère précédent précisé avec ·
remonte juste après la position à droite du caractère précisé
; réitère dans le sens d’une des quatre commandes précédente
, va à rebours d’une des mêmes commandes

{ à la ligne vide précédente
} à la ligne vide suivante
( remonte à la ligne vide précédente ou au début d’un groupement de lignes
) saute à la ligne vide suivante ou au début du prochain groupement de lignes

gg ou [[ au début du fichier
G, ]] ou °d au début de la dernière ligne du fichier

Note : un nombre avant une commande précise le nombre de fois que le déplacement doit se faire, 5w sautant cinq mots plus loin.

Écrans

H sur le premier caractère non espace de la ligne visible en haut de l’écran (le texte ne bouge pas)
L sur le premier caractère non espace de la dernière ligne visible du bas de l’écran, limité à la longueur du texte (le texte ne bouge pas)
M sur le premier caractère non espace à mi-hauteur de l’écran (le texte ne bouge pas)

°b le texte défile vers le bas d’une hauteur d’écran, le curseur ne bouge que pour rester dans la fenêtre
°f le texte défile vers le haut d’une hauteur d’écran, le curseur ne bouge que pour rester dans la fenêtre
°d le texte défile vers le haut d’une hauteur d’une demi-fenêtre ; arrivé au plus bas, c’est le curseur qui descend jusqu’à la dernière ligne
°u le texte défile vers le bas d’une demi-fenêtre ; arrivé au plus haut, c’est le curseur qui monte jusqu’à la première ligne

Sans déplacer le curseur par rapport au texte :

°e le texte se déplace d’une ligne vers le haut, le curseur suit le texte sauf s’il est sur la première ligne
°y le texte se déplace d’une ligne vers le bas ; le curseur suit le texte sauf s’il est le plus bas possible
zt déplace le texte pour que le curseur se place sur la première ligne de l’écran (si pas trop près de la fin du texte)
zz déplace le texte pour que le curseur se place à mi-hauteur de l’écran
zb déplace le texte pour que le curseur se place sur la dernière ligne de l’écran (si pas trop près du début du texte)

Définition d’une aire visuelle

La définition d’une aire visuelle permet la copie, l’effacement ou le déplacement d’un paquet de lignes ou de caractères. Si :set showcmd a été défini, la ligne du bas affiche -- VISUEL -- lorsqu’une aire est encours.

V marque une première ligne, tout déplacement vertical en sélectionne d’autres
v marque le caractère sous le curseur ; tout déplacement de celui-ci (voir ci-dessus) élargit une aire visuelle dans l’attente d’une commande °v permet de définir une aire visuelle rectangulaire

Un type d’aire visuelle sélectionnée, en choisir un autre (par exemple V après v) modifie le type de sélection ; saisir deux fois le même type l’annule.

gv repasse au mode visuel selon la dernière sélection

Une fois une aire visuelle sélectionnée, les commandes copier (y), supprimer (d), indenter (>>), etc. sont applicables, souvent réduites à un seul caractère.

2.2 Suppression –

En mode «commande» ; sert aussi à couper-coller

Mode «ligne»

dd supprime la ligne courante
3dd supprime la ligne courante et les deux suivantes
J remplace le saut de ligne par une espace et remonte donc la ligne suivante à la fin de la ligne courante

Mode «chaine»

dl, d→, x ou Del supprime le caractère du curseur
dh, d← ou X supprime le caractère qui précède du curseur (ce que ne fait pas BackSp en mode «commande»)
dj ou d↓ supprime les lignes courante et suivante
dk ou d↑ supprime les lignes courante et précédente

db supprime ce qui précède le curseur jusqu’au début du mot
dB supprime ce qui précède le curseur jusqu’à une espace ou début de ligne

de supprime la partie de mot à partir du curseur
dw comme de, jusqu’au mot suivant (espace comprise)
d3w comme dw, et les deux mots complets suivants
dW supprime la partie de mot à partir du curseur, l’éventuelle ponctuation et l’éventuelle espace

diw supprime le mot courant
diW supprime le mot courant, ponctuation et élision (par exemple l’aile,)

d0 supprime du début de ligne jusqu’au curseur
d^ supprime du premier caractère jusqu’au curseur
d$ ou D supprime du curseur à la fin de la ligne

d} supprime du curseur à la fin de paragraphe (ligne vide)
d{ supprime de la ligne vide précédente jusqu’au curseur

dG supprime de la ligne du curseur jusqu’à la fin du fichier
dgg supprime du début de fichier à la ligne du curseur, comprise

Sur une même ligne seulement :

di" supprime ce qu’il y a autour du curseur entre deux "
di' supprime ce qu’il y a autour du curseur entre deux '

Sur éventuellement plusieurs lignes :

di( ou di) supprime le contenu entre les parenthèses ( et ) entourant le curseur
di[ ou di] supprime le contenu entre les crochets [ et ] entourant le curseur
di{ ou di} supprime le contenu entre les accolades { et } entourant le curseur

Si une aire visuelle est sélectionnée,

d supprime l’aire visuelle définie

Couper-coller

Une suppression en mode «commande» peut servir à déplacer un texte avec :

p replace le texte effacé, après la ligne du curseur (en mode ligne) ou à partir de la position exacte du curseur (en mode chaine)
P replace le texte effacé, avant la ligne du curseur (en mode ligne) ou avant la position exacte du curseur

2.3 Copie –

En mode «commande».

Traitement par ligne·s

yy copie une ligne (yank, arracher)
5yy copie une ligne et les quatre suivantes, soit cinq lignes en tout

Traitement par chaine

yb copie du début de mot au curseur
yw copie la partie de mot à partir du curseur
y0 copie du début de la ligne au curseur
y^ copie du premier caractère non espace au curseur
y$ copie du curseur à la fin de la ligne

Si une aire visuelle est sélectionnée,

y copie l’aire visuelle définie

Copier-coller

Une copie sert à coller un texte avec (mode «commande») :

p colle le texte copié, après la ligne du curseur (en mode ligne) ou à partir de la position exacte du curseur (en mode chaine)
P colle le texte copié, avant la ligne du curseur (en mode ligne) ou avant la position exacte du curseur

2.4 Remplacement –

En mode «commande».

La touche initiale de suppression () peut être remplacée , qui commence par supprimer les caractères visés et qui bascule en mode «insertion».

Traitement par ligne·s

De façon analogue à yy et dd :

cc supprime la ligne et entre en mode «insertion»
3cc supprime trois lignes et entre en mode «insertion» au début de la ligne vide qui les remplace

Traitement d’une chaine

c$ ou C efface à partir du curseur à la fin de la ligne et passe en mode édition
c0 efface ce qui est situé avant le curseur et passe en mode édition
c^ efface ce qui est situé avant le curseur jusqu’à l’indentation et passe en mode édition
   etc.

remplace le caractère sous le curseur par celui précisé · et revient en mode «commande»
R passe en mode «recouvrement» (Esc ou °c pour revenir en mode «commande»)

Si une aire visuelle est sélectionnée,

c entre en mode édition à la position (0,0) de l’aire visuelle supprimée

2.5 Refaire / Annuler

En mode «commande».

. réitère la dernière modification

u annule la commande précédente (les modifications en mode «insertion» constitue une seule commande)
3u annule les trois actions précédentes
:undo et :undo 3 en ligne de commande

U annule les dernières modifications, en se limitant à la dernière ligne modifiée

°r annule l’annulation

g- ou :earlier revient à l’état antérieur, avant la dernière modification
g3- ou :earlier 3 revient à l’état avant les trois dernières modifications

:earlier 500s (m, h et d) revient à l’état d’il y a 500 secondes
:earlier 1f ramène l’état du fichier avant le dernier enregistrement
:later 1f ramène l’état du fichier avant :earlier 1f

:echo changenr() donne le numéro d’ordre de la dernière modification opérée sur le fichier en cours.

g+ ou :later retourne à un état postérieur vers la modification la plus récente
g3+ ou :later 3 retourne trois étapes vers la modification la plus récente
:later 3m (s, h et d) retourne à l’état 3 minutes plus tard

:undolist indique le nombre de modifications entre chaque sauvegarde

°o saute à la précédente position du curseur, et au fichier précédent si le fichier courant est sauvegardé
°i revient à une position suivante du curseur et au fichier suivant dans l’ordre d’édition

Note : les informations sur les exécutions (ligne de commande) et les positions du curseur sont consignées dans le fichier ~/.viminfo, entre autres choses.

2.6 Changement de casse

En mode «commande» :

~ (frapper deux fois) change la casse de la lettre sous le curseur
gUU passe la ligne courante en majuscules
guu passe la ligne courante en minuscules

Les autres déplacement permettent également un passage en majuscule / minuscules :

guw passe la fin du mot en minuscule
gUw passe la fin du mot en majuscule
gub passe la partie du mot avant le curseur en minuscule
gUb passe la partie du mot avant le curseur en majuscule
gU$ passe en majuscule du curseur à la fin de la ligne
gU} passe en majuscule du curseur à la fin de paragraphe
   etc.

Si une aire visuelle est sélectionnée,

u convertit le texte de l’aire visuelle en minuscules
U convertit le texte de l’aire visuelle en majuscules
~ intervertit majuscules et minuscules dans le texte de l’aire visuelle

2.7 Macros

En mode «commande».

26 macros (de @a à @z) peuvent être définies en mode «commande». La séquence de définition d’une macro est :

q{lettre}{commandes}q

Pour une macro qui passe un mot entier en majuscules :

@u lance la macro, en l’occurrence passe le mot courant en majuscules
@@ répète la dernière macro

:reg liste les registres, et parmi eux les macros

qU···q définir une macro avec la lettre majuscule ajoute à la macro
quq efface la macro @u

Il est possible d’insérer le texte d’une macro à l’endroit du curseur, en mode «commande» :

"ap inscrit la chaine de la macro @a après le curseur
"aP inscrit la chaine de la macro @a à la position du curseur

Pour éditer un registre avec plusieurs lignes, il est possible d’ouvrir un nouvel onglet avec :new, saisir le texte, se positionner au tout début, Esc. pour revenir en mode «commande», puis enregistrer la macro avec "zyG, puis :q! pour sortir du dernier panneau.

Il est également possible de définir une macro en mode exécution.

3. Mode «exécution»

En mode «commande», : ouvre la ligne de d’exécution située en bas de la fenêtre, qui permet la sauvegarde d’un fichier, la sortie de vim, et des commandes plus élaborées, dont celles du système et la substitution. Une recherche de chaine utilise également la ligne du bas, mais en frappant / ou ?

Pour revenir au mode «commande» sans appliquer de ligne de commande, Esc. ou °c

3.1 La ligne d’exécution

:e fichier.txt charge un fichier (ou le crée s’il n’existe pas dans le chemin par défaut ou spécifié).
:e! fichier.txt recharge le fichier en édition en abandonnant les modifications non sauvegardées

:15 (et 15G en mode «commande») positionne le curseur au début de la ligne 15 (équivaut à vim +15 montexte.txt)

:w enregistre le fichier en édition
:wq ou x enregistre le fichier et quitte vim
:q quitte vim si le fichier est enregistré
:q! quitte vim sans enregistrer
:! {commande} exécute une commande shell et affiche sa sortie avant de revenir à l’éditeur avec Enter

:help affiche un fichier d’aide dans un nouveau panneau, indiquant toute une série de ressources incluses dans vim
:close ferme la fenêtre précédemment ouverte
:°f ouvre un panneau visualisant l’historique sur quelques lignes (Enter pour le fermer)

Commandes «shell»

:! permet d’exécuter une commande shell : :!ls -l *.txt affiche les fichiers TXT du répertoire courant.

3.2 :normal et :global

:normal selon la plage

:normal cmd permet une action du mode «commande» dans la ligne d’exécution, ce qui permet de la contextualiser :

:%normal cmd concerne toutes les lignes du fichier
:17normal cmd concerne la ligne 17 (1 pour la première ligne)
:$normal cmd concerne la dernière ligne
:7,13normal cmd concerne les lignes de 13 à 17
:.normal cmd concerne la ligne du curseur
:.+3normal cmd déplace le curseur trois lignes plus loin pour y appliquer la commande
:.-2normal cmd déplace le curseur deux lignes plus haut pour y appliquer la commande

:global selon la condition

:global/cdt/cmd ou :g/cdt/cmd permet de soumettre une action du mode «commande» à une condition (sensible aux expressions régulières :

:g/^#/d filtre les lignes commençant (^) par # et les supprime (d)

:global est sensible aux expressions régulières :

:g/\d$/d filtre les lignes terminant ($) par un chiffre \d et les supprime

:v (ou :g!) filtre les lignes ne répondant pas à une condition :

:v/#$/y permettra de copier les lignes ne terminant $ pas par #

:global et v peuvent préfixer une substitution :

:g/cdt/s/rech/rempl/g permet d’ajouter une condition préalable à une substitution
:v/cdt/s/rech/rempl/g permet de refuser au préalable les lignes satisfaisant à la condition cdt

Par exemple,

:g/^A/s/t/*/g remplace chaque t par un * pour les lignes qui commencent (^) par un A

3.3 Définitions

Macros

La ligne d’exécution est une méthode simple pour éditer une macro ou un texte à insérer :

:let @z="Une chaine, éventuellement\nen plusieurs lignes" édite le registre-utilisateur z
:let @Z="Une chaine à ajouter" ajoute une chaine au registre z si la majuscule est utilisée
:let @z="" efface le contenu du registre z

Paramètres

Il est possible de préciser des paramètres, valables pour une session :

:set ignorecase rend les recherches insensibles à la casse
:set nowrap désactive le retour à la ligneévite
:set number active la numérotation des lignes
  etc.

Terminer une commande par un ! l’annule. Voir le paramétrage.

3.4 Rechercher une chaine

/ chaine Enter recherche la chaine vers la fin du texte
? chaine Enter recherche la chaine vers le début du texte
n saute à l’occurrence suivante (ou précédente)
N remonte à l’occurrence précédente (ou suivante)

/a\nb cherche a et n séparés par une fin de ligne

/a\c cherche a et A, l’indépendance de la casse (majuscules et minuscules) étant assurée par \c

Attention ! une recherche s’écrit par défaut en expressions régulière, ce qui ne change pas grand-chose tant qu’elle porte sur des lettres et des chiffres. Pour certains caractères «magic», * . ^ $ [ ], cela peut poser des problèmes. Par exemple, pour le caractère «point» :

/. cherche la première occurrence d’un caractère quelconque
/\. cherche la première occurrence du point
/\M. cherche la première occurrence du point (le mode \M désactive le mode magic pour les six caractères)
/\M\. cherche la première occurrence d’un caractère quelconque

3.5 Substitution de chaines

La commande pour rechercher et remplacer utilise la syntaxe de sed. Elle nécessite la ligne de commande (Esc :), puis la formule :

:s/{recherche}/{remplacement}/

S’il existe des / dans la chaine à remplacer (par exemple 1/2), on peut utiliser un autre délimiteur :

:s@1/2@0,5@ d’autres caractères (& ! + - * = ^ $ ; : , ~…) peuvent également être utilisés, tant que les expressions ne les contiennent pas ; \ est interdit.

Une formule souvent utilisée est :

%s/chaine1/chaine2/gci

Dans la partie gauche :

:s concerne la recherche et remplacement («substitute») seulement dans la ligne du curseur
:%s concerne tout le fichier
:43s concerne la ligne 43 (1 désigne la toute première)
:2,5s concerne les lignes 2, 3, 4 et 5

Dans la partie droite :

g traite toutes les occurrences de la ligne ou des lignes concernées (sinon, seule la première occurrence de chaque ligne est traitée)
c demande une confirmation à chaque occurrence : y (yes), n (no), a (all), q (quit), l (last : yes+quit) ; déplacement du texte d’une ligne, le curseur suivant le texte : °e vers le haut, °y vers le bas
i signifie insensible à la casse, majuscules et minuscules sont traitées indifféremment

La partie centrale est moins évidente qu’il n’y parait. Les lettres et les chiffres sont interprétés tels quels, mais certains caractères, * . ^ $ [ ], doivent être précédés du caractère \ pour être interprété pour leur valeur de caractères, sinon ils font partie des expressions régulières.

Conditions avec :global et :v

:global et :v peuvent soumettre une :substitution à une condition :

:g/cdt/s/rech/rempl/g permet d’accepter au préalable les lignes satisfaisant à l’expression filtre
:v/cdt/s/rech/rempl/g permet de refuser au préalable les lignes satisfaisant à l’expression filtre

Note : après une substitution,

4. Expressions régulières

Les recherches et substitutions dans Vim s’appuient sur les expressions régulières, un ensemble de règles permettant de repérer des motifs dans les chaines de caractères. Elles peuvent être vues comme une extension des jokers * et ? dans la recherche de noms de fichiers.

Rappels

/rech positionne le curseur sur le premier caractère d’une chaine reconnue par le motif rech, n ou n pour aller d’une occurrence à l’autre.

%s/rech/rempl/gc applique une substitution sur tout le fichier, c permettant une décision à chaque occurrence

Principes

Dans une expression régulière, du code est utilisé pour décrire un ensemble de cas. Si les caractères alphabétiques et les chiffres sont normalement pris pour leur valeur littérale, certains caractères sont utilisés pour coder ou être «échappés» (précédés ou non de la barre inverse \) pour exprimer leur valeur littérale.

La description du fonctionnement des expressions régulières en vim considère le mode par défaut, «magic» ou \m. Pour les autres, \M \v et \V, voir :help magic ou la section sur les modes.

4.1 Sélection d’un caractère

. tout caractère, avec ou sans diacritique
\. le caractère «point»

\a tout caractère alphabétique, majuscule ou minuscule, sans diacritique
\A tout caractère non alphabétique ou avec diacritique, et chiffres

\p tout caractère imprimable (y compris l’espace)
\P caractère imprimable sauf chiffre

\w majuscule, minuscule, _ ou chiffre [A-Za-z_0-9]
\W ni majuscule, ni minuscule, ni _, ni chiffre [^0-9A-Za-z_] \l minuscules [a-z]
\L autre que minuscules [^a-z]
\u majuscules [A-Z]
\U autre que majuscules [^A-Z]

\k comme \w mais permet l’ajout de caractères avec :set iskeyword+= + un caractère à la fois (:set iskeyword-= est possible)
\K la même chose que \k, sans les chiffres \i semble une alternative \k mais insensible à :set iskeyword+= donc comme \w?
\I comme \i mais sans les chiffres

\h _ et majuscule ou minuscule sans diacritique [A-Za-z_]
\H ni_, ni majuscule ni minuscule sans diacritique [^A-Za-z_]

\f caractères de nom de fichier UNIX (et chemin) :A à Z, a à z, 0 à 9 et -,./_~
\F comme \f sans les chiffres

\s espace ou tabulation
\S ni espace ni tabulation

\d chiffres «arabes» [0-9]
\D autre que les chiffres arabes [^0-9]
\x chiffre hexadécimal [0-9A-Fa-f]
\X autre que chiffre hexadécimal [^0-9A-Fa-f]
\o chiffre octal [0-7]
\O autre que chiffre octal [^0-7]

Note : la séparation entre deux lignes se code \n dans le motif de recherche, mais \r dans le motif de remplacement.

Unicode

\%préfixenombre permet une recherche de caractère par son point Unicode :

\%dn cherche un caractère selon son point Unicode n, nombre écrit en décimal. Le nombre est limité au dernier caractère de 0 à 9
\%on cherche un caractère selon son point Unicode exprimé en octal, jusqu’à 377. Le nombre est limité au dernier caractère de 0 à 7
\%xhh cherche un caractère selon son point Unicode en deux caractères hexadécimaux
\%uhhhh cherche un caractère selon son point Unicode en quatre caractères hexadécimaux
\%Uhhhhhhhh cherche un caractère selon son point Unicode en huit caractères hexadécimaux

Un caractère parmi plusieurs

[aeiouy] désigne un caractère parmi ceux présents
[a-enp-v5-8] désigne les caractères de a à e, n, de p à v et de 5 à 8

Note : les caractères à l’intérieur des [] sont pris au sens littéral, . / +etc. sauf la barre inverse, qui doit toujours se coder \\

[^es] désigne tout caractère sauf ceux précisés après ^

Note : contrairement à d’autres implémentations «regex», [c-p^kn] (de c à p, excluant k et r) ne semble pas possible avec vim

Les choix pour un caractère peuvent être libellé de différentes façon :

[[:alnum:]] représente un chiffre ou une lettre sans diacritique, comme \a ou [a-zA-Z0-9] ; l’intérêt de [:alnum:] est qu’il être inclus dans une définition de choix [] :

[[:alnum:]./_] étend la liste des caractères alphanumériques avec / . _
[^[:alnum:]] accepte tout caractère non alphanumérique

[[:alpha:]] accepte les lettres caractères utilisé comme ponctuation
[[:blank:]] accepte les espaces et tabulations, mais pas les espaces insécables
[[:cntrl:]] accepte les tabulations (au minimum)
[[:digit:]] accepte les chiffres décimaux
[[:graph:]] accepte les caractères lisibles (ni l’espace ni la tabulation)
[[:lower:]] accepter les minuscules, également avec diacritique
[[:print:]] accepte les caractères imprimables, dont l’espace (mais pas la tabulation)
[[:punct:]] accepte les caractères utilisé comme ponctuation
[[:space:]] comme [[:blank:]], en plus de la nouvelle ligne, retour-charriot, line feed, tabulation verticale et form feed
[[:upper:]] accepter les majuscules, également avec diacritique
[[:xdigit:]] accepte les chiffres hexadécimaux

Note (Vim 9.0 GNU/Linux Debian12) :

4.2 Option, capture et contexte

Option

expr1\|expr2 permet expr1 ou expr2, ou les deux

.*expr1\&.*expr2 oblige la simultanéité de expr1 et expr2 sur une ligne

Capture

\( … \) permet de préserver des motifs, respectivement réintroduits par \1, \2… dans l’expression de remplacement

Dans la chaine de remplacement, \1, \2… peuvent être soumis à un changement de casse :

\u transforme en majuscule le caractère suivant
\U transforme en majuscules les caractères suivants (une réitération y met fin)
\l transforme en minuscule le caractère suivant
\L transforme en minuscules les caractères suivants (une réitération y met fin)
\e ou \E met fin au changement de casse

Note : la séparation entre deux lignes se code \r dans le motif de remplacement (\n dans le motif de recherche).

\%[] permet une séquence optionnelle progressive :

/toi\%[ts] sélectionne toi, toit et toits (mais pas tois ni toist)
/b\%[[ro]i] même chose, mais intercale un choix : br, bi, bri boi
/\<b\%[[ro]ie]\> évite (\< \>) que bris, abri, brisure, boiler, etc. soient sélectionnés

Note : à l’intérieur d’une telle structure, [ et ] se codent respectivement [[] et []]

\=expr d’insérer du code pour un remplacement. Pour multiplier par deux et ajouter 1 :

:%s/\d\+/\=submatch(0) *2 + 1/g

Contextes

Il s’agit quelquefois de s’assurer que le motif soit accompagné d’un autre, qui ne doit pas être pas être affecté dans la moditifcation. Il serait possible de le capturer avec \( … \) et de le restituer tel quel avec \1 (ou \2), mais il y a plus simple :

ctx\zs… pour un contexte précédant le motif
\zectx pour un contexte suivant le motif

Supposons la chaine thx123 defthx 15thx4 5thxnp thx :

/thx\ze\d pointe le t de thx123 et 15thx4 en s’assurant de la présence d’un chiffre suivant l’expressions
:s/thx\ze\d/THX/g remplace thx suivi d’un chiffre par THX dans les deux mots thx123 et 15thx4

:s/thx\(\d\)/THX\1/g effectue même travail avec capture et réutilisation

4.3 Quantités

\? suit un caractère optionnel (0 ou 1 fois) : ff\?r concerne fr ou ffr
\+ suit un caractère ou un groupe requis une ou plusieurs fois : ff*r concerne fr, ffr, fffr

* suit un caractère ou un groupe requis 0, 1 ou plusieurs fois

\{n … \} (ou \{ … }, la seconde accolade ne devant pas être échappée) permet plus de précision dans le nombre motif :

\{n} exactement n fois

Le plus possible (mode gourmand, «greedy») :

\{n,m} de n à m fois
\{n,} au moins n fois
\{,n} au plus n fois

Le moins possible (mode frugal, «non-greedy») :

\{-n,m} de n à m fois
\{-n,} au moins n fois
\{-,n} au plus n fois

La différence entre \{n,m} et \{-n,m} est que la seconde expression est moins gourmande (mode frugal)

:%s/.\{2,6}y/§§§/ considère cinq caractères quelconques (dont le premier y) et le deuxième y ; abcydy de abcydyz sera remplacée par §§§ +z (mode gourmand)
:%s/.\{-2,6}y/§§§/ ne considère que trois caractères quelconque et le premier y : abcy de abcydyz sera remplacé en §§§ + dyz (mode frugal)

:%s/\s\+$// enlève les espaces en fin de ligne :

4.4 Positions

^ ou \_^ début de ligne : ^tra désigne les mots commençant pas tra
\^ le caractère ^

$ ou \_$ fin de ligne
\$ le caractère $

\< début de mot
\> fin de mot

\%^motif le motif commence en début de fichier
\motif%$ le motif est situé en toute fin de fichier

\%43lmotif l’expression ne concerne que la ligne 43
\%<43lmotif l’expression doit commencer avant la 43e ligne
\%>43lmotif l’expression doit commencer après la 43e ligne

\%13cmotif l’expression doit commencer à la colonne 13
\%<13cmotif l’expression doit commencer avant la 13e colonne
\%>13cmotif l’expression doit commencer après la 13e colonne

\%#39;zmotif l’expression doit commencer à la marque z
\%<13cmotif l’expression doit commencer avant la marque z
\%>13cmotif l’expression doit commencer après la marque z

\%#motif l’expression commence à l’endroit précis du curseur
\%Vmotif (seulement dans une aire visuelle) réduit l’aire visuelle juste avant l’expression

4.5 Modes

/m\c cherchera m et M, l’expression \c assurant l’indépendance de la casse (majuscules et minuscules).

Deux paramétrages ont une influence sur la casse :

:set ignorecase ignore la casse lors d’une recherche :set smartcase (avec la précédente) ignore la casse sauf si la recherche contient une majuscule.

Par défaut les recherches et substitutions dans vim se font en mode «expressions régulières». Il est possible de plus ou moins désactiver ce mode en commençant l’expression par

\m (mode ‘magic’) est le mode par défaut présenté dans ce chapitre
\M (mode ‘not magic’) est le mode inverse de \m
\v (mode ‘very magic’) est un mode plus proche de la syntaxe habituelle, par exemple celle de python
\V (mode ‘very not magic’) est le mode inverse de \v

Par exemple :

/. cherche la première occurrence d’un caractère quelconque
/\M. cherche la première occurrence du point

Tableau des modes : le code pour l’expression littérale des caractères se trouve à gauche des quatre colonnes.

\m\M\v\V
\...\.\...\.
\***\*\***\*
\[[[\[\[[[\[
\]]]\]\]]]\]
?\??\?\???\?
\^^\^^\^^^\^
\$$$\$\$$$\$
@\@\@@\@@@\@
+\+\++\+++\+
&\&\&&\&&&\&
|\|\||\|||\|
(\(\(((\(\((
)\)\)))\)\))
<\<\<<\<<<\<
>\>\>>\>>>\>
{\{\{{\{{{\{
}\}\}}\}}}\}

Notes :

5. Aide à la programmation

Lorsqu’un fichier-source ou un script est clairement sauvegardé comme tel, vim dispose d’aide contextuelle.

K ouvre un fichier d’aide lorsque le curseur est sur une fonction, un mot-clé, un module (python) (q et Enter pour en sortir)
gf remplace le fichier actuel (qui doit être sauvegardé) par le fichier dont le nom se trouve sous le curseur

°o revient à la position ou au fichier précédent (voir gf)
°i avance vers la position ou le fichier suivant (dans l’historique des déplacements)

ga affiche l’Unicode du caractère sous le curseur, en décimal, hexadécimal et octal

°a incrémente le nombre sous le curseur
°x décrémente le nombre sous le curseur

]] saute à la prochaine définition de fonction
[[ saute à la définition de fonction précédente

5.1 Marquages

ma, mb… (de a à z) placent un repère à la position du curseur

'a, 'b… envoie le curseur au début de la ligne du repère
`a, `b… envoie le curseur à la colonne exacte du repère
'' et `` reviennent à la position précédente du curseur

:marks liste les repères (nom / ligne / colonne / début du texte) et des informations sur les derniers fichiers édités. :delmarks a supprime la marque a

Les marques A à Z (majuscules) sont des repères globaux, qui permettent de marquer distinctement des fichiers différents. Un fichier enregistré avec la marque mJ peut être ouvert avec 'A, en remplaçant éventuellement un fichier sauvegardé.

Note : les informations sur les marquages dans les fichiers sont consignées dans le fichier ~/.viminfo, ainsi que d’autres choses.

5.2 Indentations

>> ajoute huit espaces (par défaut) en début de la ligne courante
3>> effectue l’indentation pour trois lignes contigües
<< réduit l’indentation de la ligne courante

>j indente la ligne courante et celle du dessous
>k indente la ligne courante et celle du dessus

Si une aire visuelle est sélectionnée,

> indente l’aire visuelle vers la droite (voir shiftwidth)
3> indente trois fois l’aire visuelle définie vers la droite
< retour vers la gauche d’une indentation
3< trois retours d’indentation vers la gauche

Esc : set shiftwidth=4 fixe le nombre d’espaces à quatre pour l’indentation (voir shiftwidth).

>% indente le contenu de parenthèses (), [] et {} (curseur positionné sur l’une d’entre elles)
<% retrait d’indentation du contenu de parenthèses (), [] et {} (curseur positionné sur l’une d’entre elles)

5.3 Pliage du code

:set foldenable
:set foldmethod=indent (par exemple pour python)

Pour plier et déplier une structure (def, boucle, classe), se positionner sur une de ses lignes (pas la première)

zo déplie une structure
zc replie une structure
za plie ou déplie selon l’état courant

zr déplie tout
zm replie tout

zf crée un pliage manuel (si :set foldmethod=manual)
zd supprime le pliage

6. Onglets et panneaux

Cette partie traite des fichiers édités en parallèle et des vues différentes d’un même fichier. Les deux modes sont tout à fait compatibles.

6.1 Onglets (fichiers différents)

Plusieurs fichiers différents peuvent être ouverts en même temps, sous des onglets différents

:tabnew crée un onglet vide
:tabnext ou gt passe à l’onglet suivant ou revient au premier (boucle cyclique)
gT passe à l’onglet précédent ou saute au dernier (boucle cyclique)

Les différents noms de fichiers s’alignent sur la première ligne de la fenêtre ; le titre de l’onglet courant est plus contrasté.

6.2 Panneaux (plusieurs vues d’un même fichier ou fichiers différents)

Il est possible de diviser l’écran en deux ou plusieurs parties contenant le même fichier, vu à deux ou plusieurs endroits différents : c’est le même fichier qui est alors édité quel que soit le panneau dans lequel on travaille. Cela permet de comparer des parties de texte ou de code d’un même fichier et de faciliter les couper/coller d’un endroit à un autre.

Les commandes commencent par °w, suivi d’une touche pour l’action :

°ws °w°s divise la fenêtre horizontalement, créant deux vues empilées pour le même fichier
°wj, °w°j ou °w↓ passe sur la fenêtre voisine du bas (ne cycle pas)
°wk, °w°k ou °w↑ passe sur la fenêtre voisine du haut (ne cycle pas)

°wv °w°v divise la fenêtre verticalement, créant deux vues côte à côte pour le même fichier
°wh, °w°h ou °w← passe sur la fenêtre voisine de gauche (ne cycle pas)
°wl, °w°l °w→ passe sur la fenêtre voisine de droite (ne cycle pas)

Note : il est possible de diviser verticalement un panneau horizontal et vice-versa, sur plusieurs niveaux.

°ww ou °w°w passe d’une vue à l’autre (boucle)
°wq ou °w°w supprime la vue courante
°wx ou °w°x échange le panneau actif avec un panneau adjacent

°w+ / °w– agrandit / réduit le panneau actif
la fenêtre courante
°w= égalise la taille des panneaux

Pour d’autres fichiers

:sp (éventuellement suivi d’un nom de fichier) ouvre un panneau horizontal pour un autre fichier
:vs (éventuellement suivi d’un nom de fichier) ouvre un panneau vertical pour un autre fichier

:ls affiche tous les textes actuellement en édition
:bn affiche le texte en édition suivant de la liste des fichiers en édition
:bp affiche le texte en édition précédent de la liste

Attention : avec ces rotations, un texte peut n’être visible dans aucun panneau, tout en restant chargé en mémoire (buffer).

7. Paramétrage

7.1 En mode «exécution»

En mode «exécution», ces expressions permettent de modifier le comportement de l'éditeur pour la session seulement. Pour rendre les effets permanents, il faut éditer le fichier .vimrec .

:set autoindent commence une nouvelle ligne alignée sur l’indentation précédente
:set cursorcolumn colore la colonne du curseur
:set cursorline souligne la ligne contenant le curseur
:set expandtab transforme chaque tabulation en 8 espaces (ou selon la valeur fixée avec tabstop)
:set foldenable permet le repliement de code
:set ignorecase permet de faire des recherches et substitutions qui ne tiennent pas compte de la casse
:set nocompatible (avec vi) rend certaines fonctionnalités plus fluides
:set nowrap empêche le retour à la ligne lors d’un long paragraphe
:set number active les numéros de lignes
:set ruler affiche la position du curseur (ligne, colonne) et sa situation dans le fichier, en pourcentage (en bas, à droite)
:set showcmd affiche au milieu de la ligne du bas une commande de plusieurs caractères partiellement introduite
:set showmode affiche -- INSERTION -- ou -- REMPLACEMENT -- sur la ligne du bas en mode d’édition
:set noignorecase rétablit la différence des casses (majuscules et minuscules)
:set wildmenu permet de parcourir des options à partir d’une entrée minimale, avec Tab suivi des flèches et
:syntax on permet la coloration syntaxique des scripts et sources

Ces mêmes commandes terminées par un point d’exclamation annule ces paramétrages :

:set number! désactive les numéros de lignes

Pour préciser quelques valeurs :

:set tabstop=4 fixe la tabulation à 4 (8 par défaut)
:set shiftwidth=4 précise la largeur de l’indentation en mode «commande» avec >> (la réduire avec <<)
:set cmdheight=2 double la hauteur réservée à la ligne de commande
:set foldmethod=indent (ou =manual ou =syntax) methode de repliement de code

:set ignorecase ignore la casse lors d’une recherche :set smartcase (avec la précédente) ignore la casse sauf si la recherche contient une majuscule

Il est possible de paramétrer la souris :

:set mouse=a désactive la possibilité de copier un texte sélectionné à la souris
:set mouse=c rétablit la possibilité de copier un texte sélectionné à la souris
:set mouse=n active la souris en mode normal uniquement (utile pour copier sans interférer avec l’édition).

7.2 Paramétrage permanent (.vimrc)

.vimrc est un fichier de paramétrage lu par vim à son ouverture, permettant un paramétrage permanent ; .vimrc est un fichier caché ; ls -la .vim* le liste dans un terminal Unix :

-rw------- 1 toto toto 34335 30 mai 11:50 .viminfo
-rw-r--r-- 1 toto toto  1042 30 mai 01:56 .vimrc

Si le fichier existe, il est possible de l’afficher dans un terminal avec cat .vimrc Une façon simple d’insérer une ligne dans le fichier .vimrc) en le créant au besoin est de saisir dans un terminal :

echo "set showmode" >> ~/.vimrc

Dans vim, frapper les touches Esc et : et saisir :

:!echo "set showmode" >> ~/.vimrc

Ajouter des lignes les unes après les autres n’est pas très pratique, en tout cas pour s’y retrouver. Il vaut mieux éditer .vimrc (en le créant au besoin) avec vim .vimrc. Ce qui figure après un guillemet double " est un commentaire, n'en tient pas compte :

" === Affichages ===

set nocompatible   " s’affranchir de vi (première commande)
set showmode       " visualisation du mode INSERTION / REMPLACEMENT
set showcmd        " vue de la commande en train de s’écrire
set ruler          " ligne / colonne du curseur + % texte
set number         " numéros de ligne
set history=300    " longueur de l’historique des commandes

" === Recherches ===

set ignorecase     " abolit la différence majuscules / minuscules
set smartcase      " (avec la précédente) ignore la casse sauf
                   " si la recherche contient une majuscule

" === Tabulations et indentations ===

set tabstop=4      " valeur de la tabulation (8 par défaut)
set expandtab      " convertit la tabulation en espaces
set shiftwidth=2   " indentation avec >> ou << en mode commande
set autoindent     " nouvelle ligne alignée sur la précédente

" === Aide à la programmation ===

set foldenable         " permet le repliement de code
set foldmethod=indent  " methode ’indentation’ de repliement de code

syntax on              " coloration syntaxique des scripts et sources
colorscheme blue       " impose une des colorations syntaxiques
                       " disponibles en /usr/share/vim/vim90/colors/ :
                       " blue - darkblue - default - delek - desert
                       " elflord -evening - habamax - industry - koehler
                       " lunaperche - morning - murphy - pablo - peachpuff
                       " quiet - ron - shine - slate - torte - zellner

À suivre…