org-agenda todoエフォートロールアップ


7

を使用org-agenda-prefix-formatして、TODOの見出しごとに作業量を表示できます。

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

これは次のようなものを示しています:

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

クロックテーブルとは異なり、サブタスクの労力は親タスクに対して合計されません。私はそれがこのように見えることを望みます:

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

のドキュメントを見ると、org-agenda-prefix-formatこれと同様のことは何も示されていません%eが、総称があり%(expression)、説明はありません。

何を%(expression)私に上記のような出力を与えるだろうか?

回答:


5

これは%(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

(サブタスクをインデントする方法については、この他の質問を参照してください)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.