Ene 13 2011

Org-mode : Date and times (Fechas y tiempos)

Tag: basicoverdrive @ 11:20 pm

En org-mode es posible usar fechas y tiempos para la planificacion de proyectos y demas informacion que queramos asociar a un tiempo, una fecha, etc.

Timestamps (marcas de tiempo)

El concepto de timestamp o marca de tiempo es usado generalmente para la creacion o ultima modificacion de un fichero, pero en el mundo de org es usado para un abanico mucho mayor de posibilidades. Existen distintos formatos de timestamps, que son los siguientes:

‘<2003-09-16 Tue>’
‘<2003-09-16 Tue 09:39>’
‘<2003-09-16 Tue 12:00-12:30>’

Y un timestamp puede aparecer en cualquier lugar del una linea de titulo (headline), el cuerpo (body) o en una entrada del arbol org (tree entry) creando entradas en la agenda ya sea diaria o semanalmente. Existen distintos tipos de timestamp:

  • Timestamp plano: * Meet Peter at the movies <2006-11-01 Wed 19:15>
  • Timestamp de cita: * Discussion on climate change <2006-11-02 Thu 20:00-22:00>
  • Timestamp con intervalos de repeticion: * Pick up Sam at school <2007-05-16 Wed 12:30 +1w>
  • Timestamp diario: * The nerd meeting on every 2nd Thursday of the month <%%(diary-float t 4 2)>
  • Rango de fechas: ** Meeting in Amsterdam <2004-08-23 Mon>–<2004-08-26 Thu>
  • Timestamp inactivo: * Gillian comes late for the fifth time [2006-11-01 Wed]

Creando timestamps

  • C-c . : org-time-stamp‘; inserta un timestamp (va entre <>).
  • C-c ! : org-time-stamp-inactive‘; inserta un timestamp inactivo (va entre []).
  • C-u C-c . : Inserta un timestamp con formato alternativo (mirar org-time-stamp-rounding-minutes).
  • C-u C-c ! : Inserta un timestamp inactivo con formato alternativo (mirar org-time-stamp-rounding-minutes).
  • C-c < : org-date-from-calendar‘; Inserta un timestamp correspondiente al cursor actual del calendario.
  • C-c > :org-goto-calendar‘; Accede al cursor actual del calendario.
  • C-c C-o : org-open-at-point‘; Accede a la agenda dado un timestamp existente.
  • S-<flecha izquierda> : org-timestamp-up-day‘; Cambia la fecha del cursor al dia anterior.
  • S-<flecha derecha> : org-timestamp-down-day‘; ‘org-timestamp-down-day’; Cambia la fecha del cursor al dia siguiente.
  • S-<flecha abajo> : org-timestamp-down-down‘; Cambia (ano, mes, dia, hora, minuto) al anterior.
  • S-<flecha arriba> : org-timestamp-up‘; Cambia (ano, mes, dia, hora, minuto) al siguiente.
  • C-c C-y :org-evaluate-time-range‘; Evalua un rango de tiempo entre el final y el principio.
  • C-u C-c C-y: Inserta la evaluacion de un rango de tiempo entre el final y el principio.

Prompt de horas y fechas (formatos y abreviaturas)

Existen distintos tipos de formatos, abreviaturas y demas para cuando trabajemos con org-mode, a continuacion las mostramos y mas adelante (sin preocuparnos ahora de ello, explicado en la seccion «Configuracion del formato del tiempo») donde explicaremos como emplear unas u otras (extraido del propio manual de orgmode):

Formatos para fechas:

     3-2-5         --> 2003-02-05
     2/5/3         --> 2003-02-05
     14            --> 2006-06-14
     12            --> 2006-07-12
     2/5           --> 2007-02-05
     Fri           --> el mas cercano Friday (Viernes) (fecha por defecto o siguiente)
     sep 15        --> 2006-09-15
     feb 15        --> 2007-02-15
     sep 12 9      --> 2009-09-12
     12:45         --> 2006-06-13 12:45
     22 sept 0:34  --> 2006-09-22 0:34
     w4            --> ISO semana para el ano actual 2006
     2012 w4 fri   --> Friday (viernes del ISO de la 4a semana en 2012)
     2012-w04-5    --> Mismo caso que arriba

