Como ajustar automaticamente um estado de tarefa da organização com seus filhos


10

Eu tenho várias tarefas no meu arquivo organizacional, uma das quais possui itens começando com uma caixa de seleção (mas somente aqueles). Todos eles têm um cookie estatístico no final ([n / m]).

Estou procurando uma maneira de atualizar automaticamente a tarefa pai de TODOpara DONEuma vez que todas as caixas de seleção também estejam marcadas como concluídas.

A documentação diz:

Se você deseja que uma entrada TODO mude automaticamente para DONE quando todas as crianças terminarem, você pode usar a seguinte configuração [...]

Outra possibilidade é o uso de caixas de seleção para identificar (uma hierarquia) um grande número de subtarefas (consulte Caixas de seleção).

Pelo que entendi, a última parte é que, se os itens filhos forem caixas de seleção, o estado pai já deverá ser atualizado automaticamente (o que não é o caso).

o que estou perdendo?


Editar:

Da org-after-todo-statistics-hookdocumentação (org.el):

Gancho chamado após a atualização de um cookie de estatísticas TODO. Cada função é chamada com dois argumentos: o número de entradas não concluídas e o número de entradas concluídas.

O que significa que o código proposto do 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)

não contará itens da caixa de seleção.


Você tem um cookie de estatísticas no título? Assim:* Heading [0/1]
erikstokes

Sim existe. Esqueci de mencionar que mordeu meu mal.
Mathieu Marques

11
Eu acho que esse mal-entendido vem do manual da organização, não sendo tão claro neste caso. A linha que inicia "Outra possibilidade é o uso de caixas de seleção ..." é um novo parágrafo sob o título "Dividindo tarefas em subtarefas". Eu acho que "outra possibilidade", neste caso, está se referindo a uma outra possibilidade para quebrar tarefas em subtarefas não outra possibilidade para mudar automaticamente o estado TODO. Talvez tente a sua função sugerido e gancho (embora eu não pudesse chegar a este wokr)
elethan

@elethan Na verdade, faz sentido, eu acho. Sim, veja minha edição :)
Mathieu Marques

11
Este é um FAQ .
11119 NickD

Respostas:


6

Como você mencionou na sua pergunta atualizada, org-after-todo-statistics-hooknão é o que você deseja. O que você quer é org-checkbox-statistics-hook.

Eu uso essa função para fazer o que você descreve (eles realmente devem colocar essa funcionalidade no modo organizacional):

(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) será chamado sempre que você alternar uma caixa de seleção.

Ele requer que você tem um cookie estatísticas (a coisa que você começa com [/]ou [%]então C-c C-c) no cabeçalho.


11
Você tem uma versão que, quando o TODO está programado para repetir, desmarca a lista de verificação do agendamento novamente? :)
ctietze

0

Eu queria uma versão que faça o que a @ctietze está procurando - alterne o estado da caixa de seleção para itens na lista de verificação. Tentei ligar, org-reset-checkbox-state-subtreemas obtive erros sobre muitos quadros aninhados (estou usando o Spacemacs).

Aqui está a minha solução de trabalho:

    (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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.