E’ da un po’ che mi sono innamorato di org-mode, un modulo di Emacs (incluso nel branch stabile di Emacs fin dalla 20.0, mi pare…) che è perfetto per le mie manie/ossessioni/paranoie organizzatrici.
In breve, permette di avere varie liste, tra cose da fare, TODO, task semplici, ecc..Permette anche di fissare delle deadline o schedulare le attività, integrandosi nell’agenda di Emacs e producendo degli ottimi rapporti. E la cosa migliore è che tutti i files sono in testo puro, plain text, quindi leggibili anche senza emacs, da altri programmi o direttamente. La sintassi è davvero semplice.
Certo, si tratta di decidere secondo quale logica organizzare i propri impegni e le proprie liste (ad esempio scegliendo un approccio GTD), ecco i file che uso:
- work.org
- work.org_archive
- personal.org
- personal.org_archive
I file “archive” sono automaticamente creati da emacs nel momento in cui un oggetto (qualsiasi tipo) viene archiviato. Nel file work.org ovviamente ci sono informazioni di lavoro, nel personal.org tutto il resto. Un piccolo esempio:
#+STARTUP: overview
* DAILY TODOS [2/3]
+ [X] Mandare sms prove
+ [X] Chiamare g.
+ [ ] Chedere permesso mercoledì
* Casa
** Attività informatica
#+CATEGORY: INFORMATICA
*** Gauss
**** TODO Installare Debian LXDE su gauss
*** Erdos
**** TODO Cambiare batteria
*** Turing
**** TODO Cambiare HD con SSD
*** TODO Finire config-o-matic
+ Refactoring
+ Setup.py
+ Aggiungere routine installazione pacchetti
*** TODO Scegliere UPS
Dovrebbe avere supporto per autoshutdown/snmp/via LAN
*** TODO Batteria iPod
*** TODO org-mode android
*** TODO Scrivere post blog org-mode
** HIFI
#+CATEGORY: HIFI
*** TODO nuova puntina
*** TODO cavi casse
*** TODO pulire contatti
*** TODO pulire ampli
*** TODO lavare dischi
** Macchina
*** DONE Olio freni
CLOSED: [2011-11-03 Thu 19:43]
*** TODO Bollo moto
DEADLINE: <2011-11-17 Thu>
*** TODO Inserzione pezzi moto
** Altro
#+CATEGORY: ALTRO
*** TODO Vendere Korg
*** TODO Vendere Fishman pu+preamp
*** TODO Tenda
*** TODO Affilare Jagger
Il #+STARTUP: overview all’inizio serve a far visualizzare ad emacs, alla prima apertura, soltanto gli header principali (quelli con un solo asterisco). Possono essere espansi spostandocisi sopra e premendo TAB (una o più volte, a seconda di quanti sottolivelli vogliono essere espansi). Per espandere tutti quelli del file si può usare Shift+TAB.
I vari livelli sono ovviamente delimitati da diversi numeri di asterischi, sotto ogni livello si può inserire del testo libero o delle note.
A mio avviso una caratteristica importante sono le checkbox che si possono creare ovunque usando la sintassi: SPAZIO + SPAZIO [ SPAZIO ] SPAZIO (si fa prima a vederle nell’esempio precedente). Una volta creata una checkbox si può cambiare il suo stato ponendosi sopra e usando C-c C-c.
In questo modo è abbastanza inutile, ma se si mette nell’header superiore [/] oppure [%] (o tutti e due), questi si trasformeranno automaticamente in contatori, aggiornandosi ogni volta che selezioniamo o deselezioniamo una checkbox.
Per aggiornare tutti i contatori in un file si può usare la sintassi C-u C-c #
Alcuni elementi sono preceduti dalla parola TODO. Questa viene automaticamente riconosciuta da org-mode che agisce di conseguenza:
- Viene evidenziata con colore diverso, a significare che è divenuto un elemento “attivo” e non solo testo.
- Viene listato nell’agenda (vediamo dopo, anticipo solo che si può chiamare con C-c a t)
- Può essere “ciclato” mettendocisi sopra e premendo C-c freccia-destra o C-c freccia-sinistra, e cambierà lo stato a seconda degli stati in una lista definiti dall’utente all’inzio del file, o nel .emacs
Se nessuno stato “personalizzato” viene definito, esso ciclerà attraverso in questo modo:
TODO -> DONE
Possiamo inserire delle schedulazioni o delle deadline per ogni header (quindi ogni cosa che inizia con uno o più asterischi), ponendoci sopra esso e usando la sequenza C-c C-s per lo scheduling (“Penso di dover iniziare a fare questa cosa il…”) o C-c C-d per la deadline (“Questa cosa deve essere completata entro il…”). In entrambi i casi si apre il calendario di Emacs in un frame separato che ci consente di scegliere il giorno. Ci si muove all’interno del calendario premendo il tasto Shift e le frecce, oppure inserendo manualmente la data.
Premendo invio ci comparirà, ben indentato sotto l’header che abbiamo scelto, la voce “SCHEDULED” o “DEADLINE” seguita dalla data.
Ovviamente nulla vieta di mettere schedule/deadline diversi su headers annidati…come nell’immagine qui sotto:

