paquete acumulativo de esfuerzo de org-agenda

7

Puede usar org-agenda-prefix-formatpara mostrar el esfuerzo para cada título de TODO:

(setq org-agenda-custom-commands
      '(("c" "My TODOs"
         ((tags-todo "mytag"
                     ((org-agenda-prefix-format " %6e ")))))))

Que muestra algo como:

       TODO Some patent task
[0:30] ..TODO Some sub-task
[0:30] ..TODO Some other sub-task

A diferencia de una tabla de reloj, el esfuerzo de las subtareas no se resume para la tarea principal. Me gustaría que se vea así:

[1:00] TODO Some patent task
[0:30] ..TODO Some sub-task
[0:30] ..TODO Some other sub-task

Mirar la documentación org-agenda-prefix-formatno muestra nada similar a lo %eque también suma, pero hay un genérico %(expression), sin explicación.

¿Qué %(expression)me daría salida como la anterior?

Jade Fausto
fuente

Respuestas:

5

Resulta que %(expression)no es una función a la que se le pasa ningún argumento, pero (point)se establece en el título actual a medida que se procesa, por lo que puede escribir algo como:

(org-agenda-prefix-format " %e %(or (org-entry-get (point) "Effort") "0:00") ")

... y el esfuerzo informado debe estar de acuerdo %e.

Ahora, org-entry-getadmite buscar en la jerarquía si la propiedad no está establecida en el elemento actual, pero lo que se requiere es reunir todas las propiedades en la jerarquía, para que podamos resumir el esfuerzo.

Aquí hay un primer intento:

(defun my-org-entry-get-subtree (property)
  (save-excursion
    (save-restriction
      (org-narrow-to-subtree)
      (goto-char (point-max))
      (save-match-data
        (cl-loop while (re-search-backward org-heading-regexp nil t)
                 collect (org-entry-get (point) property))))))

Que se puede usar para resumir el esfuerzo:

(defun my-org-effort-sum-current-item ()
  (org-minutes-to-hh:mm-string
    (cl-loop for minutes in (my-org-entry-get-subtree "Effort")
             sum (org-hh:mm-string-to-minutes (or minutes "0:00")))))

Problema: si tiene un TODO con 3 sub-TODO cada uno con una hora de esfuerzo, y completa un sub-TODO, la suma del esfuerzo restante es de 2 horas. Pero el código anterior incluye el esfuerzo del artículo en el estado HECHO, indicando 3 horas de error.

Debemos hacer coincidir solo los elementos en el subárbol que están en el estado TODO:

(defun my-org-effort-sum-current-item-in-state (state)
  (org-minutes-to-hh:mm-string
    (cl-loop for minutes in (my-org-entry-subtree-in-state-get state "Effort")
             sum (org-hh:mm-string-to-minutes (or minutes "0:00")))))

(defun my-org-entry-subtree-in-state-get (state property)
  (save-excursion
    (save-restriction
      (org-narrow-to-subtree)
      (goto-char (point-max))
      (save-match-data
        (cl-loop while (re-search-backward org-heading-regexp nil t)
                 when (string-equal state (org-get-todo-state))
                 collect (org-entry-get (point) property))))))

Agregue esto a org-agenda-prefix-format:

(setq org-agenda-custom-commands
      '(("c" "My TODOs"
         ((tags-todo "mytag"
                     ((org-agenda-prefix-format "[%(my-org-effort-sum-current-item-in-state "TODO")] ")
                      (org-tags-match-list-sublevels t)))))))

... y terminas con algo como esto:

Projects
[3:00] TODO Some Project Task
[1:00] TODO Sub-task A
[1:00] TODO Sub-task B
[1:00] TODO Sub-task C

(vea esta otra pregunta para saber cómo hacer que las subtareas sangren)

Jade Fausto
fuente