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-get
admite 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)