Dans Emacs et org-mode j’ai un fichier pour prendre des notes de points d’équipe réguliers. J’utilise un modèle qui, jusqu’à présent, était copié à la main. Mais heureusement on peut faire mieux.

Emacs dispose de plusieurs options pour la gestion de modèles de texte à insérer dans un buffer. Celui que je connaissais était yasnippet., même si je ne l’utilisais pas. Récemment j’ai vu passer un article sur tempel. Je n’ai pas trop vu d’avantages par rapport à yasnippet, donc je suis parti pour installer ce dernier.

L’installation dans ma configuration se fait en ajoutant une entrée dans le fichier emacs-config.org.

1(use-package yasnippet
2  :ensure t
3  :init
4  (add-to-list 'yas-snippet-dirs "/home/montfort/yasnippets")      (snippet-dir)
5  :config
6  (yas-global-mode 1))                                             (global-mode)

Que du classique et simple.

On utilise le mode global pour pouvoir accéder à yasnippet dans tous les buffers. Et on déclare un répertoire qui contiendra nos snippets personnels.

Pour créer mon modèle yasnippet j’ai sélectionné mon modèle existant et j’ai appelé la fonction yas-new-snippet.

Dans le nouveau buffer on peut voir notre modèle et au début du fichier 2 champs name et key. Ces 2 champs sont mis à jour ensemble automatiquement à la saisie du premier. name sera le nom de notre fichier et key le raccourci pour l’activer. Il suffira de taper ce raccourci puis TAB pour insérer le modèle.

 1# key: GTKub
 2# name: GTKub
 3# --
 4* `(format-time-string "%Y-%m-%d" (current-time))`
 5:PROPERTIES:
 6:EXPORT_DATE: `(format-time-string "%d/%m/%Y" (current-time))`
 7:EXPORT_PRESENT: Thomas Montfort,
 8:EXPORT_WHERE: rendezvous
 9:EXPORT_ABSENT:
10:EXPORT_EXCUSE:
11:ID:       ${1:`(org-id-new)`}                                                                                              (creation-uuid)
12:END:
13
14** Déroulé
15
16*** $2                                                                                                                      (champ2)
17$0                                                                                                                          (dernier-champ)
18
19*** TODO Truc à faire
20
21** Actions
22
23#+BEGIN: columnview :id ${1} :match "/TODO|DONE" :format "%ITEM(What) %TAGS(Who) %DEADLINE(When) %TODO(State)" :link t      (utilisation-1)
24| What              | Who        | When | State |
25|-------------------+------------+------+-------|
26#+END:
27
28** Décisions
29
30#+BEGIN: columnview :id ${1} :match "decision" :format "%ITEM(Decisions)" :link t                                           (utilisation-2)
31| Decisions |
32|-----------|
33#+END:

Tout d’abord parcourons le modèle.

Ce modèle va être inséré dans un document org qui contient toutes les réunions avec une entrée de premier niveau par réunion.

Une réunion a une date, une liste de choses (le déroulé) et à la fin deux tableaux qui récapitulent les actions et les décisions. La date est automatiquement insérée au bon format avec du code lisp. Les tableaux peuvent être mis à jour (C-c C-c sur la ligne de définition) avec les entrées sous l’entrée identifiée par un id particulier. Et c’est là que yasnippet est aussi intéressant, c’est qu’il va générer et insérer automatiquement cet identifiant dans l’entrée de premier niveau (ligne 11) et dans la définition du premier (ligne 23) et du second tableau (ligne 30).

La syntaxe est simple ${1:`(org-id-new)`}. ${1} identifie un champ et entre backquotes on peut appeler du code lisp. Et si on positionne plusieurs fois ${1} le même texte sera inséré à chaque fois.

Après avoir appyué sur TAB on passe au champ ${2} qui sera le titre d’une entrée. Un autre appui sur TAB et on passe au dernier champ, ${0} qui sera le contenu de notre entrée.

On peut naviguer entre les champs avec TAB et S-TAB.

Voilà pour notre premier modèle qui en appelle déjà d’autres !