Come regolare automaticamente lo stato di un'attività dell'organizzazione con le caselle di controllo secondarie


10

Ho diversi compiti nel mio file Org, uno dei quali ha elementi che iniziano con una casella di controllo (ma solo quelli). Tutti hanno un cookie statistico alla fine ([n / m]).

Sto cercando un modo per aggiornare automaticamente l'attività principale da TODOa DONEquando tutte le caselle di controllo sono contrassegnate come completate.

La documentazione dice:

Se desideri che una voce TODO cambi automaticamente in FATTO al termine di tutti i bambini, puoi utilizzare la seguente configurazione [...]

Un'altra possibilità è l'uso delle caselle di controllo per identificare (una gerarchia di) un gran numero di attività secondarie (vedere Caselle di controllo).

Il modo in cui capisco che l'ultima parte è che se gli elementi figlio sono caselle di controllo, lo stato genitore dovrebbe già essere automaticamente aggiornato (che non è il caso).

Cosa mi sto perdendo?


Modificare:

Dalla org-after-todo-statistics-hookdocumentazione (org.el):

Hook chiamato dopo che un cookie statistico TODO è stato aggiornato. Ogni funzione viene chiamata con due argomenti: il numero di voci non completate e il numero di voci completate.

Ciò significa che il codice proposto da 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)

non conterà gli elementi della casella di controllo.


Hai un cookie statistico nel titolo? In questo modo:* Heading [0/1]
erikstokes il

Si C'è. Ho dimenticato di menzionare quel po 'il mio male.
Mathieu Marques,

1
Penso che questo malinteso provenga dal manuale dell'org non essere così chiaro in questo caso. La riga che inizia "Un'altra possibilità è l'uso delle caselle di controllo ..." è un nuovo paragrafo sotto l'intestazione "Suddivisione delle attività in sottoattività". Io penso che "un'altra possibilità" in questo caso si riferisce ad un'altra possibilità per rompere le attività in sottoattività non un'altra possibilità per cambiare automaticamente lo stato TODO. Forse prova la loro funzione suggerita e hook (anche se non riuscivo a convincerlo a wokr)
elethan

@elethan In realtà ha senso, immagino. Sì, vedi la mia modifica :)
Mathieu Marques,

1
Questa è una FAQ .
NickD

Risposte:


6

Come hai accennato nella tua domanda aggiornata, org-after-todo-statistics-hooknon è quello che vuoi. Quello che vuoi è org-checkbox-statistics-hook.

Uso questa funzione per fare ciò che descrivi (dovrebbero davvero portare questa funzionalità in modalità 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) lo chiamerà ogni volta che si attiva / disattiva una casella di controllo.

Richiede di avere un cookie statistico (la cosa con cui si ottiene [/]o [%]quindi C-c C-c) nell'intestazione.


1
Ti capita di avere una versione che, quando TODO è programmato per ripetere, deseleziona nuovamente l'elenco di controllo per la pianificazione? :)
ctietze,

0

Volevo una versione che fa ciò che @ctietze sta cercando: attiva / disattiva lo stato della casella di controllo per gli elementi nell'elenco di controllo. Ho provato a chiamare org-reset-checkbox-state-subtreema ho ricevuto errori su troppi frame nidificati (sto usando Spacemacs).

Ecco la mia soluzione di lavoro:

    (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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.