Cara menyesuaikan status tugas Organisasi secara otomatis dengan kotak centang anak-anaknya

10

Saya memiliki beberapa tugas dalam file Org saya, salah satunya memiliki item yang dimulai dengan kotak centang (tetapi hanya itu). Mereka semua memiliki cookie statistik pada akhirnya ([n / m]).

Saya sedang mencari cara untuk secara otomatis memperbarui tugas induk dari TODOhingga DONEsetelah semua kotak centang ditandai sebagai selesai juga.

Dokumentasi mengatakan:

Jika Anda ingin entri TODO secara otomatis berubah menjadi SELESAI ketika semua anak selesai, Anda dapat menggunakan pengaturan berikut [...]

Kemungkinan lain adalah penggunaan kotak centang untuk mengidentifikasi (hierarki) sejumlah besar subtugas (lihat Kotak Centang).

Cara saya memahami bagian terakhir adalah bahwa jika item anak-anak adalah kotak centang, status induk harus sudah diperbarui secara otomatis (yang tidak demikian halnya).

Apa yang saya lewatkan?


Edit:

Dari org-after-todo-statistics-hookdokumentasi (org.el):

Hook yang dipanggil setelah cookie statistik TODO telah diperbarui. Setiap fungsi disebut dengan dua argumen: jumlah entri yang belum selesai dan jumlah entri yang sudah selesai.

Yang berarti bahwa kode yang diusulkan dari 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)

tidak akan menghitung item kotak centang.

Mathieu Marques
sumber
Apakah Anda memiliki cookie statistik dalam tajuk utama? Seperti ini:* Heading [0/1]
erikstokes
Ya ada. Lupa menyebutkan itu sedikit buruk saya.
Mathieu Marques
1
Saya pikir kesalahpahaman ini berasal dari manual org yang tidak begitu jelas dalam kasus ini. Baris yang dimulai "Kemungkinan lain adalah penggunaan kotak centang ..." adalah paragraf baru di bawah tajuk "Memecah tugas menjadi subtugas". Saya pikir "kemungkinan lain" dalam hal ini mengacu pada kemungkinan lain untuk memecah tugas menjadi subtugas, bukan kemungkinan lain untuk secara otomatis mengubah status TODO. Mungkin mencoba fungsi dan kail yang disarankan (meskipun saya tidak bisa mendapatkan ini untuk wokr)
elethan
@elethan Sebenarnya masuk akal, kurasa. Ya lihat edit saya :)
Mathieu Marques
1
Ini adalah FAQ .
NickD

Jawaban:

6

Seperti yang Anda sebutkan dalam pertanyaan Anda yang diperbarui, org-after-todo-statistics-hookbukan yang Anda inginkan. Yang Anda inginkan adalah org-checkbox-statistics-hook.

Saya menggunakan fungsi ini untuk melakukan apa yang Anda gambarkan (mereka harus benar-benar mendapatkan fungsi ini ke mode-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) apakah itu akan memanggilnya setiap kali Anda mengaktifkan kotak centang.

Itu mengharuskan Anda memiliki cookie statistik (hal yang Anda dapatkan dengan [/]atau [%]kemudian C-c C-c) di header.

Inops
sumber
1
Apakah Anda memiliki versi yang, ketika TODO dijadwalkan untuk mengulangi, hapus centang pada daftar periksa untuk penjadwalan lagi? :)
beri nomor
0

Saya ingin versi yang sesuai dengan yang dicari @ctietze - aktifkan status kotak centang untuk item dalam daftar centang. Saya mencoba menelepon org-reset-checkbox-state-subtreetetapi mendapatkan kesalahan tentang terlalu banyak frame bersarang (Saya menggunakan Spacemacs).

Inilah solusi kerja saya:

    (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)
Wesley
sumber