Nota: para usar abreviaturas no listadas o de otros idiomas e.g. en lugar de Fri -> Vie o en lugar de Feb -> Ene deberemos configurar las variables parse-time-monthsparse-time-weekdays.

Formatos relativo al dia actual:

     +0            --> Hoy
     .             --> Hoy
     +4d           --> 4 dias desde hoy
     +4            --> 4 dias desde hoy
     +2w           --> Dos semanas desde hoy
     ++5           --> 5 dias desde la fecha por defecto
     +2tue         --> segundo Tuesday (Martes) desde hoy.

Formatos para rangos:

     11am-1:15pm    --> 11:00-13:15
     11am--1:15pm   --> same as above
     11am+2:15      --> same as above

Desplazamiento y seleccion por el calendario

  • <Intro> : Selecciona la fecha sobre la que esta el cursor en el calendario.
  • Click boton izquierdo del raton : Selecciona una fecha haciendo click en ella.
  • S-<flecha izquierda> : Se desplaza un dia hacia atras.
  • S-<flecha derecha> : Se desplaza un dia hacia adelante.
  • S-<flecha abajo> : Se desplaza una semana hacia adelante.
  • S-<flecha arriba> : Se desplaza una semana hacia atras.
  • M-S-<flecha izquierda> : Se desplaza un mes hacia atras.
  • M-S-<flecha derecha> : Se desplaza un mes hacia adelante.
  • > : Hace scroll del calendario en un mes hacia adelante.
  • < : Hace scroll del calendario en un mes hacia atras.
  • M-v : Hace scroll del calendario en 3 meses hacia atras.
  • C-v : Hace scroll del calendario en 3 meses hacia adelante.

Configuracion de formato del tiempo

Org-mode usa notacion estandar ISO 8601, esta puede ser modificada mediante la configuracion de variables org-display-custom-times y org-time-stamp-custom-formats, ademas con:

  • C-c C-x C-t : ‘org-toggle-time-stamp-overlays‘; Hace toggle entre este estandar y la configuracion que nosotros hayamos definido.

Org-mode necesita usar un estandar para poder parsear el fichero org y evitar futuros conflictos y problemas, por lo que de una manera u otra org-mode guardara el fichero en formato estandar aunque pueda ser visualizado de otra forma. Sin embargo si se emplea un formato especifico puede que algunas acciones efectuadas sobre los mismos timestamps tengan problemas, por lo que aconsejamos emplear el estandar en la medida de lo posible.


Deadlines (fechas limite) y Scheduling (Planificaciones)

Un timestamp puede venir precedido por palabras especiales para facilitar la planificacion:

  • DEADLINE (fecha limite donde la tarea debera ser terminada)
 *** TODO escribir articulo sobre la Tierra para el guia
El editor en cargar es [[bbdb:Ford Prefect]]
DEADLINE: <2004-02-29 Sun>
  • SCHEDULED (fecha donde se debera comenzar la tarea)
*** TODO Llamar a Pedro para su cumpleanos.
SCHEDULED: <2004-12-25 Sat>

Para insertar ‘deadlines’ o ‘scheduleds’ tendremos el siguiente juego de keybindings:

  • C-c C-d : ‘org-deadline‘; Inserta un deadline con un timestamp.
  • C-u C-c C-d : Elimina un deadline de la entrada.
  • C-c C-s : ‘org-schedule‘; Inserta un scheduled con un timestamp. (dependiendo de la variable org-log-reschedule una nota sera tomada cuando se modifique un scheduled existente) .
  • C-u C-c C-s : Elimina un scheduled de la entrada.
  • C-c C-x C-k : ‘org-mark-entry-for-agenda-action‘; Marca la entrada actual para una accion en la agenda. Despues de ello se puede abrir la agenda o el calendario para marcar la fecha apropiada; con k s o k d dependiendo de si es scheduled o deadline.
  • C-c / d : ‘org-check-deadlines‘; Crea un arbol con todas las deadlines pendientes o las que estan ‘al caer’ invocando org-deadline-warning-days.
  • C-u C-c / d : Muestra todas las deadlines en un fichero.
  • C-1 C-c / d : Muestra las deadlines del dia siguiente en un fichero.
  • C-c / b : ‘org-check-before-date‘; Crea un arbol con los deadlines y los scheduled antes de una fecha marcada.
  • C- c / a : ‘org-check-after-date‘; Crea un arbol con los deadlines y los scheduled despues de una fecha marcada.

