Déplacements

Palier1 Les déplacements — les motions — ne servent pas qu’à bouger le curseur : ce sont eux qui délimitent la portion de texte sur laquelle un opérateur va agir. Chaque motion apprise ici est donc aussi une cible pour d, c ou y.

L’objectif du palier n’est pas de connaître cette page par cœur, c’est de ne plus jamais toucher les flèches.

Caractères et lignes

  • h, j, k, l : gauche, bas, haut, droite
  • 0 : premier caractère de la ligne
  • ^ : premier caractère non-blanc de la ligne
  • $ : fin de la ligne
  • g_ : dernier caractère non-blanc de la ligne
  • + / - : premier caractère non-blanc de la ligne suivante / précédente

Avec wrap activé, j et k sautent la ligne logique entière ; gj et gk se déplacent d’une ligne affichée à l’écran.

La numérotation relative

relativenumber affiche la distance de chaque ligne au curseur au lieu de son numéro absolu. On lit alors directement le compteur à taper : la ligne à effacer est marquée « 7 », donc 7dd. C’est l’option qui rend les compteurs utilisables sans compter.

Mots

Neovim distingue le mot — une suite de caractères alphanumériques, découpée par la ponctuation — du MOT en majuscules, simplement délimité par des espaces. foo.bar compte pour trois mots, mais un seul MOT.

  • w / W : début du mot / MOT suivant
  • e / E : fin du mot / MOT suivant
  • b / B : début du mot / MOT précédent
  • ge / gE : fin du mot / MOT précédent

Dans la ligne

  • f{char} : saute sur la prochaine occurrence du caractère
  • F{char} : idem en arrière
  • t{char} : s’arrête juste avant la prochaine occurrence (till)
  • T{char} : idem en arrière
  • ; : répète le dernier f, F, t ou T
  • , : le répète dans le sens inverse

Ce sont les deux touches les plus rentables de tout Vim. dt) — supprimer jusqu’à la parenthèse fermante — ou cf, — changer jusqu’à la virgule — remplacent la moitié des sélections à la souris qu’on faisait avant.

Phrases, paragraphes et blocs

  • ( / ) : début de la phrase précédente / suivante
  • { / } : paragraphe précédent / suivant, c’est-à-dire le prochain saut de ligne vide
  • % : saute sur la parenthèse, l’accolade ou le crochet correspondant
  • [{ / ]} : début / fin du bloc entre accolades qui contient le curseur
  • [( / ]) : idem pour les parenthèses

Dans du code, } est le déplacement vertical le plus efficace : il saute de bloc en bloc plutôt que de ligne en ligne.

Écran

  • H, M, L : haut, milieu, bas de l’écran (high, middle, low)
  • Ctrl + d / Ctrl + u : descend / monte d’une demi-page
  • Ctrl + f / Ctrl + b : descend / monte d’une page entière
  • Ctrl + e / Ctrl + y : fait défiler d’une ligne sans bouger le curseur
  • zz, zt, zb : recentre l’écran sur le curseur, l’amène en haut, en bas

Ctrl + d puis zz est un enchaînement courant : on descend, on recentre, on garde le contexte des deux côtés. L’option scrolloff évite d’avoir à le faire en maintenant en permanence quelques lignes visibles autour du curseur.

Fichier

  • gg : première ligne
  • G : dernière ligne
  • {n}G ou :{n} : ligne n
  • {n}% : à n % du fichier

Revenir sur ses pas

Neovim tient une liste des sauts — tout déplacement « lointain » comme G, %, une recherche ou l’ouverture d’un fichier — et une liste des modifications.

  • Ctrl + o : recule dans la liste des sauts
  • Ctrl + i : avance dans la liste des sauts
  • g; / g, : recule / avance dans la liste des modifications
  • `` : revient à la position d’avant le dernier saut
  • '' : idem, mais sur le premier caractère non-blanc de la ligne
  • Ctrl + ^ : bascule sur le buffer précédent

:jumps et :changes affichent ces deux listes. Ctrl + o est la touche qui rend la navigation agressive sans risque : on saute au loin, on regarde, on revient.

Dans ma config

Trois différences, toutes dues à des plugins :

  • f, F, t, T franchissent les lignes et étiquettent chacune de leurs correspondances : une seconde frappe atteint n’importe laquelle d’entre elles, pas seulement la plus proche. ; et , répètent comme d’habitude. Les étiquettes disparaissent dès qu’un compteur est donné, donc 3fx reste littéral.
  • s est un saut étiqueté n’importe où à l’écran, et n’est donc plus substitute — son équivalent cl reste disponible.
  • gd va à la définition via le serveur de langage, et ]f / [f, ]c / [c sautent de fonction en fonction et de classe en classe. Ces déplacements alimentent la liste des sauts, donc Ctrl + o les annule.

scrolloff = 8 garde huit lignes de contexte, et relativenumber est actif. Détails dans Ma configuration.

Aller à la définition, sans LSP

gd et gD sont les commandes historiques : elles cherchent la déclaration du mot sous le curseur dans la fonction courante, puis dans le fichier, par simple recherche textuelle. Dès qu’un serveur LSP est attaché, Ctrl + ] donne le vrai saut vers la définition.