Bad Daemons

org-agenda: Capturar y buscar notas

La agenda de org-mode es la herramienta que ha conseguido que mucha gente pase a usar emacs. Esta puede usarse de muchas formas, no solo como una agenda como tal. Yo la uso para intentar estar medio organizado en mi día a día, para hacer un seguimiento de los proyectos y programas que desarrollo y hasta sustituí wallabag. Esto último toca otro día, lo que veremos hoy es el funcionamiento básico de la captura de notas y los comandos de agenda personalizados mediante ejemplos.

Pero como siempre, hay que empezar por el principio. Hay tres paradigmas (generalizando) en el uso y organización de la agenda de org-mode. El primero se podria llamar el paradigma de la estructura jerarquizada. Este buscará la organización visual. Un archivo de ejemplo es el siguiente:

* Personal
** TODO Tarea de ejemplo
* Trabajo
** TODO No matar lusers
* Ordenadores
** Proyectos Personales
*** General
**** TODO Actualitzar README de programes
**** DONE Abrir links de emacs en navegador
     - State "DONE"       from "TODO"       [2016-10-16 dom 22:01]
     SCHEDULED: <2016-09-13 mar>
*** isso-gnusocial
**** TODO Cambiar codificación de titulos
*** gnusrss
**** TODO Hacerlo compatible con mastodon
    La idea es usar la api atom.
    Para probar en mastodon: mastodon.social
*** twitter2rss
**** WAITING Esperar feedback
** VPS
*** TODO Renova el domini daemons.it
    DEADLINE: <2016-09-16 vie>

A simple vista se puede ver la organización de las notas que se toman. Este paradigma se enfoca más en la búsqueda de TODO, fechas programadas y deadlines. Véamos ahora un ejemplo del paradigma de la estructura por etiquetas:

* TODO Tarea de ejemplo                                                                       :personal:
* TODO No matar lusers                                                                        :trabajo:
* TODO Actualitzar README de programes                                                        :proyectos:general:
* DONE Abrir links de emacs en navegador                                                      :proyectos:general:
     - State "DONE"       from "TODO"       [2016-10-16 dom 22:01]
     SCHEDULED: <2016-09-13 mar>
* TODO Cambiar codificación de titulos                                                        :proyectos:issoGnusocial:
* TODO Hacerlo compatible con mastodon                                                        :proyectos:gnusrss:
    La idea es usar la api atom.
    Para probar en mastodon: mastodon.social
* WAITING Esperar feedback                                                                    :twitter2rss:
* TODO Renova el domini daemons.it                                                            :vps:
    DEADLINE: <2016-09-16 vie>

En el ejemplo se ve claro lo que hay, pero si tienes más de 20 notas empieza a liarse. Este paradigma se enfoca más en la búsqueda por etiquetas o contextos. Ahora viene el tercero, que es el que uso yo, que es una mezcla de ambos. De este modo, puedo ver a simple vista si me interesa o puedo buscar con la agenda.

* Personal                                                         :personal:
** TODO Tarea de ejemplo
* Trabajo                                                           :treball:
** TODO No matar lusers
* Ordenadores
** Proyectos Personales                                           :projectes:
*** General                                                       :general:
**** TODO Actualitzar README de programes
**** DONE Abrir links de emacs en navegador
     - State "DONE"       from "TODO"       [2016-10-16 dom 22:01]
     SCHEDULED: <2016-09-13 mar>
*** isso-gnusocial                                          :issoGnusocial:
**** TODO Cambiar codificación de titulos
*** gnusrss                                                       :gnusrss:
**** TODO Hacerlo compatible con mastodon
    La idea es usar la api atom.
    Para probar en mastodon: mastodon.social
** VPS                                                                 :vps:
*** TODO Renova el domini daemons.it
    DEADLINE: <2016-09-16 vie>
, * Caldav

Se puede ver, además, que los tags son hereditarios, por lo que solo hace falta etiquetar un árbol y los que estén por debajo de este tendrán la misma etiqueta. Ahora vamos al código, la parte de la captura de notas:

(setq org-capture-templates
      '(("s" "Tasca Simple" entry (file+headline "~/Documentos/org/notas.org" "Notes")
         "** TODO %? \n:PROPERTIES:\n:CREATED: %u\n:END:\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n")
        ("b" "Idea per article" entry (file+headline "~/Documentos/blog/Articulos/articulos.org" "Ideas")
         "** TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n")
        ("p" "Personal" entry (file+headline "~/Documentos/org/index.org" "Personal")
         "* TODO %? \n:PROPERTIES:\n:CREATED: %u\n:END:\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n")
        ("t" "Treball" entry (file+headline "~/Documentos/org/index.org" "Treball")
         "* TODO %? \n:PROPERTIES:\n:CREATED: %u\n:END:\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n")
        ("w" "Marcadors" entry (file "~/Documentos/org/web.org")
         "* %x\n  %U\n  %c"
         :empty-lines 1)
        ("v" "Relacionat amb els VPS / chustaserver" entry (file+headline "~/Documentos/org/index.org" "VPS")
         "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n")
        ))