Tareas repetitivas

Algunas tareas necesitan ser repetidas una y otra vez (un buen ejemplo es leer todos los dias 1 hora, hacer deporte cada 2 dias o pagar el piso todos los meses). Para ello se usa el siguiente formato:

     ** TODO Pagar el alquiler
        DEADLINE: <2005-10-01 Sat +1m>

La parte del +1m es la repeticion (que se puede interpretar como y otra vez dentro de 1 mes). Tambien se podria especificar una indicacion de advertencia durante unos dias antes, por ejemplo mediante +1m -3d (notese el espacio que hay entre la m y el -).

Como estas tareas son repetitivas existe un problema, y es que cuando la realizamos, si las marcamos como hechas mediante C-c C-t indicaria que no deberiamos a volverlas hacer, por lo que org-mode resuelve esto marcando la tarea de este mes como finalizada y anadiendo una mas sin hacer replica de esta primera pero con la siguiente fecha.

Existe otro caso especifico, por ejemplo si debiamos llamar a nuestros padres 1 vez por semana (tarea repetitiva) y sin embargo nos hemos olvidado durante 3 semanas seguidas, careceria de sentido llamarle ese mismo dia 3 veces para cumplimentar estas tareas, para ello, hay casos especiales mediante ‘++’ y  ‘.+’. Cuando se marque una tarea con ‘++‘ (por ej. ++1w) no importara si se ha finalizado la tarea semanal un Miercoles, si debiamos llamar a nuestro padre todos los Sabados, marcara como tarea pendiente el siguiente sabado. Mientras que si empleamos ‘.+’ lo marcaria a partir del dia que haya sido realizada la tarea, es decir el siguiente Miercoles.

Una alternativa para crear tareas repetitivas es realizar un numero especifico de copias de la tarea original, y cambiar las fechas de cada una de ellas de forma rapida mediante C-c C-x c.

Reloj

