Notxor tiene un blog

Defenestrando la vida

Una mirada a la toma de notas

Notxor
2023-12-07

Una tarea fundamental de mi trabajo es tomar notas. Puede parecer una tarea sencilla: coges un papel, un bolígrafo o una estilográfica y escribes lo que necesites recordar más adelante. Probando ese sistema todo termina en un montón de garabatos esparcidos por papeles que acaban perdiéndose o mezclándose de tal modo que puedes tener un dato anotado, saber que lo anotaste y nunca volver a encontrarlo. Frustración es lo que consigues a lo largo del tiempo. Para evitar esto pasé a cuadernos o agendas que no permitieran el ir perdiendo hojas. Pero nada impide que añadas múltiples papeles sueltos y posits con anotaciones entre las páginas del cuaderno (o de la agenda) o que arranques alguna. Luego me pasé a las tarjetas de notas y ocurrió más o menos lo mismo. Viendo la precariedad del sistema, lo intenté también con medios electrónicos, pero el problema se mantuvo, lo que conseguí cambiar es un montón de papeles por tener un montón de archivos de texto con anotaciones mezclándose como sus equivalentes analógicos dentro del cajón.

La parte fundamental que me faltaba era tomarme en serio la tarea de tomar notas. Algo que es fundamental para el desarrollo de mi profesión pero que nunca nadie me explicó, ni se le dio importancia alguna mientras estudiaba la carrera. Lo que nunca nadie me explicó es que tomar notas no consiste sólo en anotar ese dato que sabes que luego te hará falta, sino tener un sistema por el que buscar dicho dato después. Una nota olvidada en el rincón de un cajón tiene el mismo efecto que si nunca la hubieras tomado, o peor aún, pues sabes que lo anotaste y no puedes encontrarlo. Después, conocí el método Zettelkasten y me conciencié que un buen sistema de notas requiere dedicar un tiempo a ordenar y relacionar la información, para luego poder encontrarla. Podía volver al cajón con tarjetas de notas o continuar con un directorio lleno de archivos org con las más variadas anotaciones dentro: anotaciones de datos personales de clientes, de datos de sesiones, de consultas a libros, de temas para el blog, de curiosidades que me llaman la atención o de cosas que estoy estudiando. En fin, un sindiós al que había que disciplinar y meter en vereda y Zettelkasten exponía un método congruente.

Así me pasé algo de tiempo jugueteando con org-roam, procesando las notas que antes estaban en un directorio y que consultaba con deft. El cambio funcionó un tiempo hasta que org-roam cambió de versión y comenzó a tirar de una base de datos squlite externa. Perdió bastante flexibilidad. Con deft tenía mis notas en diferentes directorios, podía buscar en uno u otro, cambiar de directorio al cambiar de actividad, separando las notas profesionales de las del blog, por ejemplo, o tenerlas todas en un vistazo. Por eso, en lugar de migrar mis notas de org-roam v.1 a v.2, pasé las notas a zetteldeft y lo he estado utilizando durante algún tiempo. Hace poco me preguntaron por org-roam de nuevo y volví a probarlo, sólo para poder hablar con propiedad. No podía criticar el sistema sin probarlo de nuevo. Mis conclusiones las podéis leer en este mismo blog, en el artículo anterior. Pero para resumirlo diré, que cambiar el directorio de notas al vuelo, en org-roam significa la renovación de la base de datos. Algo que no sería muy pesado haciendo pruebas, pero cuando aumenté el número de notas —tan sólo a una cuarta parte de las que tengo— el tiempo de espera se incrementó bastante y decidí continuar con zetteldeft. Lo único que me aportaba org-roam era la vistosidad de org-roam-ui, que es cierto que es espectacular, pero que finalmente no resulta tampoco una herramientas demasiado flexible, porque depende de org-roam.

Buscando más información y conversando por la Internet sobre zetteldeft me comentaron que el propio autor de zetteldeft había descontinuado el mismo y se había pasado a denote. Pasé a probarlo para decidir con cuál me quedo. Mi conclusión final es que, efectivamente, me pareció un sistema mucho más sencillo de utilizar:

  1. No reinventa la rueda: utiliza otros paquetes que están hechos para hacer alguna de las tareas. Por ejemplo, para las búsquedas puedes utilizar deft, grep, consult, cualquiera, lo que te sea más cómodo o a lo que estés ya acostumbrado.
  2. Soporte nativo para el cambio de directorios con denote-silos-extras.el. Puedo seguir jugando con el cambio de directorios sin tener que esperar a que se rehaga una base de datos externa.
  3. La captura de notas es muy rápida y permite tener diferentes plantillas para hacerlo. También a través de org-capture.
  4. Permite la utilización de notas .org, .md, .txt y conviviendo en el mismo silo.

