samedi 30 mars 2013

Abréviations et snippets dans Vim

J'utilise depuis peu de temps les abréviations dans Vim. Comme leur nom l'indique, elles permettent un remplacement automatique du texte tapé.

On peut mettre en place une abréviation à l'aide de la commande :ab[breviate]. Il est possible d'utiliser un préfixe pour mettre en place une abréviation pour un mode précis. A priori, vous allez les utiliser surtout en mode insertion, vous préférerez donc la commande :ia[bbrev].

Par exemple, tapez la commande suivante :

:ia teh the

Et lorsque vous taperez teh en mode insertion, il sera remplacé par the. C'est beau non ? On se croirait dans Word...

Il y mieux. Vous pouvez vous en servir pour faire des snippets. Par exemple, vous voulez que MAIN soit remplacé par :

if __name__ == '__main__': 
    main()

Vous pouvez passer la commande suivante :

:ia MAIN if __name__ == '__main__':<CR>main()

(si votre indentation automatique marche bien, ça ira !)

<CR> signifie carriage return, c'est le truc de base pour mettre un retour charriot dans les abréviations et les mappings.

Le problème, c'est que le remplacement aura lieu à chaque fois que vous taperez le terme. Pour éviter un remplacement, vous pouvez l'annuler avec Ctrl+V après la saisie. Ce n'est pas forcément ce que vous souhaitez...

OK, alors voilà ce que vous pouvez faire : vous pouvez utiliser un mapping en mode insertion. Reprenons notre exemple, sauf que nous souhaitons à présent que le remplacement soit validé par appui sur la touche Tab.

:imap MAIN<TAB>  if __name__ == '__main__':<CR>main()

Si vous ne vous rappelez pas vos abréviations ou de vos mappings utilisez simplement :

:ia

pour lister vos abréviations et

:imap

pour lister vos mapping.

Si vous voulez mettre en place une liste de snippet pour un type de fichier donné (exemple, pour du C ou du Python), peut-être pouvez vous mettre tous vos ia et imap dans un fichier que vous sourcerez par une autocommand. Mais cela fera l'objet d'un autre post sur Vim.