org: วิธีเรียงลำดับส่วนหัวตาม TODO แล้วตามลำดับความสำคัญได้อย่างไร


24

ฉันมักจะมีรายการเช่นนี้:

* Main heading
** TODO [#A] Make world better
** TODO [#B] Make Emacs better 
** TODO [#B] Customize emacs 
** DONE [#C] some task
** TODO [#A] Launch rocket to mars

ฉันต้องการเรียงลำดับตาม taskword ของ 'คำแรก' จากนั้นรายการต่าง ๆ ใน TODO เรียงฉันต้องการเรียงลำดับความสำคัญ (จากนั้นจะเป็นการดีหากต้องการจัดเรียงเพิ่มเติมโดย "Effort")

และฉันหมายถึงในปัจจุบันฉันสามารถคลิกที่หัวข้อหลักและเรียงลำดับเด็ก ๆ ได้ตามลำดับความสำคัญหรือตามคำหลักที่ต้องทำ

การเรียงลำดับเป็นไปได้ทั้งสองอย่างเช่นการจัดเรียงกลยุทธ์หรือไม่?


ปัจจุบันฉันมีสองหัว

* Tasks
** TODO [#A] meh
** TODO [#B] meh2
* Completed.
** DONE [#B] meh3.

แต่ปัญหาของวิธีนี้คือฉันต้องสลับงานอย่างต่อเนื่องเมื่อฉันทำมันเสร็จ

[แก้ไข]
มันคล้ายกับนี้ยกเว้นว่าฉันไม่เข้าใจคำตอบของเขาที่จะถ่ายโอนไปยังความต้องการของฉัน?


1
ฟังก์ชั่นorg-sort-entriesจะทำหน้าที่ในหัวข้อหลักสำหรับหัวเรื่องย่อยทั้งหมดหรือสามารถเรียงลำดับสิ่งที่อยู่ในภูมิภาคที่เลือก มีตัวเลือกแบบโต้ตอบให้คุณเลือก คุณสามารถใช้โปรแกรมโดยใช้โปรแกรมและมีความเป็นไปได้หลายประเภท - ฉันมักจะใช้ a, o, p, t (หลังจากผ่านไปหนึ่งครั้งเพื่อให้บรรลุเกณฑ์การเรียงลำดับ 4 ระดับ) ตัวอย่างเช่นคุณสามารถจัดเรียงทุกอย่างเป็นลำดับแรกตามตัวอักษรตามด้วยคำหลักที่ต้องทำจากนั้นเรียงลำดับตามลำดับความสำคัญและตามเวลา
ฏหมาย

สวัสดีฉันทราบเกี่ยวกับตัวเลือกการเรียงลำดับรายการเพื่อจัดเรียงภารกิจย่อย ฉันได้อัปเดตคำถามเพื่อให้สะท้อนได้ดีขึ้น ขอบคุณสำหรับความคิดเห็นของคุณ.
Leo Ufimtsev

นี่คือลิงก์ไปยังวิธีการแบบละเอียดสำหรับการเรียงลำดับบัฟเฟอร์โหมดองค์กรโดยทางโปรแกรม: stackoverflow.com/a/22232709/2112489
lawlist

ฉันมีลิงค์นี้ในคำถามของฉันแล้ว ด้านบนนี้ปรับให้เหมาะกับความต้องการเฉพาะของบางคน มีวัตถุประสงค์ทั่วไป / แนวทางที่ง่ายขึ้นหรือไม่
Leo Ufimtsev

1
@LeoUfimtsev ลองตั้งค่าorg-refile-targetsเป็นอย่าง(setq org-refile-targets '((nil . (:maxlevel . 6))))อื่น ที่จะทำให้org-modeส่วนหัวของการแสดงสูงถึง 6 เมื่อทำการ refiling คุณสามารถตรวจสอบเอกสารorg-refile-targetsเพื่อขอข้อมูลเพิ่มเติมได้
itsjeyd

คำตอบ:


19

มันจะดีถ้ามีบางอย่างorg-agenda-sorting-stratagyที่เคยทำงานด้วยorg-sort-entriesแต่ดูเหมือนจะไม่เป็นเช่นนั้น เราสามารถปลอมมันได้เพราะorg-sort-entriesสามารถโต้แย้งที่ระบุฟังก์ชั่นการกำหนดคีย์ (สตริงหรือตัวเลข) ให้กับแต่ละส่วนหัวซึ่งจะใช้ในการเรียงลำดับรายการเมื่อ?fได้รับประเภทการเรียงลำดับ สิ่งที่เราต้องทำคือรับสตริงสำหรับคุณสมบัติ TODO และ PRIORITY เคล็ดลับคือเราต้องการเรียงลำดับคุณสมบัติสิ่งที่ต้องทำตามตำแหน่งorg-todo-keywordsไม่ใช่ตามลำดับตัวอักษร

(require 'cl)
(require 'dash)

(defun todo-to-int (todo)
    (first (-non-nil
            (mapcar (lambda (keywords)
                      (let ((todo-seq
                             (-map (lambda (x) (first (split-string  x "(")))
                                   (rest keywords)))) 
                        (cl-position-if (lambda (x) (string= x todo)) todo-seq)))
                    org-todo-keywords))))

(defun my/org-sort-key ()
  (let* ((todo-max (apply #'max (mapcar #'length org-todo-keywords)))
         (todo (org-entry-get (point) "TODO"))
         (todo-int (if todo (todo-to-int todo) todo-max))
         (priority (org-entry-get (point) "PRIORITY"))
         (priority-int (if priority (string-to-char priority) org-default-priority)))
    (format "%03d %03d" todo-int priority-int)
    ))

(defun my/org-sort-entries ()
  (interactive)
  (org-sort-entries nil ?f #'my/org-sort-key))

M-x my/org-sort-entriesจะจัดเรียงตามคำสำคัญสิ่งที่ต้องทำและทำลายความสัมพันธ์กับorg-default-priorityความสำคัญ(ใช้เมื่อไม่มีการให้ความสำคัญ) สิ่งนี้จะพังหากคุณมีคำหลักสิ่งที่ต้องทำมากกว่า 1,000 คำซึ่งเป็นเหตุผลที่ดีที่จะไม่ทำเช่นนั้น


โอ้พระเจ้าขอบคุณสำหรับสคริปต์ ปัญหา: ฉันติดตั้งเส้นประ จากนั้นลองใช้สคริปต์ แต่ฉันได้รับข้อผิดพลาด: การกำหนดสัญลักษณ์เป็นโมฆะ: todo-to-int ฉันจะเดาว่าคุณมีฟังก์ชันนั้นอยู่ที่ไหนสักแห่งในไฟล์. emacs ของคุณ แต่ลืมที่จะรวมไว้ในข้างต้น? หรือพิมพ์ผิดบางอย่าง?
Leo Ufimtsev

ฉันเปลี่ยนฟังก์ชั่นที่แปลงคำสำคัญให้เป็น int เป็นtodo-to-intหลังจากที่ฉันวางลงในคำตอบของฉัน ตอนนี้ได้รับการแก้ไขแล้ว
erikstokes

1
ตอนนี้ทำงานได้ทั้งหมด เพื่อนขอบคุณสำหรับความพยายามของคุณชื่นชมอย่างมาก :-D
Leo Ufimtsev

1
หมายเหตุ: ไม่แนะนำให้ใช้ cl ตามเอกสารอีกต่อไป
cammil

1

เพิ่มสิ่งต่อไปนี้ในไฟล์ของคุณ:

#+ARCHIVE: :: * Completed.

และการสับจะกลายเป็นการเก็บถาวร

แทนที่จะเรียงลำดับรายการวิธีการเกี่ยวกับมุมมองเรียง?

(setq org-agenda-custom-commands
      '(("cx" "TODOs sorted by state, priority, effort"
         todo "*"
         ((org-agenda-overriding-header "\nTODOs sorted by state, priority, effort")
          (org-agenda-sorting-strategy '(todo-state-down priority-down effort-up))))))

จำกัด <ไปยังแฟ้มปัจจุบันด้วย คุณสามารถทำเครื่องหมาย DONE และเก็บถาวรจากมุมมองที่เรียงลำดับ


1

คุณสามารถกำหนดorg-agenda-cmp-user-definedฟังก์ชั่นและเพิ่มเข้าไปorg-agenda-sorting-strategyได้ นี่คือสิ่งที่ฉันสร้างขึ้นเป็นตัวอย่าง

(setq org-todo-sort-order '("WAIT" "TODO" "DOING" "CANCELED" "DONE"))

(defun my:user-todo-sort (a b)
  "Sort todo based on which I want to see first"
  (when-let ((state-a (get-text-property 14 'todo-state a))
             (state-b (get-text-property 14 'todo-state b))
             (cmp (--map (cl-position-if (lambda (x)
                                           (equal x it))
                                         org-todo-sort-order)
                         (list state-a state-b))))
    (cond ((apply '> cmp) 1)
          ((apply '< cmp) -1)
          (t nil))))
(setq org-agenda-cmp-user-defined 'my:user-todo-sort)

1

คุณสามารถใช้ห้องสมุดนี้โดยฉัน: https://github.com/felipelalli/org-sort-tasks

มันใช้ Merge Sort algo โดยถามผู้ใช้ว่างาน A สำคัญกว่า B หรือไม่แล้วสร้างรายการที่เรียงลำดับ


คุณสามารถเพิ่มคำอธิบายบางอย่างเกี่ยวกับสิ่งนี้และโดยเฉพาะอย่างยิ่งความแตกต่างจากคำตอบอื่น ๆ
Andrew Swann

มันใช้ Merge Sort algo โดยถามผู้ใช้ว่างาน A สำคัญกว่า B หรือไม่แล้วสร้างรายการที่เรียงลำดับ
เฟลิเป้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.