Notxor tiene un blog

Defenestrando la vida

Configuración de org-mode para utilizarlo como agenda (I)

2021-07-30

El configurar correctamente org-mode para utilizarlo como agenda es un procedimiento sencillo, pero que a algunos parece que se les atranca. Por lo tanto, me he planteado escribir esta entrada en el blog, además lo acompañará un vídeo que resume todo el proceso de una manera sencilla. Utilizo programación literaria para explicar todos los pasos según los voy haciendo.

El procedimiento del artículo es sencillo:

  1. Iniciar Emacs sin cargar la configuración con el comando
emacs -q
  1. Generar una configuración mínima para hacer más agradable la modificación de código.
  2. Después de cargar la configuración mínima, modificarla únicamente en los aspectos relacionados con la agenda.

Inicio de paquetes y configuración mínima de variables

Por defecto, al arrancar mediante emacs -q, no se carga ningún tipo de configuración y los valores son los que cargarían por defecto en una primera instalación.

(package-initialize)

(custom-set-variables
 '(Info-default-directory-list
   '("/usr/share/info/" "/usr/local/share/info/" "~/opt/share/info/"))
 '(custom-enabled-themes '(dracula))
 '(custom-safe-themes
   '("549ccbd11c125a4e671a1e8d3609063a91228e918ffb269e57bd2cd2c0a6f1c6" default))
 '(ivy-mode t)
 '(truncate-lines t)
 '(display-line-numbers-type 'visual)
 '(scroll-bar-mode nil)
 '(which-key-mode t))

(global-company-mode t)

La primera línea anterior le dice a Emacs que cargue la lista de paquetes que encuentre en el sistema. Es hacer un poco trampa porque ya tengo en mi máquina los paquetes necesarios instalados y no hablo sobre la instalación en ningún momento. Sin embargo, org-mode ya viene por defecto en Emacs.

También le digo a este Emacs pelado dónde puede encontrar los archivos info que utiliza para mostrar la documentación, por si más tarde fuera necesario consultarla. Cambio el tema de Emacs a uno oscuro y después cargo unas pocas herramientas que mejoran la comodidad al usar el editor:

  • ivy, un modo que hace la interacción con Emacs mucho más agradable, proporcionando listas de comandos, de ficheros, de... muchas cosas.
  • which-key, un modo que nos proporciona información sobre las cadenas de comandos de teclado disponibles.
  • company, nos proporciona el completado de sintaxis cuando estamos programando.

Configuración para la agenda

Primero se configura el formato para las fechas en la variable calendar-date-style, de entre tres estilos establecidos:

  • american con el formato mes/día/año.
  • european con el formato día/mes/año.
  • iso con el formato año/mes/día.

Después especificar qué día comienza la semana en la variable calendar-week-start-day. La función admite un número entre 0 y 6:

  • 0 - domingo
  • 1 - lunes
  • 2 - martes
  • 3 - miércoles
  • 4 - jueves
  • 5 - viernes
  • 6 - sábado

Por defecto, el valor se establece a 0, domingo, que es el día en el que comienza la semana en muchos países. En otros, como aquí, la semana comienza el lunes, por lo que ajusto el día de comienzo a 1.

(setq calendar-date-style 'iso)
(setq calendar-week-start-day 1)

Nombres de días y meses

Los nombres de los días y de los meses se establecen en dos variables cada uno, una con el formato abreviado y otra con el nombre completo.

  • calendar-day-header-array ... "Do", "Lu", etc.
  • calendar-day-name-array ... "domingo", "lunes", etc.
  • calendar-month-abbrev-array ... "Ene", "Feb", etc.
  • calendar-month-name-array ... "enero", "febrero", etc.
(setq calendar-day-header-array ["Do" "Lu" "Ma" "Mi" "Ju" "Vi" "Sá"])
(setq calendar-day-name-array ["domingo" "lunes" "martes" "miércoles" "jueves" "viernes" "sábado"])
(setq calendar-month-abbrev-array ["Ene" "Feb" "Mar" "Abr" "May" "Jun" "Jul" "Ago" "Sep" "Oct" "Nov" "Dic"])
(setq calendar-month-name-array ["enero" "febrero" "marzo" "abril" "mayo" "junio" "julio" "agosto" "septiembre" "octubre" "noviembre" "diciembre"])

Sólo quiero recordar dos cosas. Una es que estas variables esperan recibir un array y no una lista. Otra es que en castellano, los nombres de los meses y de los días no se escriben con mayúsculas, por eso, aunque sí las utilizo para las abreviaturas no las uso en los nombres completos.

Ficheros de datos

Necesitamos mínimo un fichero. Dos, si utilizamos el diario: uno será para la agenda y otro para el diario. El fichero de diario lo trataré más adelante, aunque es opcional.

Se pueden tener varios ficheros org donde guardar la información de los eventos. Podemos, por ejemplo, tener distintos ficheros para agrupar conceptos como trabajo, ocio, familia, etc. En mi caso utilizo dos, uno de los ficheros donde se guardan los eventos capturados a través del calendario de mi servidor Nextcloud y que se sincroniza con la agenda de Emacs a través del paquete org-caldav. Pero en el ejemplo, sólo utilizaré uno.

Los distintos ficheros se configuran en la variable org-agenda-files y espera una lista de ficheros con el path completo.

(setq org-agenda-files '("~/agenda/agenda.org"))

El fichero debe existir para que funcione la agenda. org-mode se quejará si encuentra en la lista algún fichero que no existe y propondrá eliminarlo de la lista, pues entiende que se ha borrado. No suele ser mala idea el tener varios ficheros, uno dedicado a cada una de nuestras actividades, por ejemplo. Uno para el trabajo, otro para el ocio, etc. Al visualizarse juntos no hay problema con que se solapen las actividades. O por ejemplo, si tenemos que gestionar la agenda de un grupo de trabajo, podemos tener separadas las tareas de cada miembro del grupo. Somos libres de adaptar la lógica de nuestros ficheros a la lógica de trabajo.

Otra forma de configurar varios ficheros separados es juntarlos todos en un directorio y configurar dicho directorio en la variable org-agenda-files, de esta manera, cuando genere la vista de la agenda consultará todos los archivos org que se encuentren en él.

Configuración del diario y eventos periódicos

El fichero del diario se configura en la variable diary-file. El diario se puede utilizar para recordatorio de fechas señaladas, cumpleaños, festivos, eventos periódicos. Hay que establecer esa variable y también org-agenda-diary-file.

También hay que configurar si queremos que nos muestre las entradas del diario en la vista de la agenda mediante la variable org-agenda-include-diary puesto a t.

(setq diary-file "~/agenda/diario.org")
(setq org-agenda-diary-file "~/agenda/diario.org")
(setq org-agenda-include-diary t)

Las entradas se pueden cargar mediante dos comandos principalmente:

  • Uno con org-anniversary con el formato:

    %%(org-anniversary año mes dia) Texto explicativo
    
  • Otro para eventos periódicos flotantes:

    %%(diary-float mes dia orden) Texto explicativo
    

En ambas sintaxis los parámetros de año, mes o día deben ser números. Es decir, nos encontraremos un error si completamos con 0, como me pasó a mí durante la realización del vídeo: Había preparado una entrada de diario para que se visualizara al cargar la agenda y resultó que no funcionó. Después de darle muchas vueltas, resultó, que acostumbrado a escribir las fechas completando con ceros1, al hacerlo la agenda no lo reconocía como fecha válida. Eso me hizo perder un poco de tiempo, porque repasaba la entrada y para mí estaba correcta... hasta que al crear una entrada de diario desde la vista de la agenda me encontré que la escribía en el fichero sin el cero.

Por otro lado, también se puede configurar la agenda para que ciertas tareas las convierta en periódicas añadiendo en la fecha de schedule o de death un sufijo con su periodicidad. Por ejemplo, si queremos que nos avise semanalmente de alguna tarea rutinaria, podemos añadir a la fecha, el sufijo 1w; si lo queremos quincenal añadiremos 2w; o también, por ejemplo, si lo queremos trimestral: 3m; o 1y para tareas anuales. Estas tareas, cuando se marcan como hechas lo que hace org-mode es añadir un línea con la fecha y hora de la realización de la tarea y modificar la fecha de schedule o death al próximo evento, generando un histórico.

Configuración de los elementos de entrada

Para la realización del vídeo se han configurado mínimamente los dispositivos de entrada, ─ratón y teclado─, con lo mínimo para hacer el trabajo más agradable. Por tanto, se carga el paquete org-mouse para tener acceso en modo gráfico a las funciones del ratón y también se estableces algunas combinaciones de teclas de uso común.

Configuración del ratón

;;; Configurar ratón para el modo gráfico
(require 'org-mouse)

Configuración de combinaciones de teclas

Combinaciones de teclas que suelo utilizar con frecuencia.

;;; Configuración de teclas
(global-set-key (kbd "C-;")   'iedit-mode)
(global-set-key (kbd "C-c a") 'org-agenda)
(global-set-key (kbd "C-c l") 'display-line-numbers-mode)
(global-set-key (kbd "C-c s") 'dired-sidebar-toggle-sidebar)
(global-set-key (kbd "C-c t") 'toggle-truncate-lines)
(global-set-key (kbd "C-c w") 'whitespace-mode)

Aunque últimamente utilizo la combinación C-i para el modo iedit, he configurado C-; porque es la tecla que configura el paquete por defecto. Las demás teclas no necesitan mucha más explicación, aunque en el vídeo la podréis encontrar.

Configuración de dired

El acceso directo de algunos modos al abrir los archivos correspondientes. En concreto se cargan los modos para que muestre iconos en el buffer de dired.

;;; Hooks
(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) ; muestra iconos en el árbol dired
(add-hook 'dired-mode-hook 'dired-git-mode)           ; identifica directorios git
(add-hook 'dired-mode-hook 'auto-revert-mode)         ; refresco de dired

Además, se establecen algunos parámetros en la configuración para que se muestren a mi gusto directorios y ficheros.

;; Ajustes de dired-sidebar
(setq dired-sidebar-theme 'nerd)
(setq dired-sidebar-use-term-integration t)
(setq dired-sidebar-use-custom-font t)

Configuración del paquete ivy

El paquete ivy es uno de los fundamentales para hacer mucho más amigable Emacs para el usuario.

;;; Configurar ivy
;; añadir ‘recentf-mode’ y bookmarks a ‘ivy-switch-buffer’.
(setq ivy-use-virtual-buffers t)
;; número de líneas de resultado mostradas
(setq ivy-height 15)
;; no contar candidatos
(setq ivy-count-format "")
;; no utilizar regexp por defecto
(setq ivy-initial-inputs-alist nil)

Ajustes de fuentes de texto.

Algunos themes de Emacs modifican el tamaño de las fuentes de las cabeceras de org-mode. Buscan mejorar el aspecto de cómo se mostrará el documento en pantalla, sin embargo cuando utilizo programación literaria, como ahora, desajusta la visualización de la lista de opciones que puede mostrar el paquete company y es mejor desactivar esos tamaños.

(custom-set-faces
 '(org-level-1 ((t (:inherit outline-1 :height 1.0))))
 '(org-level-2 ((t (:inherit outline-2 :height 1.0))))
 '(org-level-3 ((t (:inherit outline-3 :height 1.0))))
 '(org-level-4 ((t (:inherit outline-4 :height 1.0))))
 '(org-level-5 ((t (:inherit outline-5 :height 1.0))))
 '(org-level-6 ((t (:inherit outline-6 :height 1.0)))))

El vídeo y los ficheros de trabajo

Si preferís el enlace al sitio:

https://video.nogafam.es/w/u1GkvDRiBe4Ks4s8kQAVCe

Desde ahí también podéis descargarlo y verlo cuando queráis sin estar conectados.

Los ficheros utilizados son tres, está también el cuarto que es el fichero configuracion.el generado a partir del código que se encuentra en configuracion-articulo.org. Los podéis encontrar en:

Es muy recomendable, si no has configurado nunca la agenda y quieres aprender cómo funciona, que toquetees estos ficheros y que pruebes cosas nuevas simplemente para aprender. Sin miedo a estropear tu configuración, si tienes alguna, copiada de algún sitio y que funciona, pero no entiendes muy bien cómo. Recuerda, arranca Emacs con el parámetro -q y carga el fichero de configuración sin preocuparte de romper nada.

Conclusiones

En esta primera parte hablo principalmente de la configuración de agenda y diario, entendiendo que añadimos las tareas y las entradas al diario modificando directamente los ficheros que contienen los datos.

En una próxima entrega hablaré sobre la captura de datos para la agenda. En el vídeo se puede apreciar cómo se puede hacer dicha captura desde la vista de agenda para el diario. Sin embargo, la captura de datos para la agenda es bastante más compleja y merece un capítulo aparte.

Footnotes:

1

Con completar con ceros me refiero a que cuando escribo fechas tengo la costumbre de escribir 2021/01/01 en lugar de 2021/1/1, para preservar dos posiciones alfanuméricas para el mes y el día.

Categoría: emacs org-mode agenda

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.