Notxor tiene un blog

Defenestrando la vida


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:

  1. Un título: este campo marcado como #+title: es obligatorio.
  2. Unas etiquetas: marcadas como #+roam_tags:, son opcionales.
  3. Un enlace: marcado como #+roam_key:, es opcional. Luego lo podemos buscar mediante org-roam-find-ref.
  4. El contenido de la anotación. Aquí podemos escribir cualquier tipo de texto org-mode.
  5. 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:

Sorry, your browser does not support SVG.

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.

Captura de pantalla

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.


Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.