Apuntes: org-mode en Emacs

Nota
Este artículo se actualizó por última vez el 2022-05-07, es posible que el contenido no esté actualizado.

Apuntes no terminados sobre Emacs y org-mode

Work in progress
Estos apuntes no están completos, (ni de lejos)

org-mode es un invento de Carsten Dominik. Mr. Carsten lo inventó como un método para implementar GTD, pero poco a poco lo fue refinando añdiendo Emacs Calc y org-babel. A partir de ahí no ha parado de mejorar.

Esquema básico con cabeceras

Lo primero que te encuentras en org-mode es un esquema basado en cabeceras:

  • Cada cabecera empieza con uno (o varios) caracteres *
  • Pulsando Tab en la linea de cabecera se colapsa o expande esa sección
  • Pulsando S-Tab en cualquier parte del documento se cambia el estado colapsado/expandido en todo el documento
  • Pulsando Alt (que llamamos Meta en Emacs) y las flechas derecha e izquierda en una linea de cabecera cambiamos el nivel de la cabecera
  • Pulsado M-Up o M-Down en una linea de cabecera la cambiamos de posición en el documento
  • La combinación C-c C-w en una cabecera nos permite cambiarla de rama (interactivo)

Listas de Tareas

Cualquier cabecera puede marcarse como TODO o DONE (son las opciones por defecto), basta con presionar S-right o S-left en la linea de cabecera para ir cambiando de estado. Alternativamente puedes usar C-c C-t para poner un estado interactivamente (más rápido)

Si necesitamos algo más sofisticado podemos añadir estados en la cabecera de nuestro fichero .org

Los estados a la izquierda del pipe son TODO, y a la derecha son DONE

1
#+SEQ_TODO: Next(n) TODO(t) Waiting(w) Someday(s) | DONE(d) CANCELLED(c)

Si cambias las lineas de configuración en la cabecera, puedes recargar el local setup con C-c C-c (en la cabecera)

Agendar tareas

Para agendar (schedule) una tarea usamos C-c C-s, en la linea de schedule podemos añadir una hora o un periódo:

1
2
SCHEDULED: <2020-10-15 Thu 16:00>
SCHEDULED: <2020-10-15 Thu 16:00-17:00>

En org-mode normalmente se considera que la fecha SCHEDULED es el momento en que se debe empezar con la tarea.

Si queremos definir la fecha en la que la tarea debe estar realizada usamos DEADLINE que se define de forma análoga a SCHEDULED con la combinación C-c C-d

En generál en org-mode las fechas entre ángulos son fechas activas y las fechas entre corchetes son informativas, una vista de tarea podría ser:

1
2
3
4
5
6
** TODO [2021-03-15 Mon] Probar Caddy                             :hometask:
SCHEDULED: <2021-03-20 Sat> DEADLINE: <2021-03-21 Sun>
  :PROPERTIES:
  :Effort: 2:00
  :Beat: Now
  :END:

Donde tenemos una fecha de captura de la tarea (informativa) y las fechas de SCHEDULED y DEADLINE (activas).

Vista de agenda

Nuestro fichero o ficheros .org pueden tener distintas tareas con fechas asignadas pero no estarán ordenados cronológicamente.

Para una visión cronológica disponemos de las Agenda Views.

Para acceder a las vistas de agenda usamos: C-c a y después seleccionamos la vista deseada. Recuerda si usamos un prefijo C-u n justo antes de C-c a limitaremos a n dias las vistas de agenda.

Dentro de la vista agenda, podemos activar el Follow mode con S-f para que la vista del fichero se mueva a la tarea señalada en la agenda. También podemos usar las teclas f y b para movernos adelante,atrás (p.ej. en la agenda semanal cambiaríamos a semana anterior o siguiente)

Por defecto el margen de aviso para tareas con DEADLINE es de 14 dias, pero se puede configurar en la variable org-deadline-warning-days

Agenda Advance

  • C-c a Agenda

  • Se puede limitar a n dias con prefijo: C-u n P.ej. para ver las task para hoy pulsamos C-u 1 C-c a

  • Si seleccionamos a entramos en la agenda, con el prefijo podemos limitar a n dias

  • Con t vamos a la lista de tareas podemos filtrar más siguiendo instrucciones

  • Con T vamos a la lista de tareas con una o varias palabras clave especiales (p.ej. TODO|NEXT)

  • Con m podemos seleccionar un TAG y más criterios. P. ej. phone+TODO="NEXT". Con la mayúscula M restringimos a tareas TODO

  • Con s podemos buscar una palabra en todas las tareas (buscará en cabecera y contenido de la tarea). Si usámos la mayúscula S restringimos a las tareas TODO

    Ejemplos

    • +mini +docker todas las tareas que contengan las dos palabras: mini y docker
    • {regexp} las regexp van entre llaves

Vistas de agenda “a medida”

