Kuruluş görev durumunu alt öğeleriyle otomatik olarak ayarlama


10

Org dosyamda, bir onay kutusuyla başlayan öğeler (ancak yalnızca bunlar) olan birkaç görevim var. Hepsinin sonunda bir istatistik çerezi var ([n / m]).

Ben otomatik gelen ana görevi güncellemek için bir yol arıyorum TODOiçin DONEde tamam olarak onay kutularını tüm işaretlenmiştir kez.

Belgeler diyor ki:

Tüm çocuklar tamamlandığında bir TODO girişinin otomatik olarak YAPILDI olmasını istiyorsanız, aşağıdaki ayarları kullanabilirsiniz [...]

Başka bir olasılık, çok sayıda alt görevi tanımlamak (bir hiyerarşisi) için onay kutularının kullanılmasıdır (bkz. Onay Kutuları).

Son bölümün, alt öğelerin onay kutuları olması durumunda, üst durumun otomatik olarak güncellenmesi gerektiğidir (durum böyle değildir).

Neyi kaçırıyorum?


Düzenle:

Gönderen org-after-todo-statistics-hookbireyin belgelerinde (org.el):

Bir TODO istatistik çerezi güncellendikten sonra çağrılan kanca. Her fonksiyon iki argümanla çağrılır: yapılmayan kayıt sayısı ve yapılan kayıt sayısı.

Bu, orgmode.org'dan önerilen kodun anlamına gelir:

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

onay kutusu öğelerini saymaz.


Başlıkta bir istatistik çerezi var mı? * Heading [0/1]
Şunun

Evet var. O biraz benim kötü söz etmeyi unuttum.
Mathieu Marques

1
Sanırım bu yanlış anlama bu durumda bu kadar açık olmayan kuruluş kılavuzundan geliyor. "Başka bir olasılık onay kutularının kullanılması ..." ile başlayan satır, "Görevleri alt görevlere bölme" başlığı altında yeni bir paragraftır. Ben düşünüyorum bu durumda o "başka bir olasılık" alt görevler içine görevleri bozduğu için başka olasılık bahsediyor değil otomatik YAPILACAK durumunu değiştirmek için başka bir olasılık. Belki önerilen işlevlerini deneyin ve kanca (bunu wokr alamadım)
elethan

@elethan Sanırım anlamlıdır. Evet benim düzenlememi gör :)
Mathieu Marques

1
Bu bir SSS .
NickD

Yanıtlar:


7

Güncellenmiş sorunuzda belirttiğiniz gibi, org-after-todo-statistics-hookistediğiniz şey değil. Ne istiyorsun org-checkbox-statistics-hook.

Ben açıklamak ne yapmak için bu işlevi kullanın (onlar gerçekten bu işlevi org moduna almak gerekir):

(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) bir onay kutusunu her değiştirdiğinizde onu arayacak mı?

Başlıkta bir istatistik çerezi ( [/]ya da [%]sonra olsun şey) olmasını gerektirir C-c C-c.


1
TODO'nun tekrarlaması planlandığında, zamanlama için kontrol listesinin işaretini tekrar kaldıran bir sürümünüz var mı? :)
ctietze

0

@Ctietze'nin aradığını yapan bir sürüm istedim - kontrol listesindeki öğeler için onay kutusu durumunu değiştirin. Aramaya çalıştım org-reset-checkbox-state-subtreeama çok fazla iç içe çerçeveyle ilgili hatalar aldım (Boşluk kullanıyorum).

İşte benim çalışma çözümüm:

    (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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.