Tomar notas con org-roam
Si no conocéis org-roam
no os preocupéis, vamos a verlo en este
artículo. Hace poco que lo descubrí, gracias a Patricio (¿Maxxcan?,
soy muy malo para los nombres y si me los cambiáis más ;-). En todo
caso, por alguna desconocida razón que no llego a comprender, es uno
de los lectores de mi blog y participa en el grupo de Telegram que
creé para hacer comentarios. Creo que fue el día 9 (julio de 2020),
cuando por la tarde, así como sin querer la cosa, habló del paquete de
Emacs org-roam
. Enlazó el paquete y tuvimos una conversación en el
grupo sobre tomar notas y los distintos métodos de hacerlo.
Todos necesitamos tomar notas y yo hasta ahora lo había hecho con
org-mode
a pelo. Ya he contado que tengo activado en el init.el
un
registro para abrirlo con mi bloc de notas:
(set-register ?a '(file . "~/agenda/bloc-notas.org"))
Eso me permite abrir el bloc con C-x r j a
y está siempre a mano
para anotar lo que necesite. Sin embargo, el método de las anotaciones
es básicamente jerárquico: lo tengo organizado por cabeceras y las
anotaciones van en otras cabeceras, divididas en temas y párrafos, que
aunque estén relacionados pueden estar perdidos en la jerarquía de los
títulos.
org-roam
presenta una forma de tomar notas con org-mode
de manera
no jerárquica, sino relacional. Quiere decir que las notas son todas
de la misma importancia y lo realmente interesante es la relación
entre las ideas anotadas, no tienes que pensar en qué título vas a
meterla, simplemente anotas la idea, le pones etiquetas y la enlazas
con otras notas relacionadas. El sistema te proporciona un método para
seguir esos enlaces en ambas direcciones: de nota enlazante a nota
enlazada y al revés, de nota enlazada a nota enlazante. ¿Qué método
de anotación es ese? Zettelkasten.
Zettelkasten
... con perdón! Ese es el método que viene a implementarse con el
paquete org-roam
. Una traducción muy libre del nombrecito es «cajón
de fichas» y básicamente es un método analógico de tarjetas guardadas
en un cajón, o en una caja de zapatos, según los recursos. Mejor de lo
que yo lo pueda explicar, lo explican en este artículo enlazado.
Resumiendo, el método consiste en tener las notas distribuidas en fichas. Cada ficha representa una idea expresada de forma breve, está numerada o identificada con un identificador único y se relaciona con otras fichas por su correspondiente identificador único y se pueden agrupar por «etiquetas». En algunos casos, la información es larga y proviene de alguna otra fuente, por lo que en la ficha se guarda la referencia y no hace falta copiar todo.
Como se puede ver es una forma de anotar donde cada anotación puede
moverse dentro del cajón en el orden que queramos. Son papeles
independientes y los podemos ordenar a nuestro gusto. ¿Qué aporta
org-roam
a este sencillo método? Pues la facilidad de hacerlo
gracias a la magia de los enlaces, las etiquetas, las claves y todas
esos pichorros tan fáciles de hacer en org-mode
. Para org-roam
cada ficha es un fichero .org
que contiene las siguientes cosas:
- Un título: este campo marcado como
#+title:
es obligatorio. - Unas etiquetas: marcadas como
#+roam_tags:
, son opcionales. - Un enlace: marcado como
#+roam_key:
, es opcional. Luego lo podemos buscar medianteorg-roam-find-ref
. - El contenido de la anotación. Aquí podemos escribir cualquier tipo
de texto
org-mode
. - Una serie de enlaces a otras fichas relacionadas. A mí me gusta agruparlos al final, pero nada impide que metas los enlaces entremezclados con el contenido de la anotación.
Por ejemplo, para escribir este artículo he utilizado este sistema de
notas y una de las pijadas que me han gustado es que el propio
org-roam
puede mostrar cómo se relacionan mis anotaciones mediante
un gráfico. Muestro el gráfico de las notas tomadas para escribir el
presente artículo y luego entraremos en detalles de las dependencias
necesarias para que lo haga:
Figura 1: Gráfico de relaciones entre anotaciones
Paquete org-roam
, instalación, problemas y configuración
Instalación
La instalación es sencilla, como cualquier paquete en Emacs; está en Melpa y si tenéis enlazado ese repositorio, basta con:
M-x package-install <RET> org-roam <RET>
Normalmente el tema de la instalación de paquetes en Emacs es algo
que me salto, por lo sencillo que es. Sin embargo, en este caso me
encontré con algunas dependencias problemáticas que no se me
instalaron correctamente y tuve que instalar a mano emacs-sqlite3
.
El funcionamiento de org-roam
depende también de algunas
herramientas externas, como el mencionado sqlite3
y, para generar
los gráficos como el anterior, de graphviz
. No he visto que tenga
más dependencias externas. El resto, como org
, son paquetes de
Emacs y se instalaron correctamente ─si no lo estaban ya─ durante la
instalación.
Problemas
Superados los problemas de la instalación, que no me llevó más que unos minutos me encontré otros problemas más serios y que en un principio casi estuvieron a punto de que abandonara la utilización del paquete. Persistí, porque en el grupo de Telegram me comprometí a probar el «chismático» y a escribir el presente artículo.
El mayor problema se me presentó cuando editaba notas. Al crearlas no
había problema pero al modificarlas podía ocurrir, y lo más frustrante
era que unas veces lo hacía y otras no, que desaparecieran del
directorio. Al guardar los cambios aparecía un mensaje de buffer de
sólo lectura. Además, como tengo configurado que los ficheros
temporales me los guarde en /tmp
resulta que el fichero bloqueado
lo guardaba allí y desaparecía del directorio donde debía estar. Tardé
un tiempo en darme cuenta de qué estaba pasando y me desesperó el
tema. En esos momentos hubiera desechado el org-roam
, pero de
casualidad, encontré que yendo al final de la nota añadiendo una línea
y volviéndola a borrar ─lo que sería un touch nota
, por lo directo─,
la volvía a guardar correctamente. Aún así, un engorro.
Sin embargo, éste, que era el mayor problema, se solucionó con la actualización del día 11. Justo dos días después de haberme propuesto a hacer pruebas y estar a punto de tirarlo por el sumidero del olvido, resulta, que hay una actualización (2020-07-11) que solucionó el problema y no me he vuelto a encontrar bloqueada una nota en un buffer de sólo lectura que me haya forzado a los malabares de guardar que había descubierto.
Otro problema que solucionó esa actualización era el tiempo de carga.
Las primeras pruebas eran desesperantes y me hicieron desistir de
configurar el paquete directamente en el init.el
, tardaba en cargar
el org-roam
más de medio minuto y según el volumen de notas, hasta
el minuto entero. Vale que no tengo la máquina más rápida del mundo
─todo lo contrario─, pero Emacs me carga, con todo lo que necesito,
en apenas unos segundos: más me tardan en cargar otros IDEs.
Por eso, saqué la configuración del paquete del inicio de Emacs. La velocidad de carga, que fue el principal motivo para ello, lo arreglaron también con la última actualización, pero encontré otras ventajas a tener la configuración fuera y por eso lo mantengo así. En seguida comento cómo tengo la configuración y por qué.
Por último, otro problema que me encontré es que el buffer de
org-roam
no siempre mostraba la información adecuada.
Figura 2: Captura de pantalla de org-roam
funcionando
Como se puede apreciar en la pantalla, el buffer de org-roam
a la
derecha, debe mostrar aquellas notas que enlazan a la que tienes
abierta... pues bien, a veces no funciona. No funciona a la primera,
quiero decir. He descubierto, que cuando no actualiza bien, cierras el
modo con org-road-mode
y lo vuelves a abrir con el mismo comando y
todo parece funcionar de nuevo. Sospecho que al cargar, tiene que
rehacer el índice de la base de datos sqlite3
y parece que algo no
termina de ir bien cuando lo cargo como (org-roam-mode t)
.
Configuración
Como dije antes, me hice la configuración del paquete aparte del
init.el
. Al final tengo, en la actualidad, tres ficheros de
configuración en tres directorios distintos, porque me permite separar
las anotaciones de distintos proyectos sin que se mezclen. Cada
proyecto tiene su directorio de notas y en cada uno de ellos hay un
fichero config.el
con un contenido similar a:
;; Ajustes para org-roam (setq org-roam-directory "directorio/org-roam") (setq org-roam-db-location "directorio/org-roam/org-roam.db") (setq org-roam-graph-viewer nil) (setq org-roam-capture-function 'org-roam-capture) (setq org-roam-completion-system 'ivy) ;; Activar el modo (setq org-roam-mode t) ;; Teclas para el modo (global-set-key (kbd "C-c r b") 'org-roam) (global-set-key (kbd "C-c r c") 'org-roam-capture) (global-set-key (kbd "C-c r d") 'org-roam-doctor) (global-set-key (kbd "C-c r f") 'org-roam-find-file) (global-set-key (kbd "C-c r g") 'org-roam-graph) (global-set-key (kbd "C-c r i") 'org-roam-insert) (global-set-key (kbd "C-c r m") 'org-roam-mode) (global-set-key (kbd "C-c r r") 'org-roam-find-ref) (global-set-key (kbd "C-c r t") 'org-roam-buffer-toggle-display) ;; Por si los fallos (defun buffer-backlinks () (interactive) (counsel-ag (buffer-name) org-roam-directory))
Básicamente lo que se modifica en el fichero es el directorio al que
apunta. Todo lo demás permanece igual. Leyendo el código no hay mucho
más que explicar. En el primer grupo se establecen algunas variables
como el org-roam-directory
, la base de datos en
org-roam-db-location
, el visor de gráficos en
org-roam-graph-viewer
─por defecto abre firefox y al ajustarlo al
valor nil
lo hace en un buffer svg interno de Emacs/─, la función
para realizar la /captura de notas y el sistema de completado que
utilizas, en mi caso ivy
.
Sobre la captura de notas he de decir que he intentado crear un par de
plantillas diferentes siguiendo la documentación que viene con el
paquete e incluso copiando la que viene por defecto en el propio
código de org-roam
y me ha sido imposible ajustar nada. He intentado
hacerlo tanto para capturar con org-capture
como para
org-roam-capture
y en ninguna de las dos he tenido éxito. Cuando he
metido las definiciones propias, el sistema dejaba de capturar notas.
No sé si es porque me falta algo en la configuración o por algún bug
que no logro encontrar. El caso es que, de momento, me tengo que
apañar con la plantilla por defecto, que se me hace un poco escasa.
Luego, en el código, se activa el modo org-roam-mode
y se añaden
algunas teclas para facilitar el trabajo.
Por último, he adaptado una función que Isidoro, otro lector del
blog, puso en el grupo de Telegram. Cuando no carga bien el modo y
no aparecen las notas que enlazan la que estás modificando, a veces me
viene mejor utilizar la función buffer-backlinks
que andar cerrando
el modo y volviéndolo a abrir. O dicho de otra manera, si estoy
modificando una sola nota por algo y no voy a trabajar sobre el resto
de las anotaciones, me basta con llamar a esa función. Si el trabajo
es más de «documentación» y estoy haciendo anotaciones, enlazando y
demás, merece la pena el recargar el modo para que funcione como
debe. Como podéis ver, sólo utiliza counsel-ag
para hacer una
búsqueda del nombre del buffer que estás editando en el directorio
de notas que está definido. Eso muestra una lista de archivos que
enlazan al buffer abierto y puedes seleccionar y abrir el que
necesites.
Con todo esto, cuando quiero tomar notas para alguno de los proyectos,
cargo el fichero config.el
en le directorio correspondiente y ya lo
puedo utilizar con normalidad. Si cambio de proyecto, sólo tengo que
cargar su correspondiente configuración y todo lo demás permanece
igual. Quizá no sea lo más óptimo, pero funciona.
Conclusiones
No sé aún si este método ha llegado para quedarse, como digo lo vengo
utilizando desde hace una semana y seguramente aún no he visto todos
sus pros y contras como para asegurar que voy a cambiar de método.
De momento, puedo asegurar que me gusta cómo funciona la relación
entre las notas, los temas, las etiquetas: los enlaces te llevan a
navegar las anotaciones de una manera distinta cada vez. ¿Hay alguna
nota relacionada con la idea que estás anotando? C-c r i
y la
seleccionas para que incruste el enlace: automáticamente utiliza el
título de la nota y forma el enlace fácilmente a pesar de que se
guardan en fichero de nombres rarunos (/timestamp/+nombre de
fichero, que no tiene por qué coincidir con el título de la nota).
Todo muy a mano y muy sencillo de mantener.
Permite buscar rápidamente referencias o enlaces que hayas anotado, en
mi configuración con la combinación de teclas C-c r f
se muestra la
lista de todas las notas que contienen una referencia #+roam_key
, a
poco que hayas puesto un título suficientemente claro, encuentras el
enlace que buscas de manera inmediata.
Además, el tener la configuración como la tengo, de manera que me permita separar la información por proyectos o temas me está resultando muy útil. Supongo que una de las grandes ventajas de este método es la capacidad de gestionar muchas ideas en un sólo sistema, sin embargo en mi caso, con proyectos que van desde el abuso infantil y otros temas que trabajo como psicólogo, pasando por cosas de programación o de Emacs, y por los artículos de este blog. Son asuntos tan dispares que no consigo nada mezclándolos, al contrario: se me pierde la información entre demasiada otra no pertinente... y esto sólo con una semana de trabajo normal, no quiero pensar lo que puede acumular la anotación de años de uso.
Pues eso es todo. Os animo a que lo probéis y así podáis determinar si el método se adecúa a vuestra forma de trabajar. Ya digo que, a priori parece un método interesante para mejorar las anotaciones.