Chapitre 04
La grammaire de l'édition
Objectifs
À la fin de ce chapitre, tu sauras :
- combiner un opérateur (
d,c,y) avec un mouvement pour éditer en une commande ; - utiliser les text objects (
iw,i",ip,i(…) pour agir sur « l'intérieur » d'une structure ; - répéter la dernière modification d'une seule touche avec
.; - sélectionner du texte en mode Visuel.
C'est le chapitre qui transforme Vim d'un éditeur bizarre en un éditeur puissant. L'idée est simple et profonde : au lieu d'apprendre des centaines de raccourcis, tu apprends une petite grammaire qui se combine.
Opérateur + mouvement
En mode Normal, beaucoup de commandes suivent la forme :
opérateur + mouvement
L'opérateur dit quoi faire, le mouvement dit jusqu'où. Les trois opérateurs de base :
| Opérateur | Action | Mémo |
|---|---|---|
d |
supprimer (delete) | coupe le texte |
c |
changer (change) : supprime et passe en Insertion | change |
y |
copier (yank) sans supprimer | on en parle au chapitre 5 |
Tu connais déjà les mouvements du chapitre 3 (w, e, $, f<c>…). Combine-les avec un opérateur :
| Commande | Effet |
|---|---|
dw |
supprime du curseur jusqu'au début du mot suivant |
de |
supprime jusqu'à la fin du mot |
d$ |
supprime jusqu'à la fin de la ligne |
d0 |
supprime jusqu'au début de la ligne |
cw |
change le mot (supprime + Insertion) |
df) |
supprime jusqu'à la prochaine ) incluse |
ct" |
change jusqu'avant le prochain " |
C'est combinatoire : 3 opérateurs × tous les mouvements = des dizaines de commandes que tu n'as pas à mémoriser une par une. Tu les composes.
# Curseur sur "total", tu veux remplacer le mot par "sous_total" :
total = total + prix
# Tape cw → "total" disparaît, tu es en Insertion → tape sous_total → Échap
À retenir — Ne mémorise pas des commandes, mémorise la grammaire. Si tu sais supprimer (
d) et te déplacer jusqu'à une cible (f),$,e…), tu sais déjà supprimer jusqu'à cette cible :d+ le mouvement.
Le doublé : opérateur sur la ligne entière
Doubler l'opérateur agit sur la ligne entière :
| Commande | Effet |
|---|---|
dd |
supprime la ligne entière |
cc |
change la ligne entière (vide la ligne et passe en Insertion) |
yy |
copie la ligne entière |
Et le count fonctionne toujours : 3dd supprime 3 lignes, 2cw change 2 mots.
Les text objects : agir sur une structure
Les mouvements vont d'un point à un autre. Les text objects désignent une structure entière, où que soit le curseur dedans. Ils s'écrivent en deux lettres :
i+ délimiteur = inner, l'intérieur (sans les délimiteurs) ;a+ délimiteur = a/around, tout l'objet (délimiteurs inclus).
| Text object | Désigne… |
|---|---|
iw / aw |
un mot (intérieur / avec l'espace autour) |
i" / a" |
l'intérieur des guillemets / les guillemets inclus |
i' / a' |
idem avec apostrophes |
i( ou ib / a( |
l'intérieur des parenthèses / parenthèses incluses |
i{ ou iB / a{ |
l'intérieur des accolades / incluses |
i[ / a[ |
l'intérieur des crochets |
it / at |
l'intérieur d'une balise HTML / la balise entière |
ip / ap |
un paragraphe |
On les combine avec un opérateur. Le curseur n'a pas besoin d'être au bord : il suffit qu'il soit à l'intérieur.
produits = [("pain", 1.20), ("lait", 0.95)]
# ^ curseur ici, dans "pain"
ci"(curseur n'importe où entre les guillemets) → effacepainet passe en Insertion. Tapebaguette→ on a"baguette".di((curseur dans la parenthèse) → vide l'intérieur de(...).daw→ supprime le mot et l'espace autour, proprement.
C'est l'outil le plus « magique » de Vim. Lis ci" comme une phrase : change inner quotes, « change
l'intérieur des guillemets ». da( : delete around parentheses.
Astuce —
ci(,ci",ci{sont des commandes que tu utiliseras des dizaines de fois par jour en codant : changer le contenu d'un appel de fonction, d'une chaîne, d'un bloc. Mémorise-les en priorité.
La touche qui change tout : le point
. (le point) répète la dernière modification. Pas un déplacement : une modification (insertion,
suppression, changement). C'est l'outil de productivité numéro un de Vim.
Exemple. Tu veux supprimer plusieurs mots prix dans un fichier :
- Place-toi sur le premier, tape
cwmontantpuisÉchap(tu changesprixenmontant). - Va sur le
prixsuivant (avecw,f, recherche…). - Tape
.: Vim rejoue exactementcwmontant+ sortie. Le mot est changé. - Répète : déplacement,
., déplacement,.…
Tu n'as composé la modification qu'une fois ; ensuite, c'est une touche par occurrence.
À retenir — Le combo gagnant de Vim, c'est « un déplacement précis » +
.. On l'appelle parfois le dot dance (« la danse du point ») : tu sautes à la cible, tu répètes, tu sautes, tu répètes.
Le mode Visuel : sélectionner d'abord, agir ensuite
Parfois tu préfères voir ta sélection avant d'agir. C'est le mode Visuel :
| Touche | Effet |
|---|---|
v |
sélection caractère par caractère |
V |
sélection ligne par ligne |
Ctrl-v |
sélection en bloc (rectangulaire, colonnes) |
Tu entres en Visuel, tu étends la sélection avec les mouvements (w, $, j, text objects…),
puis tu appliques un opérateur sans mouvement car la sélection en tient lieu :
v puis e → sélectionne jusqu'à la fin du mot
puis d → supprime la sélection
Vd: sélectionne la ligne entière puis la supprime (équivaut àdd).vi"d: sélectionne l'intérieur des guillemets, puis supprime (équivaut àdi").Vpuisj jpuisd: sélectionne 3 lignes et les supprime.
Le mode Visuel et la grammaire opérateur+mouvement font la même chose de deux façons. Quand tu sais
exactement quoi faire, di" est plus direct. Quand tu veux ajuster la sélection à l'œil, le Visuel
est plus rassurant. Les deux sont utiles.
Attention — En mode Visuel,
Échapannule la sélection sans rien modifier. Pas de panique si tu sélectionnes de travers :Échap, et tu recommences.
Résumé
- L'édition suit une grammaire :
opérateur(dsupprimer,cchanger,ycopier) +mouvement(w,$,f)…). - Doubler l'opérateur agit sur la ligne :
dd,cc,yy. Le count marche :3dd. - Les text objects désignent une structure :
i= intérieur,a= tout l'objet. Ex.ci",di(,daw. Le curseur juste besoin d'être dedans. .répète la dernière modification. Combo roi : déplacement précis +..- Le mode Visuel (
v,V,Ctrl-v) sélectionne d'abord ; on applique ensuite l'opérateur.
Exercices
Exercice 1 — Changer le contenu d'une chaîne
Dans panier.py, sur la ligne des produits, remplace le texte pain (entre guillemets) par
baguette sans sélectionner manuellement les lettres, et où que soit ton curseur entre les
guillemets.
Voir le corrigé
La démarche : le text object i" désigne l'intérieur des guillemets ; combiné à c (changer), il
vide la chaîne et passe en Insertion.
- Place le curseur quelque part entre les guillemets de
"pain"(par exemple avecf"puisl). - Tape
ci"→paindisparaît, tu es en Insertion. - Tape
baguette, puisÉchap.
Résultat : "baguette". Tu n'as compté aucune lettre.
Exercice 2 — Supprimer jusqu'à un caractère
Sur la ligne print("Total du panier :", total), supprime tout depuis le curseur (placé sur le p de
print) jusqu'à la parenthèse ouvrante incluse, en une commande.
Voir le corrigé
La démarche : d + un mouvement f( qui va sur la parenthèse (incluse).
- Curseur sur le
pdeprint. - Tape
df(→ supprimeprint(.
Si tu voulais t'arrêter avant la parenthèse, tu utiliserais dt(.
Exercice 3 — La danse du point
Dans panier.py, ajoute la chaîne EUR (avec l'espace) ou fais une petite modification répétable de
ton choix sur plusieurs lignes, en composant la modification une seule fois puis en la rejouant
avec ..
Voir le corrigé
La démarche : on fait la modification une fois proprement (elle doit être « rejouable »), on se
déplace, puis ..
Exemple : tu veux mettre un # de commentaire devant plusieurs lignes.
- Sur la première ligne à commenter, tape
I#puisÉchap(insère#au début). - Descends sur la ligne suivante avec
j. - Tape
.→ Vim rejoueI#+Échap. j,.,j,.… pour chaque ligne.
Tu n'as composé l'insertion qu'une fois.
Quiz
1. Que fait la commande dw ?
- A. Supprime le mot précédent.
- B. Supprime du curseur jusqu'au début du mot suivant.
- C. Duplique le mot.
2. Le curseur est au milieu d'une chaîne entre guillemets. Que fait ci" ?
- A. Copie la chaîne.
- B. Supprime l'intérieur des guillemets et passe en Insertion.
- C. Supprime les guillemets eux-mêmes.
3. À quoi sert . (le point) en mode Normal ?
- A. À répéter le dernier déplacement.
- B. À répéter la dernière modification.
- C. À ajouter un point au texte.
4. Quelle commande sélectionne la ligne entière en mode Visuel ?
- A.
v - B.
V - C.
Ctrl-v
Voir les réponses
- B —
d(supprimer) +w(mouvement « mot suivant »). - B —
i"= intérieur des guillemets ;csupprime puis passe en Insertion.a"inclurait les guillemets. - B —
.répète la dernière modification (pas un déplacement). C'est l'outil de répétition central. - B —
Vsélectionne ligne par ligne ;vcaractère par caractère,Ctrl-ven bloc.
Projet fil rouge
Jalon « premier refactoring clavier ». Dans panier.py, effectue ce mini-refactoring sans souris :
- Renomme la variable
totalenmontantpartout où elle apparaît. Astuce : sur la première occurrence,cwmontant+Échap, puis déplace-toi sur les suivantes et.. - Change le libellé
"Total du panier :"en"Montant du panier :"avecci". - Supprime la ligne
remise = 0.10que tu avais ajoutée (avecdd). - Enregistre (
:w).
Ajoute à cheatsheet.md :
## Grammaire de l'édition
- opérateurs : `d` supprimer · `c` changer · `y` copier
- combo : opérateur + mouvement → `dw`, `d$`, `df)`, `ct"`…
- ligne entière : `dd` `cc` `yy` (et `3dd`)
- text objects : `iw aw` · `i" a"` · `i( a(` · `i{ a{` · `ip`
- `.` répète la dernière modification (combo : déplacement + `.`)
- visuel : `v` caractère · `V` ligne · `Ctrl-v` bloc