Acontece que %(expression)
não é uma função que recebe nenhum argumento, mas (point)
é definida como o título atual enquanto é processado, para que você possa escrever algo como:
(org-agenda-prefix-format " %e %(or (org-entry-get (point) "Effort") "0:00") ")
... e o esforço relatado deve concordar %e
.
Agora, org-entry-get
suporta busca -se a hierarquia se a propriedade não está definida no item atual, mas o que é necessário é reunir todos as propriedades para baixo da hierarquia, por isso podemos resumir o esforço.
Aqui está uma primeira tentativa:
(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 pode ser usado para somar o esforço:
(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: se você tiver um TODO com 3 sub-TODOs, cada um com uma hora de esforço, e você concluir um sub-TODO, a soma do esforço restante será de 2 horas. Mas o código acima inclui o esforço do item no estado CONCLUÍDO, perdendo 3 horas.
Devemos corresponder apenas aos itens da subárvore que estão no 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))))))
Adicione isso ao 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)))))))
... e você acaba com algo assim:
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
(veja esta outra pergunta sobre como obter as subtarefas para recuar)