Ahora bien, si me preguntas si estoy contento al 100%, mi respuesta es: me falta poco. De hecho, llevo pensando un tiempo que debería hacer mi propio sistema de notas para ajustarlo a todo aquello que hecho en falta en los que he probado hasta ahora. Hace un tiempo ya hablé de TiddlyWiki y lo sigo utilizando, pero no como un sistema de notas, sino como un wiki que me permite tener páginas web como la de la radio sin mucho esfuerzo. También utilicé Zim en su día.

Pruebas y más pruebas

Ahora mismo tengo instalados tres sistemas de notas en Emacs, que están conviviendo de aquella manera y que mantendré hasta una charla que tengo prometida para un vídeo de los de hispa-emacs sobre la toma de notas. La convivencia de los tres paquetes se hace un poco pesada a estas alturas y estoy deseando eliminar el lastre en la configuración.

Mantendré deft, porque la visualización en tabla y la búsqueda rápida de contenido me parecen bastante buenas. He probado el paquete denote-menu, pero la funcionalidad del mismo es bastante pobre.

El ingenioso arte de mantener los tres sistemas va de la siguiente manera:

deft y zetteldeft

El código a continuación permite mantener las notas en directorios separados y cambiar entre ellos.

;; Tomar notas
(use-package deft
  :ensure t
  :bind ("<f5>" . deft)
  :commands (deft deft-refresh)
  :config (setq deft-directory "~/Nextcloud/Notes"
                deft-extensions '("org" "md" "txt")
                deft-use-filename-as-title t))

(use-package zetteldeft
  :ensure t
  :after deft
  :config (zetteldeft-set-classic-keybindings))

(setq zetteldeft-title-suffix "\n#+tags: #")
(setq deft-default-extension "org")
(setq zetteldeft-backlink-prefix "- Backlink: ")

;; Cambio de directorio Deft
(defun deft-cambio-dir (dir)
  "Cambiar de directorio Deft al `DIR' de forma interactiva."
  (interactive "DNuevo directorio Deft: ")

  (message (format "Se cambia def-directory a: %s" dir))
  (setq deft-directory (expand-file-name dir))
  (deft-refresh))

(defun deft-recursivo ()
  "Establece que `deft' busque también en subdirectorios."
  (interactive)
  (setq deft-recursive t)
  (deft-refresh))

(defun deft-no-recursivo ()
  "Hace que `deft' no busque en subdirectorios."
  (interactive)
  (setq deft-recursive nil)
  (deft-refresh))

