วิธีปรับสถานะงานขององค์กรโดยอัตโนมัติด้วยช่องทำเครื่องหมายย่อย


10

ฉันมีงานหลายอย่างในไฟล์ Org ของฉันซึ่งหนึ่งในนั้นมีรายการที่เริ่มต้นด้วยช่องทำเครื่องหมาย (แต่เฉพาะที่) พวกเขาทุกคนมีคุกกี้สถิติเมื่อสิ้นสุด ([n / m])

ฉันกำลังมองหาวิธีการปรับปรุงงานของผู้ปกครองโดยอัตโนมัติจากTODOไปDONEทุกครั้งของการทำเครื่องหมายในช่องทำเครื่องหมายเป็นทำได้เช่นกัน

เอกสารกล่าวว่า:

หากคุณต้องการให้รายการสิ่งที่ต้องทำเปลี่ยนเป็น DONE โดยอัตโนมัติเมื่อเด็ก ๆ เสร็จแล้วคุณสามารถใช้การตั้งค่าต่อไปนี้ [... ]

ความเป็นไปได้อีกอย่างหนึ่งคือการใช้ช่องทำเครื่องหมายเพื่อระบุ (ลำดับชั้นของ) งานย่อยจำนวนมาก (ดูที่ช่องทำเครื่องหมาย)

วิธีที่ฉันเข้าใจว่าส่วนสุดท้ายคือหากรายการเด็กเป็นช่องทำเครื่องหมายรัฐหลักควรได้รับการอัปเดตโดยอัตโนมัติแล้ว (ซึ่งไม่ใช่กรณี)

ฉันกำลังคิดถึงอะไร


แก้ไข:

จากorg-after-todo-statistics-hookเอกสารของ (org.el):

ตะขอที่เรียกว่าหลังจากคุกกี้สถิติสิ่งที่ต้องทำได้รับการปรับปรุง แต่ละฟังก์ชั่นถูกเรียกด้วยสองอาร์กิวเมนต์: จำนวนของรายการที่ไม่ได้ทำและจำนวนของรายการที่ทำ

ซึ่งหมายความว่ารหัสที่เสนอจาก 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
ฉันคิดว่าความเข้าใจผิดนี้มาจากคู่มือองค์กรไม่ชัดเจนในกรณีนี้ บรรทัดที่เริ่มต้น "ความเป็นไปได้อีกอย่างคือการใช้ช่องทำเครื่องหมาย ... " คือย่อหน้าใหม่ภายใต้หัวข้อ "การแบ่งภารกิจออกเป็นงานย่อย" ฉันคิดว่า "ความเป็นไปได้อีกอย่าง" ในกรณีนี้หมายถึงความเป็นไปได้อีกอย่างสำหรับการแบ่งงานเป็นงานย่อยไม่ใช่ความเป็นไปได้อีกอย่างสำหรับการเปลี่ยนสถานะสิ่งที่ต้องทำโดยอัตโนมัติ อาจจะลองฟังก์ชั่นปัญหาของพวกเขาและตะขอ (แม้ว่าฉันไม่สามารถได้รับนี้ใน WOKR)
elethan

@elethan มันทำให้รู้สึกจริงฉันเดา ใช่เห็นการแก้ไขของฉัน :)
Mathieu Marques

1
นี่คือคำถามที่พบบ่อย
NickD

คำตอบ:


6

ดังที่คุณพูดถึงในคำถามที่อัปเดตorg-after-todo-statistics-hookไม่ใช่สิ่งที่คุณต้องการ org-checkbox-statistics-hookสิ่งที่คุณต้องการคือ

ฉันใช้ฟังก์ชั่นนี้เพื่อทำสิ่งที่คุณอธิบาย (พวกเขาควรทำให้ฟังก์ชั่นนี้เข้าสู่โหมดองค์กร):

(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
คุณมีรุ่นที่เมื่อสิ่งที่ต้องทำมีกำหนดที่จะทำซ้ำยกเลิกการเลือกรายการตรวจสอบสำหรับการจัดตารางอีกครั้ง? :)
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.