pacote cumulativo de esforço de tarefas da organização

7

Você pode usar org-agenda-prefix-formatpara exibir o esforço para cada título do TODO:

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

O que mostra algo como:

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

Diferentemente de uma tabela de horário, o esforço das subtarefas não é resumido para a tarefa pai. Eu gostaria que fosse assim:

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

Observar a documentação para org-agenda-prefix-formatmostra nada semelhante ao %eque também faz soma, mas há um genérico %(expression), sem explicação.

O %(expression)que me daria uma saída como a acima?

Jade Faustus
fonte

Respostas:

5

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-getsuporta 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)

Jade Faustus
fonte