如何使用其子复选框自动调整组织任务状态


10

我的Org文件中有几个任务,其中一项包含以复选框开头的项目(但仅限于那些)。它们的末尾都有一个统计cookie([n / m])。

我正在寻找一种方法来自动更新父任务TODODONE一旦所有的复选框被标记为要做的事。

该文件说:

如果您希望所有孩子都完成后一个TODO条目自动更改为DONE,则可以使用以下设置[...]

另一种可能性是使用复选框来标识大量子任务(层次结构)(请参阅复选框)。

我了解的最后一部分是,如果子项是复选框,则父状态应该已经自动更新(事实并非如此)。

我想念什么?


编辑:

org-after-todo-statistics-hook的文档(org.el):

在更新TODO统计cookie后调用的挂钩。每个函数用两个参数调用:未完成的条目数和完成的条目数。

这意味着从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)

将不计算复选框项目。


您的标题中是否有统计信息Cookie?像这样:* Heading [0/1]
erikstokes

就在这里。忘了提那一点我的坏。
Mathieu Marques

1
我认为这种误解来自组织手册,在这种情况下还不是很清楚。以“另一种可能性是使用复选框...”开头的行是标题为“将任务分解为子任务”的新段落。我认为这种情况下的“另一种可能性”是指将任务分解为子任务的另一种可能性,而不是自动改变TODO状态的另一种可能性。也许尝试他们建议的功能并挂上钩(尽管我无法将其发送给wokr)
elethan

@elethan我想这实际上是有道理的。是的,请参阅我的编辑内容:)
Mathieu Marques

1
这是一个常见问题解答
NickD

Answers:


6

正如您在更新的问题中提到的,org-after-todo-statistics-hook不是您想要的。你想要的是org-checkbox-statistics-hook

我使用此功能执行您所描述的操作(它们应该确实使此功能进入组织模式):

(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在头)。


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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.