org-Agenda todo Aufwand Rollup

7

Sie können org-agenda-prefix-formatden Aufwand für jede TODO-Überschrift anzeigen lassen:

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

Welches zeigt so etwas wie:

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

Im Gegensatz zu einem Clocktable wird der Aufwand der Unteraufgaben nicht für die übergeordnete Aufgabe zusammengefasst. Ich möchte, dass es so aussieht:

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

Wenn Sie sich die Dokumentation ansehen, sehen Sie org-agenda-prefix-formatnichts Ähnliches wie %edas Summieren, aber es gibt ein generisches %(expression), ohne Erklärung.

Was %(expression)würde mir eine Ausgabe wie oben geben?

Jade Faustus
quelle

Antworten:

5

Es stellt sich heraus, dass %(expression)es sich nicht um eine Funktion handelt, der Argumente übergeben werden, sondern die (point)bei der Verarbeitung auf die aktuelle Überschrift gesetzt wird, sodass Sie Folgendes schreiben können:

(org-agenda-prefix-format " %e %(or (org-entry-get (point) "Effort") "0:00") ")

... und der gemeldete Aufwand sollte zustimmen %e.

Nun org-entry-gethat die Unterstützung suchen auf der Hierarchie , wenn die Eigenschaft nicht auf der aktuellen Position gesetzt ist, aber was erforderlich ist sammelt alle die Eigenschaften unten der Hierarchie, so dass wir die Mühe summieren können.

Hier ist ein erster Versuch:

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

Welches kann verwendet werden, um den Aufwand zu summieren:

(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")))))

Problem: Wenn Sie ein TODO mit 3 Unter-TODOs mit jeweils einer Stunde Aufwand haben und ein Unter-TODO abschließen, beträgt der verbleibende Gesamtaufwand 2 Stunden. Der obige Code enthält jedoch den Aufwand für den Artikel im Status FERTIG, bei dem 3 Stunden falsch angegeben wurden.

Wir müssen nur die Elemente im Teilbaum abgleichen, die sich im Status TODO befinden:

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

Fügen Sie dies hinzu zu 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)))))))

... und am Ende haben Sie so etwas:

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

(In dieser anderen Frage erfahren Sie, wie Sie die Unteraufgaben zum Einrücken bringen.)

Jade Faustus
quelle