Notxor tiene un blog

Defenestrando la vida


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:

  1. Consultar la agenda y situarnos en la tarea correspondiente.
  2. Iniciar el contador de tiempo con C-c C-x i cuando comenzamos o retomamos el trabajo en la tarea.
  3. 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 con C-c C-t.
  4. 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

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.