Як автоматично налаштувати стан завдання Org за допомогою своїх дітей


10

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

Я шукаю спосіб автоматично оновити батьківську задачу від TODOдо DONEраз все прапорці відзначені , як це зроблено , як добре.

Документація говорить:

Якщо ви хочете, щоб запис TODO автоматично змінився на DONE, коли всі діти виконані, ви можете скористатися наступними налаштуваннями [...]

Інша можливість полягає у використанні прапорців для ідентифікації (ієрархії) великої кількості підзадач (див. Поле прапорців).

Наскільки я розумію, що остання частина полягає в тому, що якщо дочірні елементи є прапорцями, батьківський стан вже має бути автоматично оновлений (що не так).

Що я пропускаю?


Редагувати:

З 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]
Ось так

Так, є. Забув згадати, що трохи погане.
Матьє Маркес

1
Я думаю, що це непорозуміння випливає з інструкції з організації, яка не є такою явною в цьому випадку. Рядок, який починається "Інша можливість - це використання прапорців ..." - це новий абзац під заголовком "Розбиття завдань на підзадачі". Я думаю, що "інша можливість" в цьому випадку - це посилання на іншу можливість розбиття завдань на підзадачі, а не інша можливість автоматичної зміни стану TODO. Можливо, спробуйте їх запропоновану функцію та гачок (хоча я не зміг отримати це на
wokr

@elethan Це насправді має сенс. Так, дивіться мою редакцію :)
Матьє Маркес

1
Це FAQ .
NickD

Відповіді:


6

Як ви згадували в оновленому запитанні, org-after-todo-statistics-hookце не те, що ви хочете. Те, що ти хочеш, так і є org-checkbox-statistics-hook.

Я використовую цю функцію, щоб робити те, що ви описуєте (вони повинні дійсно перетворити цю функціональність в режим 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) буде називати це щоразу, коли ви перемикаєте прапорець.

Це зажадає у вас є печиво статистика (річ ви отримуєте з [/]або [%]потім 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.