Org-mode permite iniciar el reloj cuando comience una tarea y pararlo, de esa forma podemos estimar el tiempo y esfuerzo realizado en una tarea. Incluso permite hacerlo entre distintas sesiones de emacs, de esa manera no importa cuantas veces hayamos parado e iniciado dicho reloj. Para ello hay que introducir las siguientes lineas en nuestro .emacs:

     (setq org-clock-persist 'history)
     (org-clock-persistence-insinuate)

Los keybindings que tenemos en nuestro poder para trabajar con el reloj son los siguientes:

  • C-c C-x C-i : ‘org-clock-in‘; Comienza a contar el reloj actual, insertando la palabra CLOCK junto al timestamp. Las lineas pueden ir envueltas en un wrapper llamado  para :LOGBOOK: ello hay que configurar la variable org-clock-into-drawer.
  • C-u C-c C-x C-i : Selecciona una tarea de una lista de tareas cronometradas.
  • C-c C-x C-o : ‘org-clock-out‘; Detiene el contador de un reloj anadiendo un timestamp frente a la tarea detenida. Ademas permite agregar informacion como nota adicional configurando la variable org-log-note-clock-out.
  • C-c C-x C-e : ‘org-clock-modify-effort-estimate‘; Actualiza el esfuerzo estimado para la tarea actual.
  • C-c C-c ó C-c C-y : ‘org-evaluate-time-range‘; Recomputa el intervalo de tiempo despues de cambiar uno de los timestamps (requerido si se modifican ‘directamente’ los timestamps, si se modifican mediante S-<cursor> es automatico).
  • C-c C-t : ‘org-todo‘; Cambia el estado de una tarea, por lo que el reloj en caso de existir para dicha tarea se detendra.
  • C-c C-x C-x : ‘org-clock-cancel‘; Cancela el reloj actual (util cuando se inicia el reloj por error para alguna tarea).
  • C-c C-x C-j : ‘org-clock-goto‘; Salta al headline (linea de titulo) de la tarea usada en el reloj actual.
  • C-c C-x C-d : ‘org-clock-display‘; Muestra el sumario de tiempos para cada subarbol del buffer actual. Al cambiar de buffer se borrara esta informacion, por lo que si se requiere de una configuracion distinta se debera tratar la variable org-remove-highlights-with-change.

Org-mode puede producir reportes bastante complejos basandose en la informacion recolectada del uso del reloj, veamos algunos comandos interesantes:

  • C-c C-x C-r : ‘org-clock-report‘; Inserta un bloqueo dinamico, manteniendo una tabla sobre el fichero actual, la cual es parcialmente actualizada cuando el cursor se encuentra encima de una tarea.
  • C-u C-c C-x C-r : Salta al primer reloj del reporte del documento actual y lo actualiza.
  • C-c C-c ó C-c C-x C-u : ‘org-dblock-update‘; Actualiza un bloqueo dinamico en el punto (el cursor debera estar en la linea de #+BEGIN del bloque dinamico).
  • C-u C-c C-x C-u : Actualiza todos los bloques dinamicos.
  • S-<flecha izquierda> : ‘org-clocktable-try-shift‘; Hace un desplazamiento hacia la izquierda del :block actual y actualiza la tabla.
  • S-<flecha derecha> : ‘org-clocktable-try-shift‘; Hace un desplazamiento hacia la derecha del :block actual y actualiza la tabla. (Requiere que el cursor se encuentre en la linea de #+BEGIN clocktable.

Un ejemplo:

#+BEGIN: clocktable :maxlevel 2 :emphasize nil :scope file
#+END: clocktable

Despues de la palabra reservada clocktable existen una serie de opciones de ambito, estructura y formato del reporte (que puede ser modificado su valor por defecto tratando la variable org-clocktable-defaults):

     :maxlevel    Maximo nivel de profundidad listado en la tabla.
                  Los relojes que esten en niveles mas profundos se sumaran a los de sus niveles superior.
     :scope       El ambito a considerar. Puede ser uno de los siguientes:
                  nil        El buffer actual o una region
                  file       El buffer completo
                  subtree    El subarbol donde se encuentra el reloj
                  treeN      El rodeo de arboles al nivel N, por ejemplo tree3
                  tree       El rodeo del arbol 1 tree
                  agenda     Todos los ficheros agenda
                  ("file"..) Escanea estos ficheros
                  file-with-archives    Fichero actual y sus archivos
                  agenda-with-archives  Todos los ficheros de agenda incluyendo sus archivos
     :block       El bloqueo de tiempo a considerar.  Puede tomar los siguientes valores:
                  absolute, o relative al tiempo actual y puede ser uno de los siguientes formatos:
                  2007-12-31    Nuevo ano eve 2007
                  2007-12       Diciembre 2007
                  2007-W50      ISO-semana 50 en 2007
                  2007-Q2       2o cuarto en 2007
                  2007          El ano 2007
                  today, yesterday, today-N          Un dia relativo
                  thisweek, lastweek, thisweek-N     Una semana relativa
                  thismonth, lastmonth, thismonth-N  Un mes relativo
                  thisyear, lastyear, thisyear-N     Un ano relativo
                  Usad S-<derecha>/<izquierda> para desplazar los intervalos de tiempo
     :tstart      Cadena de tiempo especificando cuando empiezan a considerarse los tiempos
     :tend        Cadena de tiempo especificando cuando se considera detener los tiempos
     :step        week o day, (semana o dia) a separar en la tabla en pedazos
                  Para usar esto, :block or :tstart, es requerido :tend
     :stepskip0   No mostrar pasos que tienen 0 de tiempo
     :fileskip0   No mostrar secciones de la table de ficheros los cuales no contriuyeron
     :tags        Los tags que coinciden para seleccionar entradas que deben contribuir

Hay opciones que pueden determinar el formato de la tabla. Estas opciones son interpretadas por la funcion org-clocktable-write-default, aunque se puede usar una funcion propia especificando el parametro :formatter:

     :emphasize   Cuando t, recalca el nivel 1 y 2 items.
     :link        Enlace a la cabecera del item en la tabla de sus origenes.
     :narrow      Un entero para limitar el ancho de la linea de cabecer en la columna en la tabla org.
                  Si se escribe '50!', entonces la cabecera tambien sera acortada al exportar.
     :indent      Identa cada campo de linea de cabecera de acuerdo con su nivel.
     :tcolumns    Numero de columnas a ser usados para los tiempos
                  Si es mas pequeno que :maxlevel, los niveles inferiores seran agrupados en una columna.
     :level       Debe ser mostrado el nivel de numero de columna?
     :compact     Abreviacion para :level nil :indent t :narrow 40! :tcolumns 1
                  Todos seran sobreescritos si esta implicita la opcion :narrow
     :timestamp   Un timestamp para la entrada, cuando este disponible.  Buscar SCHEDULED,
                  DEADLINE, TIMESTAMP y TIMESTAMP_IA, por dicho orden.
     :formula     Contenido de una linea #+TBLFM a ser anadida y evaluada.
                  Como caso especial, ‘:formula %’ anade una columna con % tiempo.
                  Si no se especifica aqui una formula, una formula existente
                  debajo de la tabla del reloj se mantendra con las actualizaciones y sera evaluada
     :formatter   Una funcion de los datos del formato del reloj e insercion de este en un buffer.

Algunos ejemplos de uso de todos estos formatos que hemos dicho son (tiempo para un rango especifico):

#+BEGIN: clocktable :tstart "<2006-08-10 Thu 10:00>"
                    :tend "<2006-08-10 Thu 12:00>"
#+END: clocktable

o (resumen de un reloj del nivel actual 1 del arbol, para el dia actual)

     #+BEGIN: clocktable :maxlevel 2 :block today :scope tree1 :link t
     #+END: clocktable

Tiempo inactivo (idle)

Si se emplea el reloj para un item de trabajo y por alguna razon se deja el ordenador de lado (por ejemplo una llamada telefonica) se necesita solucionar eso para ignorar este tiempo, una manera sencilla de solucionarlo es mediante la configuracion de la variable org-clock-idle-time, en el cual emacs avisara del tiempo de idle. Con este tiempo orgmode preguntara que accion se desea tomar:

  • k : para mantener algunos o todos los minutos dentro del reloj. Org preguntara cuantos minutos desean mantenerse o bien presionando RET directamente para mantenerlos todos.
  • K : se preguntara cuantos minutos se requirio para la tarea.
  • s : para no mantener ningun minuto.
  • S : para no mantener ningun minuto desde que comenzo el tiempo de away.
  • C : para cancelar el reloj (se perdera el tiempo anterior al away dedicado a la tarea tambien).

Estimacion de esfuerzo

Es posible estimar el esfuerzo del trabajo de forma muy detallada, esto puede servir para mejorar o ver en que tareas se dedica una ingente cantidad de tiempo, etc. Para ello se empleara la propiedad especial ‘Effort’ mediante los siguientes comandos:

  • C-c C-x e : ‘org-set-effort‘; Activa la propiedad ‘Effort’ para la entrada actual.
  • C-c C-x C-e : ‘org-clock-modify-effort-estimate‘; Modifica la estimacion de esfuerzo del item actual que es cronometrado.

Un ejemplo para el buffer actual podria ser:

     #+PROPERTY: Effort_ALL 0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00 8:00
     #+COLUMNS: %40ITEM(Task) %17Effort(Estimated Effort){:} %CLOCKSUM

o modificando las variables org-global-properties y org-columns-default-format. Para tener una vista general de la parte entera del dia que ha sido consignada se puede configurar la variable org-agenda-columns-add-appointments-to-effort-sum.

Tomando notas con temporizadores relativos

Cuando se toman notas, por ejemplo en una reunion o cuando se ve un video, etc. Puede ser util tener acceso a tiempos del inicio, para ello org provee un modo sencillo para tratar esto:

  • C-c C-x . : ‘org-timer‘; Inserta un tiempo relativo en el buffer. La primera vez, el reloj es creado, la siguiente iniciado.
  • C-u C-c C-x . : Reinicia el reloj de tiempo relativo.
  • C-c C-x – : ‘org-timer-item‘; Inserta una descripcion para un item con el actual tiempo relativo.
  • C-u C-c C-x – : Resetea el cronometro o tiempo relativo a 0.
  • M-<Intro> : ‘org-insert-heading‘; Cuando el reloj esta iniciado, se puede emplear para iniciar nuevos relojes relativos.
  • C-c C-x , : ‘org-timer-pause-or-continue‘; Pausa un reloj o reanuda un reloj parado.
  • C-u C-c C-x , : Para el reloj. Despues de esto, solo se puede iniciar un nuevo reloj.
  • C-c C-x 0 : ‘org-timer-start‘; Resetea un reloj sin insertar nada en el buffer. Por defecto comienza en 0, pero es posible utilizar argumentos (en lugar de 0, 4 por ej. para darle un offset (desplazamiento) al timer).

Despues de recibir un mail de un ‘emacser’, creo que es conveniente incluir su sugerencia (cortesia de Igor). Propone incluir en nuestro .emacs (modificando el valor de una variable) para que cuando un headline este marcado como DONE, se detenga el contador:

;; Clock out when moving task to a done state
(setq org-clock-out-when-done t)

Por otra parte, Igor tambien propone las siguientes lineas para que los contadores esten en un draw diferente de los logs:

;; Separate drawers for clocking and logs
(setq org-drawers (quote («PROPERTIES» «LOGBOOK» «CLOCK»)))
;; Save clock data in the CLOCK drawer and state changes and notes in the LOGBOOK drawer
(setq org-clock-into-drawer «CLOCK»)

Cuenta atras

Llamando a org-timer-set-timer se ejecuta un cronometro cuenta atras. Emplear ; para la agenda y C-c C-x ; en cualquier otra parte (debe ser un tema de conflictos). La cuenta atras, aparece en el modeline, con org-timer-default-timer especifica el valor por defecto desde el cual iniciar. Modificandolo se permite especificar un valor que no sea el de por defecto.

<;> from agenda buffers, <C-c C-x ;> everwhere else.org-timer-set-timer prompts the user for a duration and displays a countdown timer in the modeline. org-timer-default-timer sets the default countdown value. Giving a prefix numeric argument overrides this default value.


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.


Jul 03 2010

Org-mode : Graficas / trazas (plot)

Tag: basicoverdrive @ 3:21 am

En el articulo anterior referente a spreadsheet u hojas de calculo, explicamos como es posible realizar hojas de calculo mediante org-mode de GNU/emacs. Como bien muchos saben, estas las hojas de calculo son datos tabulados en los que se pueden incluir referencias y demas, por lo que este software generalmente incluye lo que se llama plotting o traza de estos datos, o lo que es lo mismo realizar graficas haciendo uso de estos datos. GNU/emacs no es para menos, y tambien permite realizar lo mismo. He preferido separarlo en dos articulos (aunque este segundo me ha quedado algo corto), ya que en muchos casos no estamos para nada interesados en esta funcionalidad, pero si creo que es un aditivo a la funcionalidad anterior y esta estrechamente relacionada.

Plot

Se puede producir graficos en 2D y 3D mediante gnuplot, lo cual requiere de tener gnuplot y gnuplot-mode instalado. Se debe agregar a la primera linea de la tabla algo tal que asi (por ejemplo):

#+PLOT: title:»foobar» ind:1 deps:(3) type:2d with:histograms set:»yrang [0:]».

Existen otras funciones para plot tal que:

set: especifica cualquier opcion de gnuplot a ser modificada.
title: espeficia el titulo del ploteado.
ind: especifica que columna de la tabla usara el eje de las x.
deps: especifica las columnas a ser ploteadas.
type: especifica el tipo de ploteado, 2d, 3d o grid.
with: Especifica cada opcion a ser insertada (lines, points, boxes, impulses, etc).
file: especifica un fichero de salida para el ploteado.
labels: lista de etiquetas a ser usadas para las deps.
line: especifica una linea entera a ser insertada en el script de gnuplot.
map: Cuando dibuja en 3D o tipo, activa los mapas para ir mas alla de 3d slope.
timefmt: Especifica el formato de timestams.
script: control total especificando un fichero de script. Especificado por $datafile.

Los resultados son excepcionales, podeis probarlos, podeis encontrar mas informacion dedicada al tema en: http://cars9.uchicago.edu/~ravel/software/gnuplot-mode.html tambien podeis encontrar informacion interesante sobre gnuplot en su web oficial.


« Página anteriorPágina siguiente »