(global-set-key (kbd "C-<f5>") #'deft-cambio-dir)
(global-set-key (kbd "M-<f5>") #'deft-recursivo)
(global-set-key (kbd "S-<f5>") #'deft-no-recursivo)

Como veis he asignado a la tecla <f5> el acceso a deft y también he programado un cambio de directorio, asignado a C-<f5> y la posibilidad de hacer que busque en subdirectorios con M-<f5> o que deje de hacerlo con S-<f5>. Por defecto, las notas las tengo sincronizadas a una nube Nextcloud particular y de esa manera son accesibles desde distintos dispositivos, como tablet y móvil.

Con org-roam sólo hice unas pocas pruebas, como ya he comentado. Trasladé algunas de las notas a este sistema, hice las pruebas y sigue instalado temporalmente.

denote

Configurar este paquete hubiera sido más sencillo si no hubiera tenido que modificar todo el key-map del paquete, para que no se pegara con el org-roam ya instalado cambié todas las teclas a la combinación base C-c z... aunque para acceder a las notas, me gustaría más C-c n (ahora asignado a org-roam).

;;; instalación de denote

(use-package denote
  :defer t
  :config
  (setq denote-directory (expand-file-name "~/denotas/")
        denote-known-keywords '("emacs" "cie-11" "blog")
        denote-infer-keywords t
        denote-sort-keywords t
        denote-prompts '(title keywords)
        denote-date-prompt-use-org-read-date t
        denote-backlinks-show-context t))

(add-hook 'find-file-hook #'denote-link-buttonize-buffer)

;;(require 'denote-journal-extras.el)
(setq denote-journal-extras-directory "~/denotas/diario")
(setq denote-journal-extras-title-format 'day-date-month-year)

;; Keybindings para denote
(let ((map global-map))
  (define-key map (kbd "C-c z j") #'denote-journal-extras-new-or-existing-entry) ; entrada a diario
  (define-key map (kbd "C-c z n") #'denote)
  (define-key map (kbd "C-c z N") #'denote-type)
  (define-key map (kbd "C-c z o") #'denote-open-or-create)
  (define-key map (kbd "C-c z d") #'denote-date)
  (define-key map (kbd "C-c z z") #'denote-signature) ; "zettelkasten" mnemonic
  (define-key map (kbd "C-c z s") #'denote-subdirectory)
  (define-key map (kbd "C-c z t") #'denote-template)
  ;; If you intend to use Denote with a variety of file types, it is
  ;; easier to bind the link-related commands to the `global-map', as
  ;; shown here.  Otherwise follow the same pattern for `org-mode-map',
  ;; `markdown-mode-map', and/or `text-mode-map'.
  (define-key map (kbd "C-c z i") #'denote-link) ; "insert" mnemonic
  (define-key map (kbd "C-c z l") #'denote-link-or-create)
  (define-key map (kbd "C-c z I") #'denote-add-links)
  (define-key map (kbd "C-c z b") #'denote-backlinks)
  (define-key map (kbd "C-c z f f") #'denote-find-link)
  (define-key map (kbd "C-c z f b") #'denote-find-backlink)
  ;; Note that `denote-rename-file' can work from any context, not just
  ;; Dired bufffers.  That is why we bind it here to the `global-map'.
  (define-key map (kbd "C-c z r") #'denote-rename-file)
  (define-key map (kbd "C-c z R") #'denote-rename-file-using-front-matter))

;; Key bindings specifically for Dired.
(let ((map dired-mode-map))
  (define-key map (kbd "C-c C-d C-i") #'denote-link-dired-marked-notes)
  (define-key map (kbd "C-c C-d C-r") #'denote-dired-rename-marked-files)
  (define-key map (kbd "C-c C-d C-R") #'denote-dired-rename-marked-files-using-front-matter))

He añadido también el paquete denote-menu, que muestra las notas en forma de tabla, sin embargo, no proporciona filtros y la ordenación se restringe a la fecha, tanto ascendente como descendente.

(use-package denote-menu
  :defer t)

(global-set-key (kbd "C-c z m") #'denote-menu-list-notes)

En este sentido, me resulta más práctico acceder a deft y cambiar el directorio al correspondiente a denote.

¿Qué necesito en mi toma de notas?

Debo reconocer que org-mode me ha malacostumbrado, con él puedes hacer de todo y algunas herramientas se me hacen, a estas alturas imprescindibles. Tanto, que el proyecto de crear mi propio sistema de notas se percibe tan complejo como el propio org-mode y por tanto, tan desafiante y lleno de aprendizajes que me estoy planteando seriamente hacerlo.

De momento se podría decir que con estos sistemas tengo la mayoría de mis necesidades cubiertas. Sin embargo, para algunas cosas he de tirar de herramientas externas al propio Emacs y org-mode... como decía Extremoduro: salir, entrar, el royo de siempre.

Lo que necesito, son unas pocas cosas:

  1. Gestión de calendario. Algo que para concertar citas es fundamental, y una vez me he acostumbrado a la agenda de org-mode y a cambiar de vista con una tecla, me resultan innecesariamente complejos otros sistemas.
  2. Gestión de tareas periódicas. Como autónomo, la presentación de IVA e impuestos trimestrales u otras tareas periódicas, como el programa de radio, el repaso semanal a la contabilidad, etc. Aparecen en mi agenda de forma automática y además las puedo marcar cuándo las hago y llevar un registro de cuándo hice qué cosa.
  3. Control de tiempos. Algunas de las tareas que realizo las cobro por horas, por lo tanto, el cronometrar cuánto tiempo invierto en ello me facilita luego la facturación. Esto es algo que ya apareció en este blog y no hace falta repetirlo. Lo hace org-mode de una manera sencilla.
  4. Notas cifradas. En mi trabajo la confidencialidad es una de las necesidades básicas del día a día. Poder tener notas cifradas sobre mis clientes y sus problemas, es básico para mí. Basta con terminar el nombre del archivo de la nota con .gpg para que se cifre automágicamente.
  5. No sólo texto. Las anotaciones, efectivamente, suelen ser de texto, sin embargo, algunas veces necesito adjuntar algún gráfico, como los perfiles de tests y otros adjuntos, como archivos pdf, por poner un ejemplo. Emacs además proporciona las suficientes herramientas para visualizar casi todos los tipos de adjuntos.
  6. Separación de notas. Cuando te dedicas a una sola cosa, parece buena idea tener todas las notas en el mismo sitio. Sin embargo, me dedico a varias actividades independientes y por tanto necesito que no se me mezclen las anotaciones. Especialmente las que se refieren a facturación, pues unas llevan IVA y otras —las clínicas y las educativas— están exentas de ese impuesto. Además, las notas sobre las sesiones con clientes están en un disco duro externo cifrado y no se deben mezclar con otro tipo de notas.
  7. Accesible desde distintos dispositivos. El problema viene, normalmente, de acceder con otros sistemas operativos, como por ejemplo, Android/®. Cuando salgo por ahí, no suelo llevar el ordenador más que contadas veces, como cuando voy a hacer el programa de radio, y es más cómodo trasladarme con una /Tablet barata que no me supondrá demasiada pérdida si se estropea o le pasa algo.

De todos estos puntos —seguro que ahora mismo no caigo en algún requisito más—, el más complejo es el 7. El resto (y mucho más) lo hace org-mode por nosotros sin despeinarse. El asunto de tener varios dispositivos con las notas sincronizadas es lo complicado y he utilizado varias aplicaciones y métodos para hacerlo, como aplicaciones de sincronización, nube. En la actualidad estoy optando por tener un repositorio, al fin y al cabo, las notas en su mayoría son texto plano. Además, sigo teniendo mi nube prsonal, en mi sitio web, mediante NextCloud y me permite compartir datos, como el repositorio, porque es un fichero fossil.

Si te preguntas por qué utilizo fossil y no git la respuesta tiene varias vertientes. La primera es que un repositorio fossil es monolítico —un fichero sqlite con todo dentro— y eso nos da alguna ventaja al compartirlo por NextCloud. O dicho de otro modo: uno de los problemas que me encontré cuando lo intenté con git es que los cambios de un repositorio git se almacenan en archivos sueltos dentro de un directorio oculto del sistema. Además NextCloud se lleva mal con los archivos y directorios ocultos y no siempre sincroniza correctamente, sin contar con las ocasiones en las que hay colisión entre las versiones de los distintos dispositivos. Alguna vez me encontré el repositorio totalmente inservible por efecto de una mala sincronización, pues cuando hay conflicto en NextCloud suele añadir archivos duplicados para no borrar nada. Si no estaba atento a los errores de sincronización y abría git, la aplicación se encontraba con que el repositorio tenía elementos extraños que no sabía cómo manejar.

Por otro lado, aunque con fossil también hay conflictos, pero, el resultado es mucho más manejable. Si ha habido algún choque de versiones se mantiene el archivo anterior y añade el elemento extraño. El efecto resultante es que el repositorio no se ha actualizado, no hay error ni se corrompe el log. Simplemente, vas a NextCloud solucionas el error y actualizas de nuevo con fossil update.

Planes futuros

Lo dije antes: llevo tiempo queriendo hacer una aplicación sencilla que cumpla con todas mis necesidades en el ámbito de la toma de notas. ¿Para qué? Pues para aprender. A eso se le juntan las ganas de aprender PicoLisp, un lenguaje minimalista de la familia de los LISP. Aunque no hay necesidad a estas alturas, porque tengo montado un sistema de mínimo esfuerzo juntando distintas piezas de terceros: Emacs, org-mode, denote, deft, NextCloud, Termux (para Android®) y fossil.

¿Por qué PicoLisp? A parte de que es un lenguaje similar a LISP o Scheme, tiene unas características minimalistas de las que siempre me resultan interesantes: integra, en una máquina virtual muy reducida, una base de datos y soporte para GUI. Además, para Android® existe una aplicación llamada PilBox que ejecuta scripts de PicoLisp directamente en ese sistema operativo. Por otro lado, también puedes usarlo desde Termux, porque es uno de los paquetes que puedes instalar en esa maravillosa «minidistro» integrada en Android®.

El objetivo, como he dicho antes, no es crear el más maravilloso sistema de notas, sino aprender. Necesitaré bajar a definir qué es una anotación, de qué partes se compone, cuáles son sus características y comprender así un poco mejor algunos algoritmos básicos y manejar listas, árboles, propiedades y, por supuesto, sus enlaces y valores.

Tardaría menos haciendo un pequeño paquete de Emacs, que subiéndose a hombros de gigantes, consiguiera realizar aquello (poco) que echo a faltar en el sistema que tengo montado ahora, pero con elisp ya me manejo y no aprendería demasiado.

Categoría: emacs org-mode org-roam denote Zettelkasten

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 esta cuenta de Mastodon, también en esta otra cuenta de Mastodon y en Diaspora con el nick de Notxor.

Si usas habitualmente XMPP (si no, te recomiendo que lo hagas), puedes encontrar también un pequeño grupo en el siguiente enlace: notxor-tiene-un-blog@salas.suchat.org

Disculpen las molestias.