La cosa bella di org-mode è che tutto quanto è un file di testo, quindi possiamo tranquillamente scrivere, cancellare, modificare a mano i tag che ho elencato fin’ora (TODO, SCHEDULED, ecc..), le date e tutto il resto, ed Emacs le riconoscerà come “parole” speciali.
Se ad esempio voglio modificare una schedulazione posso riposizionarmi sull’header che mi interessa e premere ancora C-c C-s oppure modificare “a mano” la riga con la data; idem per cancellare un elemento…
Tuttavia tutte queste opzioni sono decisamente inutili se non sfruttiamo la possibilità di org-mode di interfacciarsi con l’agenda di Emacs (sapevate che Emacs ha un’agenda?) o di generare la sua.
Una volta che abbiamo creato il nostro bravo file, con le sue voci, i suoi header e le schedulazioni, possiamo avviare l’agenda con C-c a:
Ci viene presentato un menu di scelta, premiamo per iniziare a per vedere l’agenda per la settimana corrente:

Emacs ci genera automaticamente un file “di riepilogo” con le scadenze su cui stiamo lavorando. Spostandoci su una data e premendo Enter si “salta” all’header corrispondente. Come vedete le schedulazioni sono in verde mentre le deadline vengono visualizzate in rosso con il numero di giorni rimanenti (-x se sono scadute).
Possiamo uscire dalla “vista agenda” premendo q.
Sentitevi liberi di esplorare altre modalità di visualizzazione dei task, come quella che elenca solo i TODO (C-c a t) o la timeline completa (C-c a L). Il menu che compare premendo C-c a le elenca tutte.
Tutto questo è molto buono quando si lavora con un file solo, ma come ho detto prima io ho diviso i miei impegni in files differenti, uno personale, uno per il lavoro, ecc…
Dato che la visualizzazione di Emacs è unica (o perlomeno, io l’ho impostata così in modo da avere sempre sotto mano tutti gli impegni) serve qualcosa che divida graficamente le varie voci nell’agenda.
Per questo esistono le categorie e i tag.
I tag sono i più semplici da mettere: hanno come sintassi :tagname:altroeventualetag:ecc…: e come al solito possono essere inseriti sia manualmente sia automaticamente all’interno di emacs posizionandosi sull’header da “taggare” e premendo C-c C-c
Ovviamente org-mode indenterà tutti i tag appartenenti allo stesso header allo stesso livello.
A questo punto andiamo a ridiitare C-c a a per visualizzare l’agenda:
Grazie ai tag possiamo differenziare le varie voci (e non solo, i tag permettono di fare una marea di altre cose, come raggruppare le cose da fare, ma per questo rimando volentieri all’apposita sezione del manuale online).
Altro strumento utile sono le categorie. Per certi versi simili ai tag, si differenziano da questi perchè sono definite a livello di header e coinvolgono tutti i dati contenuti in essi (compresi eventuali altri sottoheaders). Volendo possono essere definiti a livello di file in modo che ogni elemento in quel determinato file abbia come categoria associata quella definita all’inizio del file con questa sintassi: #+CATEGORY: NOMECATEGORIA.
Anche per questo rimando al manuale online.
Una cosa che ho imparato, e di cui non posso più fare a meno, è la possibilità di inserire “al volo” dei dati (ad esempio dei TODO) all’interno di un file org e riprendere subito il proprio lavoro. Ad esempio, se sto lavorando su di un programma e mi viene in mente “Devo ricordarmi di inserire questa funzione all’interno di quell’altro programma” oppure “devo pagare il bollo della macchina” è molto comodo, con una rapida sequenza di tasti inserire l’idea al posto giusto, nel file giusto (o anche in un file temporaneo e poi spostare le idee quando si ha tempo) senza distrarsi troppo.
In org-mode questo si chiama capture ed è, come al solito, altamente personalizzabile. Io ad esempio ho inserito (tra l’altro) queste righe all’interno del mio file .emacs:
(global-set-key (kbd "C-M-r") 'org-capture)
(global-set-key (kbd "C-c r") 'org-capture)
(setq org-capture-templates
(quote (("s" "work sysadm" entry (file+headline "~/notes/work.org" "SYSADM")
"* TODO %?\n%U\n %i\n")
("t" "daily todo" checkitem (file+headline "~/notes/personal.org" "DAILY TODOS")
"+ [ ] %?\n%i \n")
("d" "da scaricare" entry (file+headline "~/notes/personal.org" "Scaricare/comprare")
"* TODO %?\n %i\n %x\n")
("w" "Watching" entry (file+headline "~/notes/desiderata.org" "Watching")
"* %?\n %i\n %x\n")
("r" "Reading" entry (file+headline "~/notes/desiderata.org" "Reading")
"* %?\n %i\n %x\n")
("w" "Listening" entry (file+headline "~/notes/desiderata.org" "Listening")
"* %?\n %i\n %x\n")
("e" "Learning" entry (file+headline "~/notes/desiderata.org" "Learning")
"* %?\n %i\n %x\n")
("p" "Projects" entry (file+headline "~/notes/desiderata.org" "Projects")
"* %?\n %i\n %x\n"))))
La cosa più interessante sono i templates. Prendiamo ad esempio
("w" "Listening" entry (file+headline "~/Dropbox/notes/desiderata.org" "Listening")
"* %?\n %i\n %x\n")
Il primo elemento “w” indica il tasto da premere dopo aver immesso al sequenza C-c r (collegata al “capture-mode”), “Listening” è una descrizione che mi aiuta a ricordare cosa vuol dire quella entry, entry vuol dire che l’elemento che andrò ad inserire è una semplice entry (ma potrebbe essere una checkbox, una tabella, ecc), file+headline “~/notes/desiderata.org “Listening” vuol dire che questa entry va inserita all’interno del file ~/notes/desiderata.org alla sezione Listening.
La seconda riga descrive la sintassi della entry che sarà inserita. Rimando alla lista completa delle variabili che si possono inserire, sappiate che in quel modo quando inserisco la entry, oltre al testo viene inserita anche il contenuto della regione attiva (%i), il contenuto della cliboard (%x). La variabile %? invece controlla dove è posizionato il cursore.
Può sembrare molto complicato ma vi assicuro che non lo è affatto.
Se io sto lavorando ad esempio su di un file e mi viene in mente “Voglio ascoltare questo gruppo”, premo C-c r w (dopo la pressione di C-c r mi si presenta un menu da cui scegliere se non ricordo i tasti), inserisco quello a cui pensavo, premo C-c e ricomincio a lavorare.
Se invece voglio aggiungere una cosa da fare al volo, entro oggi, premo C-c r d (corrispondente a daily todo) e automaticamente nel file giusto viene creata una checkbox in cui inserire il testo. Chiudo e salvo con C-c C-c.
Questo ovviamente funziona in qualsiasi momento Emacs sia aperto…
In ultimo, aggiungo la mia configurazione del file .emacs:
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
(setq org-log-done 'time)
(add-hook 'org-mode-hook 'turn-on-font-lock) ; not needed when global-font-lock-mode is on
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)
(setq org-agenda-files '("~/notes/personal.org" "~/notes/work.org"))
(setq org-default-notes-file "~/notes/personal.org")
;; I use C-M-r to start capture mode
(global-set-key (kbd "C-M-r") 'org-capture)
;; I use C-c r to start capture mode when using SSH from my Android phone
(global-set-key (kbd "C-c r") 'org-capture)
;; Capture templates
(setq org-capture-templates
(quote (("s" "sysadm" entry (file+headline "~/notes/work.org" "SYSADM")
"* TODO %?\n%U\n %i\n")
("t" "daily todo" checkitem (file+headline "~/notes/personal.org" "DAILY TODOS")
"+ [ ] %?\n%i \n")
("d" "da scaricare" entry (file+headline "~/notes/personal.org" "Scaricare/comprare")
"* TODO %?\n %i\n %x\n")
("w" "Watching" entry (file+headline "~/notes/desiderata.org" "Watching")
"* %?\n %i\n %x\n")
("r" "Reading" entry (file+headline "~/notes/desiderata.org" "Reading")
"* %?\n %i\n %x\n")
("w" "Listening" entry (file+headline "~/notes/desiderata.org" "Listening")
"* %?\n %i\n %x\n")
("e" "Learning" entry (file+headline "~/notes/desiderata.org" "Learning")
"* %?\n %i\n %x\n")
("p" "Projects" entry (file+headline "~/notes/desiderata.org" "Projects")
"* %?\n %i\n %x\n"))))
E davvero infine alcuni link: