Édition
Palier2 Le palier qui fait la
différence. Les opérateurs combinés aux
déplacements couvrent déjà beaucoup ; les objets texte de
cette page complètent la grammaire, et . fait le reste.
Objets texte
Un objet texte désigne une structure plutôt qu’une distance. Il s’emploie à la
place d’une motion, derrière un opérateur ou depuis le mode visuel, et se lit en
deux temps : i pour inner — le contenu seul — et a pour around — le
contenu avec ses délimiteurs.
| Objet | Portée |
|---|---|
iw / aw | mot, sans / avec l’espace qui le suit |
iW / aW | MOT (délimité par des espaces) |
is / as | phrase |
ip / ap | paragraphe |
i( i) ib | intérieur des parenthèses |
i{ i} iB | intérieur des accolades |
i[ / i] | intérieur des crochets |
i< / i> | intérieur des chevrons |
i" i' i` | intérieur des guillemets |
it / at | contenu / balise complète d’une balise HTML ou XML |
Chacun a sa variante a : di( vide les parenthèses, da( supprime aussi les
parenthèses elles-mêmes.
L’intérêt principal est que le curseur n’a pas besoin d’être au bon endroit —
seulement quelque part dans l’objet. ci" change le contenu d’une chaîne où que
l’on se trouve dedans, cit remplace le contenu d’une balise. C’est ce qui rend
ces commandes fiables sans viser : il n’y a rien à cibler.
Dans ma config
nvim-treesitter-textobjects ajoute trois objets sémantiques, qui suivent la même
convention i / a et se combinent donc avec n’importe quel opérateur :
af/if: la fonction / son corpsac/ic: la classe / son corpsaa/ia: l’argument, avec / sans sa virgule
daf supprime la fonction, yic copie le corps de la classe, cia change
l’argument. Avec lookahead actif, dif fonctionne même depuis la ligne vide
au-dessus de la fonction. Détails dans Ma configuration.
Modifier et supprimer
x/X: supprime le caractère sous / avant le curseurD: supprime jusqu’à la fin de la ligne, équivalent ded$C: change jusqu’à la fin de la ligne, équivalent dec$dd/cc: supprime / change la ligne entièreJ: joint la ligne suivante à la ligne courante avec une espacegJ: la joint sans ajouter d’espace~: inverse la casse du caractère sous le curseurCtrl + a/Ctrl + x: incrémente / décrémente le nombre sous le curseur
Ctrl + a est plus utile qu’il n’y paraît : combiné à une macro, il numérote une
liste ou décale une série d’indices.
Copier et coller
y: copie (yank) la portion désignée,yyla ligne entièrep: colle après le curseur — après la ligne si le contenu est une ligneP: colle avant]p: colle en ré-indentant sur le contexte
Vim n’a pas un presse-papiers mais une trentaine de registres. Par défaut tout passe par le registre sans nom, ce qui suffit largement au palier 2 — avec un piège à connaître tout de suite.
Coller deux fois ne colle pas deux fois la même chose
Sélectionner du texte en mode visuel puis faire p remplace la sélection, mais
écrase aussi le registre sans nom avec le texte remplacé. Le collage suivant colle
donc autre chose. La parade est "0p, qui colle la dernière copie explicite —
détaillée dans Automatisation.
Par défaut, y et p sont isolés du presse-papiers du système : on copie dans
Vim, on colle dans Vim. "+y et "+p passent explicitement par le presse-papiers
partagé, et vim.opt.clipboard = 'unnamedplus' supprime la distinction.
Dans ma config
clipboard = 'unnamedplus' est actif : y et p travaillent directement avec le
presse-papiers du système, et le préfixe "+ est inutile.
Annuler et répéter
u: annuleCtrl + r: rétablitU: annule toutes les modifications faites sur la dernière ligne touchée.: répète la dernière modification:earlier 5m/:later 5m: remonte l’arbre d’annulation dans le temps
L’arbre d’annulation conserve les branches abandonnées : après un u puis une
nouvelle modification, l’ancienne version reste atteignable avec g- et g+.
Avec undofile, cet historique survit à la fermeture du fichier.
. mérite une attention particulière. C’est la touche la plus rentable de
l’éditeur, et la façon de formuler une commande détermine si elle est répétable
ou non — voir Automatisation.
Mode insertion
Quelques raccourcis évitent de sortir du mode insertion pour corriger :
Ctrl + w: supprime le mot précédentCtrl + u: supprime jusqu’au début de la ligneCtrl + r{registre}: insère le contenu d’un registreCtrl + o: exécute une seule commande en mode normal puis revientCtrl + n/Ctrl + p: complète le mot à partir du reste du buffer
Ctrl + o est le bon compromis quand on a besoin d’une action isolée : Ctrl + o
puis $ pour filer en fin de ligne sans changer de mode deux fois.
Mode visuel bloc
Ctrl + v sélectionne un rectangle, ce qui permet d’agir sur une colonne :
Ipuis le texte puisÉchap: insère sur toutes les lignes du blocA: idem, mais après le bloc$A: ajoute en fin de chaque ligne, quelle que soit sa longueurr{char}: remplace tout le bloc par un caractèred: supprime la colonne
C’est l’outil le plus rapide pour commenter cinq lignes, aligner des affectations ou ajouter une virgule en fin de chaque ligne d’une liste.