Как автоматически настроить состояние задачи Org с ее дочерними флажками

10

У меня есть несколько задач в моем файле Org, одна из которых имеет элементы, начинающиеся с флажка (но только те). Все они имеют статистический файл cookie в конце ([n / m]).

Я ищу способ автоматического обновления родительской задачи, TODOчтобы DONEвсе флажки были помечены как выполненные.

Документация гласит:

Если вы хотите, чтобы запись TODO автоматически изменялась на ГОТОВО, когда все дочерние элементы сделаны, вы можете использовать следующую настройку [...]

Другой возможностью является использование флажков для идентификации (иерархии) большого количества подзадач (см. Флажки).

Насколько я понимаю, последняя часть состоит в том, что если дочерние элементы являются флажками, родительское состояние уже должно автоматически обновляться (что не так).

Что мне не хватает?


Редактировать:

Из org-after-todo-statistics-hookдокументации (org.el):

Хук, который вызывается после обновления файла cookie статистики TODO. Каждая функция вызывается с двумя аргументами: количество незавершенных записей и количество выполненных записей.

Это означает, что предложенный код от 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)

не будет считать элементы флажка.

Матье Маркес
источник
У вас есть файл статистики в заголовке? Как это:* Heading [0/1]
erikstokes
Да, есть. Забыл упомянуть, что немного мой плохой.
Матье Маркес
1
Я думаю, что это недоразумение происходит из-за того, что руководство организации не очень ясно в этом случае. Строка, которая начинается «Другая возможность - это использование флажков ...» - это новый абзац под заголовком «Разбиение задач на подзадачи». Я думаю, что «другая возможность» в данном случае относится к другой возможности разбивать задачи на подзадачи, а не к другой возможности автоматического изменения состояния TODO. Может быть, попробовать их предложенную функцию и подключить (хотя я не мог получить это в вокре)
одиннадцатое
@elethan Это действительно имеет смысл, я думаю. Да, см. Мои правки :)
Матье Маркес

Ответы:

6

Как вы упомянули в обновленном вопросе, org-after-todo-statistics-hookэто не то, что вы хотите. То, что вы хотите org-checkbox-statistics-hook.

Я использую эту функцию, чтобы сделать то, что вы описываете (они действительно должны включить эту функцию в org-mode):

(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) будет ли он вызывать его каждый раз, когда вы переключаете флажок.

Для этого требуется, чтобы у вас был файл статистики (то, что вы получаете [/]или [%]затем C-c C-c) в заголовке.

Inops
источник
1
Есть ли у вас версия, которая, когда запланировано повторение TODO, снова снимает контрольный список для планирования? :)
ctietze
0

Я хотел версию, которая делает то, что ищет @ctietze - переключение состояния флажка для элементов в контрольном списке. Я попытался позвонить, org-reset-checkbox-state-subtreeно получил ошибки о слишком много вложенных кадров (я использую Spacemacs).

Вот мое рабочее решение:

    (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
источник