Commit 9347e84e authored by Anthony Le Cigne's avatar Anthony Le Cigne Committed by Bastien

Ajout des notes du 19 décembre 2017

parent 27bd5e90
#+TITLE: Atelier Emacs du 19 décembre 2017
* Début de l'atelier
- 4 Emacsiens présents : Édouard, Éric, Thierry, Anthony
- Retour sur la discussion à propos de Column View (cf. liste de
diffusion)
- Brève discussion sur [[http://spacemacs.org/][Spacemacs]]
+ Avantages : très bien pour ceux qui veulent dès le départ une
configuration puissante et ⩰ jolie, avec raccourcis
mnémotechniques et système de « couches » (Org, Python, etc.)
gérées par la communauté qui permettent d'avoir tous les bons
outils pour chaque domaine d'application. Pas forcément réservé
aux utilisateurs de Vim !
+ Désavantages : ajoute une couche supplémentaire de complexité, ce
qui rend difficile à la fois l'appropriation d'Emacs par
l'utilisateur et la résolution des bugs.
- Propositions de sujets pratiques pour l'atelier :
+ Évaluation de code Emacs Lisp sous Emacs
+ Org-mode : tutorial sur =org-capture= → sujet choisi
* =org-capture=
Nous utilisons un Emacs « vanilla » (pas de configuration
utilisateur) : =emacs -q=.
** Accès à la fonctionnalité
On accède à =org-capture= grâce à la fonction interactive
=org-capture= : =M-x org-capture=.
Le manuel suggère le raccourci =C-c c= ; celui-ci n'est pas défini par
défaut. En effet les raccourcis au format =C-c [a-zA-Z]= sont réservés
à l'utilisateur et aucun mode ne devrait les utiliser par défaut
(certains modes outrepassent cette recommandation).
On utilisera ici =C-c c= :
#+BEGIN_SRC emacs-lisp
(global-set-key (kbd "C-c c") 'org-capture)
#+END_SRC
Le raccourci est global, puisque par définition =org-capture= doit
être accessible depuis n'importe quel mode.
À noter : =org-capture= est une fonction « autoloadée ». L'appel à
cette fonction entraînera le chargement d'Org-mode si celui-ci n'est
pas déjà chargé. Donc pas besoin de =(require 'org)=, sinon on charge
/tout/ Org au lancement d'Emacs !
Démonstration dans notre Emacs « vanilla » :
1. Au départ Org-mode n'est pas chargé. =(member 'org features)=
retourne =nil=.
2. On évalue =(global-set-key (kbd "C-c c") 'org-capture)= dans le
buffer =*scratch*= grâce à =C-x C-e=.
3. On appelle =org-capture=. L'interface d'=org-capture= s'ouvre ce
qui montre bien qu'Org est chargé. =(member 'org features)=
retourne une valeur.
** Configuration de base
On se concentre sur la variable =org-capture-templates=. Rappel sur
l'attribution de valeurs à des variables en Emacs Lisp :
#+BEGIN_SRC emacs-lisp
(setq x 2)
#+END_SRC
#+RESULTS:
: 2
On donne ici la valeur 2 à =x=. Attention, la valeur précédente est
perdue le cas échéant ! Même principe avec n'importe quelle variable y
compris =org-capture-templates=.
=org-capture-templates= est une liste de listes. Chaque liste permet
de configurer une capture. Voici le format individuel de chaque
liste :
#+BEGIN_SRC emacs-lisp :results silent
'([raccourci] [description] [type] [cible] [template] [propriétés])
#+END_SRC
Voici un exemple simple permettant de capturer une note dans le
fichier =~/tmp/notes.org= :
#+BEGIN_SRC emacs-lisp
'("n" "Nouvelle note"
item
(file "~/tmp/notes.org")
"- %?"
:prepend t :kill-buffer t)
#+END_SRC
Les propriétés =:prepend t= et =kill-buffer t= permettent
respectivement de systématiquement rajouter un nouvel item au /début/
de la liste, et de se débarasser du buffer correspondant au fichier
=notes.org= qu'Emacs doit ouvrir temporairement.
Et donc concrètement, dans le contexte de la variable
=org-capture-templates= (liste de listes) on écrit :
#+BEGIN_SRC emacs-lisp
(setq org-capture-templates
'(("n" "Nouvelle note" ; raccourci et desc.
item ; type
(file "~/tmp/notes.org") ; cible
"- %?" ; template, avec %? pour curseur
:prepend t :kill-buffer t))) ; propriétés
#+END_SRC
On évalue avec =C-x C-e= et on teste avec =C-c c= : le nouveau menu
« Nouvelle note » permet bien de créer un item de liste au début du
fichier =notes.org=.
** Configuration plus avancée
*** Exemple : menu de notes
On va créer un menu général de notes [n], avec deux sous-menus : [i]
pour une idée, et [d] pour une dette stockée dans un tableau. Ces
notes atterriront dans deux sections différentes du fichier
=notes.org= : une section « Idées » vide et une section « Dettes »
dans lequel figure un début de tableau, comme ceci :
#+BEGIN_SRC org
,* Idées
,* Dettes
|-----+---------|
| Nom | Montant |
|-----+---------|
#+END_SRC
On peut créer un menu général grâce à une liste à deux éléments,
raccourci et description :
#+BEGIN_SRC emacs-lisp
'("n" "Notes")
#+END_SRC
Ceci deviendra plus clair ci-dessous.
**** Sous-menu 1
Cette liste à deux éléments doit être suivie immédiatement de ses
sous-menus. Dans notre exemple, pour les idées on aurait une première
liste :
#+BEGIN_SRC emacs-lisp
'("ni" "Nouvelle idée"
item
(file+olp "~/tmp/notes.org" "Idées")
"- %?\n Idée capturée le %U"
:prepend t :kill-buffer t)
#+END_SRC
=file+olp= précise non seulement le fichier mais la hiérarchie
complète permettant d'accéder à la section cible. On introduit
également l'idée des [[http://orgmode.org/manual/Template-expansion.html#Template-expansion][expansions]] qui permettent d'ajouter des
informations automatiquement à une capture. Dans notre cas, =%U=
permet d'introduire un timestamp inactif avec la date et l'heure.
**** Sous-menu 2
Pour les dettes :
#+BEGIN_SRC emacs-lisp
'("nd" "Nouvelle dette"
table-line
(file+olp "~/tmp/notes.org" "Dettes")
"|%?||"
:append t :kill-buffer t)
#+END_SRC
Ici on ajoute une ligne au tableau de la section « Dettes » du fichier
=notes.org=.
**** Configuration complète
#+BEGIN_SRC emacs-lisp
(setq org-capture-templates
'(("n" "Notes")
("ni" "Nouvelle idée"
item
(file+olp "~/tmp/notes.org" "Idées")
"- %?\n Idée capturée le %U"
:prepend t :kill-buffer t)
("nd" "Nouvelle dette"
table-line
(file+olp "~/tmp/notes.org" "Dettes")
"|%?||"
:append t :kill-buffer t)))
#+END_SRC
=C-c c n i= permet d'ajouter une nouvelle idée ; =C-c c n d= une nouvelle
dette (nom et montant dû).
*** Exemple : ajout d'une URL du presse-papier
Édouard a un script bash qui lui permet d'ajouter le contenu actuel du
presse-papier à la fin d'un fichier de notes pour consultation
ultérieure. Imaginons un cas basique : stockage d'une URL. On pourrait
faire ceci avec =org-capture= :
#+BEGIN_SRC emacs-lisp
(setq org-capture-templates
'(("u" "URL"
item
(file+olp "~/tmp/notes.org" "Favoris")
"[[%x][%?]]\nFavori ajouté le %U"
:prepend t :kill-buffer t)))
#+END_SRC
Ici on va créer un lien avec le contenu du presse-papier en cible
(=%x=). Le curseur est placé dans la zone de description du lien. On
précise la date avec =%U=. On pourrait aller plus loin avec =org-protocol=
notamment...
* Discussion de fin de séance !
Quelques liens en rapport avec la discussion que nous avons eu en fin
de séance :
- /The Right Thing/ vs. /Worse is Better/ : [[http://dreamsongs.com/WIB.html][lien]]
- Les ambitions initiales de Stallman pour Emacs : [[https://www.gnu.org/software/emacs/emacs-paper.html#SEC29][lien]]
- La mort du Web : [[https://staltz.com/the-web-began-dying-in-2014-heres-how.html][lien]]
- Les Piratebox : [[https://piratebox.cc/start][lien]]
- J'en oublie (malgré =org-capture=...)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment