Configuración de org-mode para utilizarlo como agenda (I)
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:
- Iniciar Emacs sin cargar la configuración con el comando
emacs -q
- Generar una configuración mínima para hacer más agradable la modificación de código.
- 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 formatomes/día/año
.european
con el formatodía/mes/año
.iso
con el formatoañ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:
- Fichero de configuración (programación literaria)
- Fichero agenda.org
- Fichero diario.org
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:
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.
Comentarios