Control de tiempos con org-mode
Estos días en que el teletrabajo ha tenido un impulso importante empezamos a necesitar controlar un poco más el tiempo de trabajo, el que dedicamos a nuestras tareas laborales que se nos está mezclando con el propio personal.
En este blog ya se ha hablado muchas veces de org-mode
, de la
agenda que proporciona, de cómo se gestionan las tareas, cómo podemos
etiquetarlas dividiendo proyectos, etc. En fin, una herramienta de
control de tiempo muy flexible, pero hasta ahora no había hablado de
cómo cronometrar el tiempo que dedicamos a cada una de esas tareas y
cómo registrarlo. ¿También proporciona org-mode
algún chismático que
haga eso? Pues sí. Las herramientas que nos proporciona emacs para
hacer esta gestión son logbook
y clocktable
. Vamos a hacer el
proceso paso a paso y veremos lo sencillo que es en realidad llevar
una gestión de tiempo precisa.
Para no guarrear mi fichero de agenda, he preparado un fichero org
que contiene tareas inventadas para el ejemplo, si ya llevas tus
tareas con org-mode
no necesitas crear ningún fichero, ya lo tienes
hecho. Pero si no quieres ensuciar tampoco tu fichero de agenda, copia
el siguiente código en un fichero org
. Ten cuidado, porque al copiar
desde la web, es posible que ponga espacios en blanco delante de las
cabeceras, asegúrate que en las líneas que comienzan con *
ese
asterisco no tiene ningún espacio en blando delante (las demás las
puedes dejar como caigan):
* Trabajo ** Reuniones de organización :LOGBOOK: CLOCK: [2020-05-18 lun 08:01]--[2020-05-18 lun 08:50] => 0:49 CLOCK: [2020-05-25 lun 08:01]--[2020-05-25 lun 08:55] => 0:54 CLOCK: [2020-06-01 lun 08:00]--[2020-06-01 lun 09:13] => 1:15 CLOCK: [2020-06-08 lun 08:01]--[2020-06-08 lun 09:00] => 0:59 :END: ** HECHO Informe de estrategias futuras :LOGBOOK: CLOCK: [2020-06-25 jue 10:05]--[2020-06-25 jue 11:55] => 1:50 CLOCK: [2020-06-26 vie 09:15]--[2020-06-26 vie 12:55] => 3:40 :END: ** Comprobar correo electrónico :LOGBOOK: CLOCK: [2020-06-01 lun 12:10]--[2020-06-01 lun 12:15] => 0:05 CLOCK: [2020-06-02 mar 12:10]--[2020-06-02 mar 12:15] => 0:05 CLOCK: [2020-06-03 mié 12:10]--[2020-06-03 mié 12:15] => 0:05 CLOCK: [2020-06-04 jue 12:10]--[2020-06-04 jue 12:15] => 0:05 CLOCK: [2020-06-05 vie 12:10]--[2020-06-05 vie 12:15] => 0:05 :END: ** Proyecto de Curso *** Diseño de objetivos :LOGBOOK: CLOCK: [2020-05-26 mar 09:11]--[2020-05-26 mar 12:19] => 3:08 CLOCK: [2020-05-28 jue 09:23]--[2020-05-28 jue 13:19] => 3:56 :END: *** Redacción del texto :LOGBOOK: CLOCK: [2020-06-24 mié 08:22]--[2020-06-24 mié 13:15] => 4:53 :END: ** Proyecto de aplicación *** Diseño de características necesarias :LOGBOOK: CLOCK: [2020-06-17 mié 08:00]--[2020-06-17 mié 13:00] => 5:00 CLOCK: [2020-06-18 jue 08:00]--[2020-06-18 jue 13:00] => 5:00 CLOCK: [2020-06-19 vie 08:00]--[2020-06-19 vie 13:00] => 5:00 :END: *** Programación de características :LOGBOOK: CLOCK: [2020-06-22 lun 08:00]--[2020-06-22 lun 13:00] => 5:00 CLOCK: [2020-06-22 lun 14:00]--[2020-06-22 lun 17:00] => 3:00 :END: * Mantenimiento ** Administración del servidor :LOGBOOK: CLOCK: [2020-06-25 jue 08:15]--[2020-06-25 jue 14:15] => 6:00 :END: ** Instalación de nueva aplicación web :LOGBOOK: CLOCK: [2020-06-26 vie 08:00]--[2020-06-26 vie 12:00] => 4:00 :END:
Si ahora no entiendes las anotaciones, no te preocupes, de eso voy a
hablar en este artículo, es sólo un fichero para hacer las pruebas.
Como ves sólo son unas cabeceras, que representan las tareas y en
algunas de esas cabeceras hay un bloque :LOGBOOK
con una o varias
etiquetas CLOCK:
, que en este caso son totalmente inventadas. Aún no
he hablado de cómo se generan esas etiquetas, lo haré a continuación.
Contabilizar tiempos
Bien desde la ventana de la agenda, bien dentro del fichero de tareas
podemos poner en marcha el cronómetro. Basta situarnos en el título de
la tarea que vamos a iniciar y pulsar la combinación C-c C-x i
, esto
pondrá en marcha el cronómetro. Bajo la tarea aparecerá, si no existe
ya, un bloque :LOGBOOK:
y un campo CLOCK:
con la fecha y la hora
de comienzo, con un formato parecido a:
** Tarea :LOGBOOK: CLOCK: [2020-05-27 mié 09:11] :END:
Mientras está el cronómetro en marcha no debes cerrar la ventana de la
agenda ni la del fichero que contiene la tarea, o el cronómetro se
detendrá sin contabilizar tiempo. Bien, vale ¿Cómo paramos el
cronómetro y que nos cuente? Pues lo que debemos hacer es cuando
dejamos de trabajar, llamar a C-c C-x o
. Hay otro modo, sin embargo,
para hacerlo y es, si tenemos un contador iniciado en una tarea con
alguna etiqueta TODO
, al cambiar dicha etiqueta a DONE
con la
habitual combinación C-c C-t
, también detendrá org-mode
el
contador y anotará fecha y hora de la parada:
** Tarea :LOGBOOK: CLOCK: [2020-05-27 mié 09:11]--[2020-05-27 mié 12:19] => 3:08 :END:
Como se puede ver en el ejemplo, al añadir la etiqueta de finalización, también añade una indicación del tiempo invertido en esa tarea, después de un signo de flecha.
¿Qué pasa si no acabamos la tarea y la retomamos más adelante? Pues
nada, volvemos a realizar el proceso: cuando retomamos la tarea,
volvemos a pulsar C-c C-x i
y cuando dejamos trabajar en ella
repetimos también el C-c C-x o
.
** Tarea :LOGBOOK: CLOCK: [2020-05-27 mié 09:11]--[2020-05-27 mié 12:19] => 3:08 CLOCK: [2020-05-28 jue 09:23]--[2020-05-28 jue 13:19] => 3:56 :END:
Como se puede apreciar, cada vez que trabajemos en ella y contemos el
tiempo, org-mode
añadirá una etiqueta CLOCK:
a su bloque
:LOGBOOK:
. Tantas como necesitemos.
Bien, ya sabemos que en nuestra tarea hemos trabajado seis horas
y... vamos, 6:64... quería decir, digo 7:04. ¡Uff! ¿No hay una forma
más sencilla de hacerlo? Claro, lo que necesitamos es clocktable
.
clocktable
La forma sencilla de visualizar el tiempo que hemos cronometrado es
hacer un resumen de tiempos con una tabla clocktable
. La puedes
poner en cualquier sitio del fichero, aunque yo tengo la tendencia de
ponerlas al principio del mismo. Si estás utilizando el fichero de
ejemplo que sugerí al principio del artículo, coloca el cursor en la
primera línea fichero, si no está en blanco, haz sitio con un par de
toques al <ENTER>
y después pulsa la combinación C-c C-x x
.
Automágicamente, aparecerá una tabla tal que:
#+BEGIN: clocktable :scope file :maxlevel 2 #+CAPTION: Clock summary at [2020-06-26 vie 13:17] | Tarea | Tiempo | | |-----------------------------------------+-----------+-------| | *Tiempo total* | *2d 6:47* | | |-----------------------------------------+-----------+-------| | Trabajo | 1d 20:47 | | | \_ Reuniones de organización | | 3:55 | | \_ Informe de estrategias futuras | | 5:30 | | \_ Comprobar correo electrónico | | 0:25 | | \_ Proyecto de Curso | | 11:57 | | \_ Proyecto de aplicación | | 23:00 | | Mantenimiento | 10:00 | | | \_ Administración del servidor | | 6:00 | | \_ Instalación de nueva aplicación web | | 4:00 | #+END:
Según dónde la generemos, es posible, que al llamarla, el chismático
nos coloque un valor diferente para la etiqueta :scope
. Puede
mostrar, por ejemplo, el valor subtree
que hará que los tiempos se
refieran sólo a la rama actual del árbol de tareas. También puede
mostrar el valor file
, en cuyo caso, los tiempos se refieren al
fichero actual completo. O si lo deseamos, podemos cambiarlo al valor
agenda
que nos contabilizará los tiempos de toda nuestra agenda.
Además, como ésta última es independiente del fichero que tengamos
abierto, podemos generar nuestra tabla de tiempos, e insertarla, en
cualquier buffer org
: no necesitamos estar en la agenda.
Siguiendo con nuestro ejemplo, podemos darnos cuenta que en realidad,
nuestro árbol de tareas tiene tres niveles y sin embargo, sólo muestra
dos. Eso lo gestiona la etiqueta :maxlevel
, si cambiamos ese valor a
3
, y sin movernos de la primera línea (la del #+BEGIN:
), pulsamos
C-c C-c
. La tabla se recalculará completamente con los tres niveles
y una columna más.
#+BEGIN: clocktable :scope file :maxlevel 3 #+CAPTION: Clock summary at [2020-06-27 sáb 13:29] | Tarea | Tiempo | | | |--------------------------------------------+-----------+-------+-------| | *Tiempo total* | *2d 6:47* | | | |--------------------------------------------+-----------+-------+-------| | Trabajo | 1d 20:47 | | | | \_ Reuniones de organización | | 3:55 | | | \_ Informe de estrategias futuras | | 5:30 | | | \_ Comprobar correo electrónico | | 0:25 | | | \_ Proyecto de Curso | | 11:57 | | | \_ Diseño de objetivos | | | 7:04 | | \_ Redacción del texto | | | 4:53 | | \_ Proyecto de aplicación | | 23:00 | | | \_ Diseño de características necesarias | | | 15:00 | | \_ Programación de características | | | 8:00 | | Mantenimiento | 10:00 | | | | \_ Administración del servidor | | 6:00 | | | \_ Instalación de nueva aplicación web | | 4:00 | | #+END:
Sí. Si comparamos las dos tablas, nos damos cuenta que la diferencia es la cantidad de detalle en las entradas de la tabla. Los tiempos generales son los mismos, pero ahora, los grupos de segundo nivel que tenían subtareas de tercero están desglosadas en su nueva columna.
Otra de las cosas que podemos hacer es, por ejemplo, si necesitemos
contar los tiempos, no por tareas, sino durante un periodo de tiempo
determinado, podemos utilizar las etiquetas :tstart
y :tend
. Por
ejemplo, para mostrar el tiempo contabilizado durante el mes de mayo:
#+BEGIN: clocktable :scope file :maxlevel 2 :tstart "<2020-05-01 vie>" :tend "<2020-05-31 dom>" #+CAPTION: Clock summary at [2020-06-27 sáb 14:33] | Tarea | Tiempo | | |-------------------------------+--------+------| | *Tiempo total* | *8:47* | | |-------------------------------+--------+------| | Trabajo | 8:47 | | | \_ Reuniones de organización | | 1:43 | | \_ Proyecto de Curso | | 7:04 | #+END:
Esas etiquetas pueden no ser absolutas, como en el ejemplo anterior.
Podemos utilizar, si nos interesa, especificaciones de tiempo
relativas. Para contabilizar los tiempos de la semana anterior
podemos utilizar :tstart "<-1w>"
y :tend "<now>"
.
#+BEGIN: clocktable :scope file :maxlevel 2 :tstart "<-1w>" :tend "<now>" #+CAPTION: Clock summary at [2020-06-27 sáb 14:41] | Tarea | Tiempo | | |-----------------------------------------+-----------+------| | *Tiempo total* | *1d 4:23* | | |-----------------------------------------+-----------+------| | Trabajo | 18:23 | | | \_ Informe de estrategias futuras | | 5:30 | | \_ Proyecto de Curso | | 4:53 | | \_ Proyecto de aplicación | | 8:00 | | Mantenimiento | 10:00 | | | \_ Administración del servidor | | 6:00 | | \_ Instalación de nueva aplicación web | | 4:00 | #+END:
O si nos interesa saber qué porcentaje de tiempo dedicamos a cada
tarea, podemos utilizar la etiqueta :formula %
. Como podemos ver en
el siguiente ejemplo:
#+BEGIN: clocktable :scope file :maxlevel 2 :tstart "<-1w>" :tend "<now>" :formula % #+CAPTION: Clock summary at [2020-06-27 sáb 14:43] | Tarea | Tiempo | | % | |-----------------------------------------+-----------+------+-------| | *Tiempo total* | *1d 4:23* | | 100.0 | |-----------------------------------------+-----------+------+-------| | Trabajo | 18:23 | | 64.8 | | \_ Informe de estrategias futuras | | 5:30 | 19.4 | | \_ Proyecto de Curso | | 4:53 | 17.2 | | \_ Proyecto de aplicación | | 8:00 | 28.2 | | Mantenimiento | 10:00 | | 35.2 | | \_ Administración del servidor | | 6:00 | 21.1 | | \_ Instalación de nueva aplicación web | | 4:00 | 14.1 | #+END:
En realidad, en la etiqueta :formula
se puede introducir entre
comillas cualquier fórmula que pondríamos en una etiqueta #+TBLFM:"
de una tabla. Eso añadirá una columna y la calculará.
Para ver cómo funcionan todos esos parámetros, lo mejor es jugar con
los valores e ir pulsando C-c C-c
en la línea de definición para
observar los efectos que los cambios tienen en la tabla.
Conclusiones
La contabilidad del tiempo es importante, sobre todo para aquellos que trabajando para terceros, tienen que facturar su tiempo. Emacs proporciona una herramienta completa para hacerlo de una manera sencilla y fácil.
Un detalle que he pasado por alto en el artículo y que no me voy a
detener mucho en explicar. A algunos les puede irritar, que generando
la mayoría de la tabla en español, la herramienta se empeñe en colocar
en #+caption
la expresión Clock summary at. Si alguien lo quiere
cambiar, se puede hacer modificando la variable
org-clock-clocktable-language-setup
.
Por mi parte, eso es todo. Hay más opciones que explorar y más funciones a las que llamar (para eso está la ayuda de =org-mode), pero en líneas generales esto es suficiente para llevar un control de nuestro tiempo:
- Consultar la agenda y situarnos en la tarea correspondiente.
- Iniciar el contador de tiempo con
C-c C-x i
cuando comenzamos o retomamos el trabajo en la tarea. - Parar el tiempo con
C-c C-x o
cuando terminamos o descansamos de la tarea. O cuando marcamos como hecha la tarea en la agenda conC-c C-t
. - Generar la tabla resumen de tiempos con
C-c C-x x
donde la necesitemos.
Cuatro pasos sencillos que nos permite tener controlado nuestro tiempo en todo momento.
Comentarios