(setq org-capture-templates
      (append org-capture-templates
              '(("o" "Ordinadors")
                ("og" "General" entry (file+headline "~/Documentos/org/index.org" "General")
                 "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n")
                ("oi" "isso-gnusocial" entry (file+headline "~/Documentos/org/index.org" "isso-gnusocial")
                 "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n")
                ("or" "gnusrss" entry (file+headline "~/Documentos/org/index.org" "gnusrss")
                 "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n")
                ("oj" "jabbergram" entry (file+headline "~/Documentos/org/index.org" "jabbergram")
                 "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n")
                ("os" "SimpleUpload" entry (file+headline "~/Documentos/org/index.org" "SimpleUpload")
                 "* TODO %?\n:PROPERTIES:\n:CREATED: %u\n:END:\n")
                )))

En el primer trozo de código se define la variable org-capture-templates. Si se evalua el código y ejecuta org-capture (C-c c) se verá que han aparecido nuevas opciones.

2016-11-21-224806_1024x768_scrot.png

Cada una de ellas hace una cosa distinta, y por el código se puede entender bastante bien. Explicaré las palabras clave que se usan para que quede un poco más claro:

  • %?: Es dónde se colocará el cursor al capturar.
  • %u: La hora de la creación de la nota usando corchetes, por lo que no aparecerá en la agenda.
  • %(org-insert-time-stamp (org-read-date nil t \"+0d\"): La hora de la creación de la nota usando <>, por lo que aparecerá en la agenda.

A grandes rasgos, la Tasca Simple lo que hace es crear una nota en el archivo "~/Documentos/org/notas.org" debajo de la cabecera "Notas". Idea per article crea una nota en el archivo "~/Documentos/blog/Articulos/articulos.org" debajo de la cabecera "Ideas". Personal y Treball más de lo mismo con sus propias características.

La segunda parte del código se define a parte básicamente por que no supe hacerlo en la anterior definición. Lo que hace es crear un submenú. En la imagen de las capturas se puede ver que hay una sección que se llama "Ordinadors" y que no aparecen ahí todas las opciones que se ven en el código. Esto es debido a que están escondidas hasta que se presiona la letra clave, que en este caso es la o. Véase la imagen.

2016-11-21-230839_1024x768_scrot.png

Creo que no hace falta comentar mucho más. Para más información se puede ver esta página web o preguntar en los comentarios. El caso de los marcadores lo comentaré en otro articulo.

Ahora vamos con las búsquedas personalizadas en la agenda. Véamos el código:

(setq org-agenda-custom-commands
      '(("b" . "Blog")
        ("bi" "Idees per article" ((todo "TODO|IN-PROGRESS" ((org-agenda-files '("~/Documentos/blog/Articulos/articulos.org"))))))
        ("bp" "Articles llestos per a publicar" ((todo "READY|PROGRAMMED" ((org-agenda-files '("~/Documentos/blog/Articulos/articulos.org"))))))
        ("p" . "Projectes Personals")
        ("pp" "Projectes Personals" tags-todo "projectes")
        ("pg" "General" tags-todo "general")
        ("pi" "isso-gnusocial" tags-todo "issoGnusocial")
        ("pr" "gnusrss" tags-todo "gnusrss")
        ("pj" "jabbergram" tags-todo "jabbergram")
        ("v"  "Relacionat amb els VPS / chustaserver" tags-todo "vps")
        ("w" "Webs" tags "" ((org-agenda-files '("~/Documentos/org/web.org"))))
        )
      )

Cuando se evalua el código anterior, al ejecutar org-agenda (C-c a) ahora aparecerán nuevas opciones. Concretamente cuatro en el primer buffer:

  • b de blog
  • p de Proyectos personales
  • v de relacionados con los VPS
  • w de los marcadores web

org-agenda.png

Si presionamos la b, se mostrará un nuevo desplegable con la i de ideas para el blog y la p de articulos listos para públicar.

org-agenda2.PNG

Lo mismo cuando se presiona la letra p, pero con otras opciones. El de la letra w, como mencioné más arriba, lo dejamos para otro articulo.

Veamos ahora un ejemplo de la búsqueda de todas las notas etiquetadas como Ideas de cosas a escribir en el blog.

2016-11-21-231744_1024x768_scrot.png

Como se puede ver, es muy cómodo y tiene mucha potencia detrás. Cualquier duda, comenten.