Jul 06 2010

Org-mode: propiedades y columnas

Tag: basicoverdrive @ 3:49 am

En este articulo nos adentraremos un poco mas en org-mode, basicamente en que se pueden aplicar propiedades a distintas areas, que luego veremos que utilidad tiene. Para entender este post es necesario entender como trabajar con tablas en org-mode y como crear listas en org-mode (relacionadas o no con las tareas o TODO).

Es posible asignar propiedades a columnas o elementos de una lista, estas propiedades tendran un valor (por eso son pares) por ejemplo:

* Coleccion de CD
** Clasica
*** Variacion Goldberg
:PROPERTIES:
:Titulo: Variacion Goldberg
:Compositor: J.S. Bach
:Artista: Glen Gould
:Publicante: Deutsche Grammophon
:NDisks: 1
:END:

Se puede definir una lista de posibles valores para una propiedad en particular, para ello se le debe anadir el sufijo _ALL al nombre de la propiedad. Esto tendra una consecuencia especial a nivel de herencia, que si se marca una entrada, se aplicara para el arbol entero. Ademas definiendo una lista de posibles valores permitira evitar errores a la hora de escribir, por ejemplo:

* Coleccion de CD
:PROPERTIES:
:NDisks_ALL: 1 2 3 4
:Publisher_ALL: «Deutsche Grammophon» Philips EMI
:END:

Para definir posibles valores para propiedades de forma global podemos hacerlo de la siguiente manera (o mediante la variable global org-global-properties):

#+PROPERTY: NDisks_ALL 1 2 3 4

Los siguientes keybindings son usados para trabajar con propiedades:

  • M-TAB : Pulsado despues de : inicial en una linea, autocompleta claves.
  • C-c C-x p : Asigna un valor a una propiedad. Si fuese necesario la propiedad drawer sera creada.
  • M-x org-insert-property-drawer : Inserta una propiedad drawer en la entrada actual.
  • C-c C-c : Ejecuta comandos de la propiedad
  • C-c C-c s : Da un valor para la propiedad actual. Ambos, tanto la propiedad como el valor pueden ser autocompletados.
  • S-<– : Cambia la propiedad al valor anterior.
  • S—> : Cambia la propiedad al siguiente valor.
  • C-c C-c d : Elimina una propiedad de la entrada actual.
  • C-c C-c D : Elimina de forma global una propiedad de todas las entradas del fichero actual.
  • C-c C-c c : Computa la propiedad actual.

Propiedades especiales

Las propiedades especiales permiten acceder de forma alternativa a estas funcionalidades, por ejemplo:

TODO : Tarea TODO de la entrada.
TAGS : TAGS definidos directamente en una linea de cabecera.
ALLTAGS : Todos los TAGS, incluidos los heredados.
CATEGORY : La categoria de la entrada.
PRIORITY : La prioridad de la entrada.
DEADLINE : El limite de tiempo.
SCHEDULED : El tiempo o timestamp de esta entrada.
CLOSED : Cuando fue realmente cerrada esta entrada.
TIMESTAMP : La primera fecha de una entrada.
TIMESTAMP_IA : La primera fecha de inactividad de una entrada.
CLOCKSUM : La suma de los intervalos de tiempo de un subarbol. org-clock-sum debe ser lanzado la primera vez para computar dichos valores.
ITEM : El contenido de una entrada.

Busqueda de propiedades

Al crear estos arboles y listas especiales con una seleccion basada en propiedades podemos usar los siguientes keystrokes:

  • C-c \ ó C-c / m : Crea un arbol donde guardar todas las entradas que coincidan. Con el prefijo C-u ignora las lineas de cabecera que no son TODO.
  • C-c a m : Crea una lista global de propiedades/tags que coinciden con los ficheros de la agenda.
  • C-c a M : Crea una lista global de tags que coinciden con los ficheros de la agenda, pero fuerza solo a entradas TODO y todos sus subelementos (ver variable org-tags-match-list-sublevels).
  • C-c / p : Crea un arbol basado en el valor de la propiedad. Primero muestra el nombre de la propiedad y luego su valor.

Herencia de propiedades

Como bien dijimos anteriormente, si un padre tiene una propiedad determinada, su hijo la puede heredar. Por defecto esto esta deshabilitado, debido a que puede retardar bastante las busquedas, asi que si se quiere habilitar tendremos que configurar la variable org-use-property-inheritance. Ademas org tiene algunas propiedades hardcodeadas por defecto a nivel hereditario, que son:

COLUMNS : Define el formato de la vista de la columna.
CATEGORY : Para la vista de la agenda, la propiedad se aplica al subarbol entero.
ARCHIVE : Para archivacion, dicha propiedad debe definir la localizacion del archivo para el subarbol entero.
LOGGING : Para logueo, debe definir las opciones del logueo para cada entrada del subarbol.

Vista de columnas

Mediante la vista de columnas podremos tener un modo comodo para ver y editar propiedades de una columna, donde cada nodo sera convertido en una fila tabulable. Por lo que podemos usar:
  • TAB : para desplazarnos entre columnas de esta fila de propiedades.
  • S-TAB S-TAB : para ver el contenido o compactarla de nuevo.

Podemos definir el formato de una columna para un solo fichero de la siguiente forma:

#+COLUMNS: %25ITEM %TAGS %PRIORITY %TODO

Para especificar que dicho formato solo se aplique a un arbol especifico deberiamos hacer algo asi:

