---
weight: 4
title: "Apuntes: org-mode en Emacs"
date: 2020-12-17T10:19:04+0100
draft: false
summary: "Aprendiendo a usar org-mode"
categories:
- notes
tags:
- emacs
- org-mode
---

Apuntes **no terminados** sobre Emacs y org-mode

<!--more-->

{{< admonition type=warning title="Work in progress" open=true >}}
Estos apuntes no están completos, (ni de lejos)
{{< /admonition >}}


_org-mode_ es un invento de [Carsten Dominik](https://staff.fnwi.uva.nl/c.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`

```org-mode
#+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:

```org-mode
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:

```org-mode
** 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"

```elisp
(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.

```org-mode
#+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:

```org-mode
  :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

```orgmode
#+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.

## Links

* [Guia](https://orgmode.org/orgguide.pdf)
* [Youtube List](https://www.youtube.com/watch?v=15w3I6MwCfs&list=PLVtKhBrRV_ZkPnBtt_TD1Cs9PJlU0IIdE&index=2)
* [Tutorials](https://orgmode.org/worg/org-tutorials/)
* [Mastering emacs](https://www.masteringemacs.org/)

### Revisar

* [org-math](https://github.com/dryman/org-math) como tomar apuntes de matemáticas en _org-mode_
* [Latex for the impatients](https://karthinks.com/software/latex-input-for-impatient-scholars/): como teclear LaTeX rápido.
* [org-clock-remainder](https://github.com/inickey/org-clock-reminder): un módulo para configurar avisos en `org-mode`
* [Use org-mode to create LaTeX documents](https://opensource.com/article/20/4/emacs-org-mode)
* [Una serie de artículos con configuraciones de Emacs](https://lucidmanager.org/productivity/more-productive-with-emacs/)
* [Ricing Emacs](https://lucidmanager.org/productivity/ricing-org-mode/)
* Fniessen /org-mode html themes/
    * [cheatsheet](https://github.com/fniessen/refcard-org-mode)
    * [Repo in github](https://github.com/fniessen/org-html-themes)
* Olmon /org-mode html themes collection/
    * [la página](https://olmon.gitlab.io/org-themes/)
    * el [repo](https://gitlab.com/OlMon/org-themes/) en gitlab

## 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 |
