So passen Sie den Status einer Org-Aufgabe mit ihren untergeordneten Kontrollkästchen automatisch an

10

Ich habe mehrere Aufgaben in meiner Org-Datei, von denen eine Elemente enthält, die mit einem Kontrollkästchen beginnen (aber nur diese). Sie alle haben am Ende ein Statistik-Cookie ([n / m]).

Ich suche nach einer Möglichkeit, die übergeordnete Aufgabe automatisch von auf zu aktualisieren TODO, DONEsobald alle Kontrollkästchen ebenfalls als erledigt markiert sind.

Die Dokumentation sagt:

Wenn Sie möchten, dass ein TODO-Eintrag automatisch zu FERTIG wechselt, wenn alle untergeordneten Elemente fertig sind, können Sie das folgende Setup verwenden [...]

Eine andere Möglichkeit ist die Verwendung von Kontrollkästchen, um eine große Anzahl von Unteraufgaben zu identifizieren (eine Hierarchie von) (siehe Kontrollkästchen).

Ich verstehe den letzten Teil so, dass der übergeordnete Status bereits automatisch aktualisiert werden sollte, wenn untergeordnete Elemente Kontrollkästchen sind (was nicht der Fall ist).

Was vermisse ich?


Bearbeiten:

Aus org-after-todo-statistics-hookder Dokumentation (org.el):

Hook, der aufgerufen wird, nachdem ein TODO-Statistik-Cookie aktualisiert wurde. Jede Funktion wird mit zwei Argumenten aufgerufen: der Anzahl der nicht erledigten Einträge und der Anzahl der erledigten Einträge.

Was bedeutet, dass der vorgeschlagene Code von orgmode.org:

(defun org-summary-todo (n-done n-not-done)
  "Switch entry to DONE when all subentries are done, to TODO otherwise."
  (let (org-log-done org-log-states)   ; turn off logging
    (org-todo (if (= n-not-done 0) "DONE" "TODO"))))

(add-hook 'org-after-todo-statistics-hook 'org-summary-todo)

Kontrollkästchen werden nicht gezählt.

Mathieu Marques
quelle
Haben Sie ein Statistik-Cookie in der Überschrift? So:* Heading [0/1]
erikstokes
Ja da ist. Ich habe vergessen zu erwähnen, dass ich schlecht bin.
Mathieu Marques
1
Ich denke, dieses Missverständnis ist darauf zurückzuführen, dass das Organisationshandbuch in diesem Fall nicht so klar ist. Die Zeile "Eine weitere Möglichkeit ist die Verwendung von Kontrollkästchen ..." ist ein neuer Absatz unter der Überschrift "Aufteilen von Aufgaben in Unteraufgaben". Ich denke, dass "eine andere Möglichkeit" in diesem Fall eine andere Möglichkeit zum Aufteilen von Aufgaben in Unteraufgaben ist, nicht eine andere Möglichkeit zum automatischen Ändern des TODO-Status. Vielleicht versuchen Sie ihre vorgeschlagene Funktion und Haken (obwohl ich dies nicht zu wokr bekommen konnte)
elethan
@elethan Es macht tatsächlich Sinn, denke ich. Ja, siehe meine Bearbeitung :)
Mathieu Marques
1
Dies ist eine FAQ .
NickD

Antworten:

6

Wie Sie in Ihrer aktualisierten Frage erwähnt haben, org-after-todo-statistics-hookist es nicht das, was Sie wollen. Was du willst ist org-checkbox-statistics-hook.

Ich benutze diese Funktion, um das zu tun, was Sie beschreiben (sie sollten diese Funktionalität wirklich in den Organisationsmodus bringen):

(defun my/org-checkbox-todo ()
  "Switch header TODO state to DONE when all checkboxes are ticked, to TODO otherwise"
  (let ((todo-state (org-get-todo-state)) beg end)
    (unless (not todo-state)
      (save-excursion
    (org-back-to-heading t)
    (setq beg (point))
    (end-of-line)
    (setq end (point))
    (goto-char beg)
    (if (re-search-forward "\\[\\([0-9]*%\\)\\]\\|\\[\\([0-9]*\\)/\\([0-9]*\\)\\]"
                   end t)
        (if (match-end 1)
        (if (equal (match-string 1) "100%")
            (unless (string-equal todo-state "DONE")
              (org-todo 'done))
          (unless (string-equal todo-state "TODO")
            (org-todo 'todo)))
          (if (and (> (match-end 2) (match-beginning 2))
               (equal (match-string 2) (match-string 3)))
          (unless (string-equal todo-state "DONE")
            (org-todo 'done))
        (unless (string-equal todo-state "TODO")
          (org-todo 'todo)))))))))

(add-hook 'org-checkbox-statistics-hook 'my/org-checkbox-todo) Wird es jedes Mal aufgerufen, wenn Sie ein Kontrollkästchen aktivieren?

Es erfordert, dass Sie ein Statistik-Cookie (das, was Sie mit [/]oder [%]dann bekommen C-c C-c) in der Kopfzeile haben.

Inops
quelle
1
Haben Sie zufällig eine Version, die, wenn die Wiederholung des TODO geplant ist, die Checkliste für die Planung erneut deaktiviert? :)
Ctietze
0

Ich wollte eine Version, die genau das tut, wonach @ctietze sucht - den Kontrollkästchenstatus für Elemente in der Checkliste umschalten. Ich habe versucht org-reset-checkbox-state-subtreeanzurufen , habe aber Fehler bei zu vielen verschachtelten Frames erhalten (ich verwende Spacemacs).

Hier ist meine Arbeitslösung:

    (defun my/org-reset-checkbox-state-subtree ()
    "Simplified version of org-list builtin"
    ;; Begin copy from org-reset-checkbox-subtree
    (org-narrow-to-subtree)
      (org-show-subtree)
      (goto-char (point-min))
      (let ((end (point-max)))
        (while (< (point) end)
          (when (org-at-item-checkbox-p)
            (replace-match "[ ]" t t nil 1))
          (beginning-of-line 2)))
      (org-update-checkbox-count-maybe 'all)
    ;; End copy from org-reset-checkbox-subtree
    )

  (defun my/org-checkbox-todo ()
    "Switch header TODO state to DONE when all checkboxes are ticked, to TODO otherwise"
    (let ((todo-state (org-get-todo-state)) beg end)
      (unless (not todo-state)
        (save-excursion
          (org-back-to-heading t)
          (setq beg (point))
          (end-of-line)
          (setq end (point))
          (goto-char beg)
          (if (re-search-forward "\\[\\([0-9]*%\\)\\]\\|\\[\\([0-9]*\\)/\\([0-9]*\\)\\]"
                                 end t)
              (if (match-end 1)
                  (if (equal (match-string 1) "100%")
                      (unless (string-equal todo-state "DONE")
                        (my/org-reset-checkbox-state-subtree)
                        (org-todo 'done))
                    (unless (string-equal todo-state "TODO")
                      (org-todo 'todo)))
                (if (and (> (match-end 2) (match-beginning 2))
                         (equal (match-string 2) (match-string 3)))
                    (unless (string-equal todo-state "DONE")
                      (my/org-reset-checkbox-state-subtree)
                      (org-todo 'done))
                  (unless (string-equal todo-state "TODO")
                    (org-todo 'todo)))))))))
  (add-hook 'org-checkbox-statistics-hook 'my/org-checkbox-todo)
Wesley
quelle