Comment ajuster automatiquement un état de tâche Org avec ses cases à cocher enfants

10

J'ai plusieurs tâches dans mon fichier Org, dont l'une contient des éléments commençant par une case à cocher (mais uniquement ceux-ci). Ils ont tous un cookie statistique à leur fin ([n / m]).

Je cherche un moyen de mettre à jour automatiquement la tâche parent de TODOà DONEune fois que toutes les cases à cocher sont également marquées comme terminées.

La documentation dit:

Si vous souhaitez qu'une entrée TODO passe automatiquement à DONE lorsque tous les enfants ont terminé, vous pouvez utiliser la configuration suivante [...]

Une autre possibilité est l'utilisation de cases à cocher pour identifier (une hiérarchie de) un grand nombre de sous-tâches (voir Cases à cocher).

La façon dont je comprends cette dernière partie est que si les éléments enfants sont des cases à cocher, l'état parent doit déjà être automatiquement mis à jour (ce qui n'est pas le cas).

Qu'est-ce que je rate?


Éditer:

À partir de org-after-todo-statistics-hookla documentation (org.el):

Hook appelé après la mise à jour d'un cookie de statistiques TODO. Chaque fonction est appelée avec deux arguments: le nombre d'entrées non terminées et le nombre d'entrées terminées.

Ce qui signifie que le code proposé par 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)

ne comptera pas les éléments des cases à cocher.

Mathieu Marques
la source
Avez-vous un cookie de statistiques dans le titre? Comme ça:* Heading [0/1]
erikstokes
Oui il y a. J'ai oublié de mentionner ce peu mon mauvais.
Mathieu Marques
1
Je pense que ce malentendu vient du manuel de l'organisation qui n'est pas si clair dans ce cas. La ligne qui commence "Une autre possibilité est l'utilisation de cases à cocher ..." est un nouveau paragraphe sous le titre "Décomposer les tâches en sous-tâches". Je pense que "une autre possibilité" dans ce cas fait référence à une autre possibilité de diviser les tâches en sous-tâches et non à une autre possibilité de changer automatiquement l'état TODO. Essayez peut-être leur fonction et leur crochet suggérés (bien que je n'aie pas pu le faire au wokr)
elethan
@elethan Cela a du sens, je suppose. Oui voir mon montage :)
Mathieu Marques
1
Ceci est une FAQ .
NickD

Réponses:

6

Comme vous l'avez mentionné dans votre question mise à jour, ce org-after-todo-statistics-hookn'est pas ce que vous voulez. Ce que tu veux c'est org-checkbox-statistics-hook.

J'utilise cette fonction pour faire ce que vous décrivez (ils devraient vraiment mettre cette fonctionnalité en mode org):

(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) l'appellera-t-il chaque fois que vous basculerez une case à cocher.

Cela nécessite que vous ayez un cookie de statistiques (la chose que vous obtenez avec [/]ou [%]ensuite C-c C-c) dans l'en-tête.

Inops
la source
1
Avez-vous une version qui, lorsque TODO est programmé pour se répéter, décoche à nouveau la liste de contrôle pour la planification? :)
ctietze
0

Je voulais une version qui fasse ce que @ctietze recherche - basculer l'état de la case à cocher pour les éléments de la liste de contrôle. J'ai essayé d'appeler org-reset-checkbox-state-subtreemais j'ai eu des erreurs concernant trop de trames imbriquées (j'utilise Spacemacs).

Voici ma solution de travail:

    (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
la source