子チェックボックスで組織タスクの状態を自動的に調整する方法


10

Orgファイルにはいくつかのタスクがあり、そのうちの1つはチェックボックスで始まる項目があります(ただし、それらのみです)。それらのすべてに、最後に統計Cookieがあります([n / m])。

私は、自動的に親タスクを更新する方法を探していますTODODONE同様に行うよう、チェックボックスのすべてがマークされると。

ドキュメントは言う:

すべての子が完了したときにTODOエントリを自動的にDONEに変更する場合は、次の設定を使用できます[...]

別の可能性は、チェックボックスを使用して多数のサブタスク(の階層)を識別することです(チェックボックスを参照)。

最後の部分で私が理解している方法は、子アイテムがチェックボックスの場合、親の状態は既に自動的に更新されているはずです(そうではありません)。

何が欠けていますか?


編集:

以下からorg-after-todo-statistics-hookのドキュメント(org.el):

TODO統計Cookieが更新された後に呼び出されるフック。各関数は、2つの引数で呼び出されます:未完了のエントリの数と完了したエントリの数。

つまり、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

はいあります。それが私の悪いことを言及するのを忘れていました。
Mathieu Marques

1
この誤解は、この場合、組織のマニュアルがあまり明確ではないことに起因していると思います。「別の可能性はチェックボックスの使用...」で始まる行は、「サブタスクへのタスクの分割」という見出しの下の新しい段落です。この場合の「別の可能性」とは、タスクをサブタスクに分割する別の可能性を指し、TODOの状態を自動的に変更する別の可能性ではない思います。多分それらの提案された機能とフックを試してください(これをwokrに取得できませんでした)
elethan

@elethanそれは実際に理にかなっていると思います。はい、私の編集を参照してください:)
Mathieu Marques

1
これはFAQです。
NickD

回答:


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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.