** Alto del nodo para vista de columnas
:PROPERTIES:
:COLUMNS: %25ITEM %TAGS %PRIORITY %TODO
:END:

Los atributos que podemos conceder a las columnas se definen con la siguiente sintaxis:

%[ancho]propiedad[(titulo)][{tipo_sumario}]

Todos los elementos son opcionales a excepcion del simbolo % y el nombre de la propiedad:

ancho un valor entero que indicara el ancho de la columna en caracteres.
propiedad la propiedad a ser editada en esta columna.
(titulo) La cabecera del texto para la columna.
{tipo_sumario} Si se especifica, el valor de las columnas para el padre seran computadas para los hijos:
{+} Suma los miembros en esta columna
{+;%.lf} Como ‘+’ pero usando formato para long float
{$} Divisas
{:} Suma los tiempos HH:MM:SS
{X} Estado del checkbox, [X] si todas los hijos son [X]
{X/} Estado del checkbox, [n/m]
{X%} Estado del checkbox [n%]
{min} El numero mas pequeno de la columna
{max} El mayor numero de la columna
{mean} Significado artimetico de los valores
{:min} El valor de tiempo mas pequeno de la columna
{:max} El mayor valor de tiempo de la columna
{:mean} Significado aritmetico de los valores de tiempo.
{@min} Edad minima (en dias/horas/minutos/segundos)
{@max} Edad maxima (en dias/horas/minutos/segundos)
{@mean} Significado artimento de los valores (en dias/horas/minutos/segundos)

El siguiente ejemplo muestra que cada elemento tendra 25 caracteres de ancho como linea de cabecera, los siguientes especificardores tendran las columnas Dueno, Estado y Aprobados:

:COLUMNS: %25ITEM %9Aprobados(Aprobados?){X} %Duenos %11Estado %10Tiempo_Estimado{:} %CLOCKSUM
:Duenos_ALL: Juan Pedro Luis Alberto Javi
:Estado_ALL: «En progreso» «No comenzado todavia» «Finalizado» «»
:Aprobados_ALL: «[ ]» «[X]»

Podremos acceder a la vista de columnas usando los siguientes keystrokes:

Para activar/desactivar:

  • C-c C-x C-c : Activa la vista de columna. Si el cursor se encuentra antes de la primera linea de cabecera del fichero, se aplicara entonces para todo el fichero. El formato sera tomado de la variable org-columns-default-format.
  • r ó g: Recrea la vista de columna.
  • q : Sale de la vista de columna.

Para editar valores:

  • <izq> : Se desplaza hacia el campo de la izquierda en la vista de columnas.
  • <der> : Se desplaza hacia el campo de la derecha en la vista de columnas.
  • <arriba> : Se desplaza hacia el campo de la izquierd en la vista de columnas.
  • <abajo> : Se desplaza hacia el campo de la izquierda en la vista de columnas.
  • S-<– ó p : Modifica el valor al anterior para dicho campo.
  • S—> ó n : Modifica el valor al siguiente para dicho campo.
  • 1..9,0 : Selecciona el Nth valor, 0 seleccionara el decimo valor.
  • e : Edita la propiedad actual.
  • C-c C-c : Hace toggle de un checkbox.
  • v : Ve el valor completo de la propiedad actual (util cuando la columna es mas pequena que el valor).
  • a : Edita la lista de valores permitidos para dicha propiedad. Si el valor no existe, lo anadira a la lista.

Para modificar la estructura de la tabla:

  • < : Estrecha la columna.
  • > : Amplia la columna.
  • S-M—> : Inserta una nueva columna a la derecha de la columna actual.
  • S-M-<– : Elimina la columna actual.

La vista de columnas es tan solo un overlay sobre un buffer, por lo que este no puede ser exportado o impreso directamente, para ello debemos usar bloques dinamicos de vistas de columnas, tal que asi:

* La vista de columna
#+BEGIN: columnview :hlines 1 :id «label»
#+END:

El bloque dinamico tiene los siguientes parametros:

:id Es el identificador, que puede ser local, global, file:ruta-al-fichero o directamente el ID.
:hlines Cuando es t, inserta una linea horizontal despues de cada linea. Cuando es un numero N, inserta una linea horizontal antes de cada linea de cabecera con un nivel inferior o igual a N.
:vlines Cuando es t, fuerza los grupos de columnas para tener lineas verticales.
:maxlevel Cuando tiene un valor N, no captura las entradas por debajo del nivel N.
:skip-empty-rows Cuando es t, ignora las filas donde no hay indicada una linea en blanco para un ITEM.

Los siguientes comandos permiten insertar o actualizar un bloque dinamico:

  • C-c C-x i : Inserta un bloque dinamico capturando una vista de columna.
  • C-c C-c ó C-c C-x C-u : Actualiza el bloque dinamico actual. El cursor debe estar al principio de la linea de dicho bloque #+BEGIN.
  • C-u C-c C-x C-u : Actualiza todos los bloques dinamicos. Util para bloques con tablas de reloj.

Es posible anadir formulas a la columna de una vista de una tabla en caso de querer hacer plotting sobre la tabla, por lo que incluir #+TBBLFM: despues de la tabla, recalculara la tabla automaticamente despues de una actualizacion.

Para mas informacion sobre la captura y proceso de valores de propiedades en una tabla es interesante ver el script org-collector.el, que provee una API para coleccionar propiedades de una entrada para un ambito concreto.