É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.

ObjetPortée
iw / awmot, sans / avec l’espace qui le suit
iW / aWMOT (délimité par des espaces)
is / asphrase
ip / apparagraphe
i( i) ibintérieur des parenthèses
i{ i} iBintérieur des accolades
i[ / i]intérieur des crochets
i< / i>intérieur des chevrons
i" i' i`intérieur des guillemets
it / atcontenu / 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 corps
  • ac / ic : la classe / son corps
  • aa / 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 curseur
  • D : supprime jusqu’à la fin de la ligne, équivalent de d$
  • C : change jusqu’à la fin de la ligne, équivalent de c$
  • dd / cc : supprime / change la ligne entière
  • J : joint la ligne suivante à la ligne courante avec une espace
  • gJ : la joint sans ajouter d’espace
  • ~ : inverse la casse du caractère sous le curseur
  • Ctrl + 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, yy la ligne entière
  • p : colle après le curseur — après la ligne si le contenu est une ligne
  • P : 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 : annule
  • Ctrl + r : rétablit
  • U : 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édent
  • Ctrl + u : supprime jusqu’au début de la ligne
  • Ctrl + r{registre} : insère le contenu d’un registre
  • Ctrl + o : exécute une seule commande en mode normal puis revient
  • Ctrl + 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 :

  • I puis le texte puis Échap : insère sur toutes les lignes du bloc
  • A : idem, mais après le bloc
  • $A : ajoute en fin de chaque ligne, quelle que soit sa longueur
  • r{char} : remplace tout le bloc par un caractère
  • d : 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.