これは%(expression)
引数を渡される関数ではありませんが、(point)
処理時に現在の見出しに設定されるため、次のように記述できます。
(org-agenda-prefix-format " %e %(or (org-entry-get (point) "Effort") "0:00") ")
...そして報告された努力は同意するはず%e
です。
現在、org-entry-get
は、現在のアイテムにプロパティが設定されていない場合に階層を検索することをサポートしていますが、必要なのは、すべてのプロパティを階層の下に集めることです。
これが最初の試みです:
(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))))))
これは、労力を合計するために使用できます。
(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")))))
問題:それぞれに1時間の努力を伴う3つのサブTODOを含むTODOがあり、1つのサブTODOを完了すると、残りの努力の合計は2時間になります。ただし、上記のコードには、DONE状態のアイテムからの作業が含まれており、3時間のミスステータスになります。
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))))))
これをに追加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)))))))
...そしてあなたはこのようなもので終わる:
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
(サブタスクをインデントする方法については、この他の質問を参照してください)