자식 확인란을 사용하여 조직 작업 상태를 자동으로 조정하는 방법


10

조직 파일에 몇 가지 작업이 있는데 그 중 하나에는 확인란으로 시작하는 항목이 있지만 그 중 하나만 있습니다. 모두 끝에 쿠키 쿠키가 있습니다 ([n / m]).

나는 자동에서 상위 타스크를 업데이트 할 수있는 방법을 찾고 있어요 TODODONE뿐만 아니라 수행으로 모든 확인란이 표시되면.

설명서는 다음과 같이 말합니다.

모든 하위 작업이 완료되면 TODO 항목이 자동으로 완료로 변경되도록하려면 다음 설정을 사용할 수 있습니다 ...]

또 다른 가능성은 확인란을 사용하여 많은 하위 작업을 식별하는 계층입니다 (확인란 참조).

마지막 부분을 이해하는 방법은 하위 항목이 확인란 인 경우 부모 상태가 이미 자동으로 업데이트되어야한다는 것입니다 (사례는 아님).

내가 무엇을 놓치고 있습니까?


편집하다:

에서 org-after-todo-statistics-hook의 설명서 (org.el) :

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

그렇습니다. 저의 나쁜 점을 언급하는 것을 잊었습니다.
Mathieu Marques

1
나는이 오해가 조직 매뉴얼에서 명확하지 않은 것으로 생각한다고 생각합니다. "또 다른 가능성은 확인란을 사용하는 것입니다."로 시작하는 줄은 "작업을 하위 작업으로 나누기"라는 제목 아래의 새로운 단락입니다. 나는 생각 이 경우 그 "또 다른 가능성은"하위 작업으로 작업을 깨는 또 다른 가능성을 언급하고 있지 자동으로 TODO 상태를 변경하기위한 또 다른 가능성. 어쩌면 그들의 제안 된 기능과 후크를 시도해보십시오 (물론 wokr에 도달 할 수는 없었습니다)
elethan

@elethan 실제로 의미가 있습니다. 네 내 편집 참조 :)
Mathieu Marques

1
이것은 FAQ 입니다.
NickD

답변:


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헤더를).


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.