Cách tự động điều chỉnh trạng thái tác vụ của Org với các hộp kiểm con của nó


10

Tôi có một số tác vụ trong tệp Org của mình, một trong số đó có các mục bắt đầu bằng hộp kiểm (nhưng chỉ các mục đó). Tất cả họ đều có một cookie thống kê ở cuối ([n / m]).

Tôi đang tìm kiếm một cách để tự động cập nhật các nhiệm vụ phụ huynh TODOđến DONEkhi tất cả các hộp kiểm được đánh dấu là thực hiện là tốt.

Các tài liệu nói:

Nếu bạn muốn một mục TODO tự động thay đổi thành XONG khi tất cả trẻ em đã hoàn tất, bạn có thể sử dụng cài đặt sau [...]

Một khả năng khác là việc sử dụng các hộp kiểm để xác định (một hệ thống phân cấp) một số lượng lớn các nhiệm vụ (xem Hộp kiểm).

Cách tôi hiểu rằng phần cuối cùng là nếu các mục con là hộp kiểm, trạng thái cha mẹ đã được cập nhật tự động (không phải là trường hợp này).

Tôi đang thiếu gì?


Biên tập:

Từ org-after-todo-statistics-hooktài liệu của (org.el):

Hook được gọi sau khi cookie thống kê TODO đã được cập nhật. Mỗi hàm được gọi với hai đối số: số lượng mục chưa hoàn thành và số lượng mục được thực hiện.

Điều đó có nghĩa là mã được đề xuất từ ​​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)

sẽ không đếm các mục hộp kiểm.


Bạn có một cookie thống kê trong tiêu đề? Như thế này:* Heading [0/1]
erikstokes

Có, có. Quên đề cập đến bit xấu của tôi.
Mathieu Marques

1
Tôi nghĩ rằng sự hiểu lầm này đến từ hướng dẫn sử dụng org không quá rõ ràng trong trường hợp này. Dòng bắt đầu "Một khả năng khác là việc sử dụng các hộp kiểm ..." là một đoạn mới dưới tiêu đề "Phân chia nhiệm vụ thành các nhiệm vụ". Tôi nghĩ rằng "một khả năng khác" trong trường hợp này là đề cập đến một khả năng khác để chia các nhiệm vụ thành các nhiệm vụ không phải là một khả năng khác để tự động thay đổi trạng thái TODO. Có thể thử chức năng và móc đề xuất của họ (mặc dù tôi không thể hiểu điều này với wokr)
elethan

@elethan Nó thực sự có ý nghĩa, tôi đoán. Có xem bản chỉnh sửa của tôi :)
Mathieu Marques

1
Đây là một câu hỏi thường gặp .
NickD

Câu trả lời:


6

Như bạn đã đề cập trong câu hỏi cập nhật của bạn, org-after-todo-statistics-hookkhông phải là những gì bạn muốn. Những gì bạn muốn là org-checkbox-statistics-hook.

Tôi sử dụng chức năng này để làm những gì bạn mô tả (họ thực sự nên đưa chức năng này vào chế độ 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) nó sẽ gọi nó mỗi khi bạn chuyển một hộp kiểm.

Nó yêu cầu bạn phải có cookie thống kê (thứ bạn nhận được [/]hoặc [%]sau đó C-c C-c) trong tiêu đề.


1
Bạn có tình cờ có một phiên bản mà khi TODO được lên lịch để lặp lại, bỏ chọn danh sách kiểm tra để lập lịch lại không? :)
ctietze

0

Tôi muốn có một phiên bản thực hiện những gì @ctietze đang tìm kiếm - chuyển trạng thái hộp kiểm cho các mục trong danh sách kiểm tra. Tôi đã thử gọi org-reset-checkbox-state-subtreenhưng gặp lỗi về quá nhiều khung lồng nhau (Tôi đang sử dụng Spacemacs).

Đây là giải pháp làm việc của tôi:

    (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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.