mardi 19 novembre 2013

Les autocommands dans Vim

Les autocommands sont une fonctionnalité intéressante de Vim. Elles permettent d'exécuter des actions lors d'évènements générés par l'éditeur. Par exemple, vous pouvez enclencher la correction orthographique en Français si vous éditez un fichier Latex. La commande pour cela est :

:autocmd BufNewFile,BufRead *.tex  set spell spelllang=fr

Analysons cette commande. La déclaration d'autocommands utilise la commande autocmd. Sa syntaxe est la suivante :

:au[tocmd] [group] {event} {pat} [nested] {cmd}

Dans notre cas, nous n'avons pas spécifié de groupe. {event} représente l'évènement à écouter. On peut associer une action à plusieurs évènements, comme ici où on veut déclencher une action sur BufNewFile, création d'un fichier dans un buffer et sur BufRead, lecture d'un fichier dans un buffer. {pat} est le motif associé à l'évènement, ici un nom de fichier se terminant par .tex. cmd est la commande à exécuter telle qu'on pourrait l'écrire en mode normal.

Je n'aborde pas [nested] qui sert à imbriquer des autocommand car je n'ai pas bien saisi les cas d'utilisation !

La page autocommand-events de l'aide vous donnera tous les évènements qu'il est possible d'écouter. Vous comprendrez alors qu'il s'agit d'une fonctionnalité majeure qui offre énormément de possiblités.

Personnellement, je l'utilise surtout pour :

  • changer les options d'indentation suivant le type de fichier ;
  • utiliser des templates lors de la création de nouveaux fichiers ;
  • mettre en place des mappings spécifiques.

Quelques conseils pour plus de facilité dans vos tests de configuration. Tout d'abord, vous verrez que lorsque vous vous attaquez à des commandes un peu compliquées et que vous sourcez régulièrement votre fichier .vimrc, les commandes s'ajoutent. Vous pouvez éviter ce comportement en utilisant la commande suivante, qui supprime toutes les autocommandes définies :

:autocmd!

Comme ce n'est pas super pratique d'appeler systématiquement cette commande avant de sourcer votre .vimrc vous pouvez également faire figurer vos autocommands dans des groupes. Toutes les autocommands d'un groupe sont réinitialisées si celui-ci commence par la commande :autocmd!. Exemple :

augroup sqlgroup
    autocmd!
    autocmd BufEnter *.sql,*.pks,*.pkb setlocal ignorecase
    autocmd FileType sql inoremap <buffer> DO<Tab> DBMS_OUTPUT.PUT_LINE();<Esc>hi
augroup END

Enfin, si vous utilisez les autocommands pour des mappings ou pour paramétrer des options, réduisez leur scope au buffer contenant le fichier :

"mapping local au buffer
autocmd FileType sql inoremap <buffer> DO<Tab> DBMS_OUTPUT.PUT_LINE();<Esc>hi
"set local au buffer
autocmd FileType html,xml,ant setlocal softtabstop=2 shiftwidth=2

Vous voilà maintenant prêts pour mettre en place une foule de snippets spécifiques à chaque type de fichiers que vous éditez !

En cas de besoin, je partage mon fichier .vimrc sur Github.