1
2
3
4
5
6
7
(setq org-agenda-custom-commands
      '(("c" "Desk Work" tags-todo "computer" ;; (1) (2) (3) (4)
         ((org-agenda-files '("~/org/widgets.org" "~/org/clients.org")) ;; (5)
          (org-agenda-sorting-strategy '(priority-up effort-down))) ;; (5) cont.
         ("~/computer.html")) ;; (6)
        ;; ...other commands here
        ))

En la primera linea tenemos el atajo (1), el título de la búsqueda (2), el criterio de búsqueda, tags-todo (3) y la cadena que queremos buscar "computer"

En la segunda linea (5) podemos poner restricciones y/o condiciones a nuestra búsqueda, en este caso restringimos los ficheros a buscar y en que orden mostramos los resultados.

En la sexta linea especificamos que esta busqueda se exportaria al fichero ~/computer.html en el caso de que hiciésemos una exportación de la agenda.

Tareas repetitivas

Podemos hacer las tareas repetitivas añadiendo la especificación de repetición a la fecha schedule:

  • +1w Repetir en una semana (w, d, m, y)
  • ++1w Siguiente repetición en una semana, pero asegurate que sea en el futuro. Esto nos garantiza que la repetición se programa bien en el caso de que completemos la tarea con retraso
  • .+1w Una semana después de marcarla como realizada

Checklist

  • - [ ] como esta
  • M-S-enter genera una nueva entrada en la checklist
  • C-c C-c cambia el estado de la linea
  • Con [/] o [%] podemos ver el estado del avance de la lista de checklists

Tags

  • C-c C-q para añadir Tags
  • Pueden ser predefinidas #+TAGS: PHONE(p) COMPUTER(c) GARAGE(g)
  • Con Tab podemos teclear un tag no predefinido
  • En mi caso para borrar todos los tag puedo user C-q C-j enter
  • Las etiquetas (Tags) se heredan, aunque no las veas las etiquetas se heredan en las ramas

Drawers (o cajones)

Podemos definir un drawer con una sintáxis (:drawer_name:) muy parecida a la de una etiqueta (tag). Pero los drawers no van en la primera linea (como las etiquetas) y se terminan con un :END:

Los drawers son también plegables, así que podemos usarlos como un nivel más de plegado dentro de la etiqueta. Pero los más utilizados son los predefinidos :PROPERTIES: y LOGBOOK

En el cajón de :PROPERTIES: se guardan las propiedades que vayamos añadiendo a nuestra entrada en el fichero .org

En el cajón de :LOGBOOK: se guardan las notas de progreso o cambios de estado de nuestra entrada.

Log. Notas asociadas al :LOGBOOK:

  • C-c C-z Para escribir una nota asociada a una entrada, la cerramos con C-c C-c Podemos configurar si las notas se guardan en un drawer o no con las opciones
  • En la cabecera: #+STARTUP: logdrawer / nologdrawer
  • Añadiendo a una rama la Property: LOG_INTO_DRAWER

Registrando los cambios de estado

Cuando especificamos los estados en la cabecera podemos especificar que hacer al entrar y salir del estado.

1
#+SEQ_TODO: Next(n) TODO(t@/!) Waiting(w) Someday(s) | DONE(d) CANCELLED(c)

@ implica grabar un timestamp y una nota al entrar en el estado ! implica un timestamp al salir del estado #+STARTUP: logdone Graba timestamp al pasar de un estado TODO a un estado CLOSE

También hay opciones para grabar los reschedules org-log-reschedule

Archivado

Las tareas se pueden archivar internamente (sin quitarlas de su fichero .org original) o moviéndolas a un fichero externo.

El archivado interno supone pegar una etiqueta :ARCHIVE: con la combinación C-c C-x a. Una tarea archivada ya no aparecerá en las vistas de la agenda.

Para el archivado externo podemos configurar el fichero de destino de varias maneras:

  • Definiendo un fichero de archivo en la cabecera con, por ejemplo (valor por defecto), #+ARCHIVE: %s_archive::, donde %s es el nombre de nuestro fichero .org
  • Definiendo un fichero de archivo en una rama con:
1
2
3
  :PROPERTIES:
  :ARCHIVE: <archiveName>::* <headSection>
  :END:
  • Definiendo los objetivos de archivado a nivel global con la variable org-refile-targets que permite establecer una lista de ficheros objetivo. Esta sería una manera indirecta de archivar tareas. Ya que no es una operación de archivo propiamente dicha

Para las dos primeras opciones el atajo de teclado sería C-c$ para activar el archivado.

Para la última opción invocaríamos refile con el atajo C-c C-w

Fórmulas matemáticas

Si especificamos la opción

1
#+STARTUP entitiespretty

Se renderizarán las entidades LaTeX (probar a escribir por ejemplo: \alpha + \beta)

La opción C-c C-x C-l invoca a org-toggle-latex-preview

El paquete org-fragtog parece muy interesante para esto.

Revisar

chuleta de comandos

Esquema básico
Atajo Entorno Significado
Tab Cabecera Colapsa/Expande
S-Tab Cualquiera Colap/Exp. Global
M-right/M-left Cabecera Sección cambia de nivel
M-Up/M-Down Cabecera Sección cambia posición
C-c C-w Cabecera Sección cambia de rama
Lista de tareas
Atajo Entorno Significado
S-Right/S-Left Cabecera Ciclar estado ’todo'
C-c C-t Cabecera Cambiar estado ’todo'
C-s Cabecera Agendar tarea
C-d Cabecera Deadline
C-c a Cualquiera Vista de agenda (int.)
S-f Vista Agenda Act./Desactiva follow mode
f/b Vista Agenda Adelante atrás
q Vista Agenda Salir de agenda
checklist
Atajo Entorno Significado
C-S-enter Añade una linea
Misc
Atajo Entorno Significado
C-c C-c Varios “Ejecutar”" esa linea o sección