Vim et git commit: positionner le curseur sur la 1ère ligne

Si vous utilisez Vim et git, vous avez peut-être déjà rencontré ce problème. Selon la configuration de votre éditeur, il est possible que celui-ci sauvegarde le dernier emplacement du curseur lorsque vous quittez un fichier. Or, lorsque vous éditez un message de commit, c'est toujours le même fichier qui est édité, à savoir .git/COMMIT_EDITMSG : lors de votre prochain commit, Vim va donc penser que vous éditez de nouveau un fichier anciennement édité, et il positionnera le curseur là où il était lors de votre dernier commit.


Alors certes, ce n'est pas un bien gros problème: un simple ggi vous positionnera sur la première ligne du fichier (gg) et passera Vim en mode insertion (i). Mais si vous utilisez Vim et Git, vous êtes vraisemblablement développeur. Et si vous êtes développeur, il est fort probable que vous n'aimiez pas répéter inutilement ce type de manipulations. Et que ça vous agace fortement !

Voilà la ligne de configuration qui m'a permis de résoudre ce petit désagrément (à ajouter dans votre fichier .vimrc) :

1
au FileType gitcommit au! BufEnter COMMIT_EDITMSG call setpos('.', [0, 1, 1, 0])

Voyons ce que ça fait de plus près :

  • au : version abrégée de autocmd, permet d'exécuter automatiquement certaines commandes lors de l'ouverture / fermeture d'un fichier, d'un buffer, d'une fenêtre… il y a énormément d'événements sur lesquels vous pouvez venir vous brancher, je vous invite à jeter un oeil à la vim help sur le sujet (:help automcd-events).
  • FileType gitcommit, les commandes qui suivent s'appliqueront aux fichiers "gitcommit".
  • au! BufEnter COMMIT_EDITMSG, avec un point d'exclamation, au! annule les commandes précédemment enregistrées pour l'événement "BufEnter COMMIT_EDITMSG" (entrée dans un buffer avec un fichier dont le nom matche "COMMIT_EDITMSG").
  • Pour ces fichiers là, on exécute enfin la commande setpos('.', [0, 1, 1, 0]), qui positionne le curseur (.) du buffer courant ([ 0, .. ]) à la première ligne et première colonne.

Et voilà ! Désormais, quand vous ouvrirez Vim pour votre prochain commit, le curseur sera bien positionné en début de fichier, et plus rien n'est en travers de votre chemin pour enchaîner les commits ;)


Référence :