org: Làm thế nào để sắp xếp các tiêu đề theo TODO và sau đó theo mức độ ưu tiên?


24

Tôi thường có một danh sách như thế này:

* 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

Trước tiên tôi muốn sắp xếp nó theo từ nhiệm vụ 'TODO'. Sau đó, các mục bên trong TODO được sắp xếp tôi muốn sắp xếp theo mức độ ưu tiên. (sau đó sẽ rất tốt nếu sắp xếp thêm theo "Nỗ lực").

Và ý tôi là hiện tại tôi có thể nhấp vào tiêu đề chính và sắp xếp những đứa trẻ đã được ưu tiên hoặc theo từ khóa todo, nhưng không phải cả hai.

Là sắp xếp theo cả hai có thể như chiến lược sắp xếp?


Hiện tại tôi có hai tiêu đề

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

Nhưng vấn đề với cách tiếp cận này là tôi phải liên tục xáo trộn các nhiệm vụ xung quanh khi tôi hoàn thành chúng.

[EDIT]
Điều này tương tự như thế này ngoại trừ việc tôi không thể hiểu câu trả lời của anh ấy để chuyển nó theo nhu cầu của mình?


1
Hàm org-sort-entriesnày sẽ hoạt động trên một tiêu đề chính cho tất cả các tiêu đề phụ hoặc nó có thể sắp xếp những gì trong một khu vực được chọn. Có các tùy chọn tương tác để bạn lựa chọn. Bạn cũng có thể sử dụng nó theo cách lập trình, và một số loại có thể - tôi thường sử dụng a, o, p, t (lần lượt sau để hoàn thành 4 cấp độ của tiêu chí sắp xếp). Ví dụ: bạn có thể sắp xếp mọi thứ trước bằng chữ cái, sau đó theo từ khóa, sau đó theo mức độ ưu tiên và sau đó theo thời gian.
luật

Xin chào, tôi biết về tùy chọn org-sort-entry để sắp xếp các tác vụ con. Tôi đã cập nhật câu hỏi để phản ánh tốt hơn điều đó. Cảm ơn bình luận của bạn.
Leo Ufimtsev

Đây là một liên kết đến một cách tiếp cận chi tiết để sắp xếp bộ đệm chế độ org theo chương trình: stackoverflow.com/a/22232709/2112361
luật

Tôi có liên kết này trong câu hỏi của tôi rồi. Trên đây là phù hợp với nhu cầu cụ thể của một ai đó. Có một mục đích chung hơn / cách tiếp cận dễ dàng hơn?
Leo Ufimtsev

1
@LeoUfimtsev Hãy thử cài đặt org-refile-targetsthành một cái gì đó như (setq org-refile-targets '((nil . (:maxlevel . 6)))). Điều đó sẽ làm org-modecho các tiêu đề chương trình lên đến độ sâu 6 khi nạp lại. Bạn có thể kiểm tra tài liệu org-refile-targetsđể biết thêm thông tin.
itjeyd

Câu trả lời:


19

Sẽ thật tuyệt nếu có một cái gì đó tương tự như org-agenda-sorting-stratagyvậy hoạt động org-sort-entries, nhưng dường như không có. Chúng ta có thể giả mạo nó vì org-sort-entriescó thể lấy một đối số chỉ định một hàm gán khóa (chuỗi hoặc số) cho mỗi tiêu đề, sẽ được sử dụng để sắp xếp các mục khi ?floại sắp xếp được đưa ra. Tất cả những gì chúng ta phải làm là lấy một chuỗi cho các thuộc tính TODO và PRIORITY. Bí quyết là chúng tôi muốn sắp xếp thuộc tính TODO theo vị trí của nó org-todo-keywordschứ không phải theo thứ tự abc.

(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-entriessẽ sắp xếp theo từ khóa TODO và phá vỡ mối quan hệ với ƯU TIÊN (sử dụng org-default-prioritykhi không có ưu tiên nào). Điều này sẽ phá vỡ nếu bạn có hơn 1000 từ khóa TODO, đó là một lý do tốt để không làm điều đó.


Omg, cảm ơn bạn cho kịch bản. Một vấn đề: Tôi đã cài đặt dấu gạch ngang. Sau đó đã thử tập lệnh, nhưng tôi gặp lỗi: Định nghĩa biểu tượng là void: todo-to-int. Tôi đoán bạn có chức năng đó ở đâu đó trong tệp .emacs của bạn nhưng quên bao gồm ở trên? hoặc có thể một số lỗi đánh máy?
Leo Ufimtsev

Tôi đã thay đổi chức năng chuyển đổi từ khóa thành int thành todo-to-intsau khi tôi đã dán vào câu trả lời của mình. Bây giờ nó đã được sửa.
erikstokes

1
Bây giờ tất cả các công trình. Anh bạn, cảm ơn vì tất cả nỗ lực của bạn, đánh giá rất cao :-D.
Leo Ufimtsev

1
NB: Không còn khuyến cáo sử dụng cl theo tài liệu .
cammil

1

Thêm vào đây vào tập tin của bạn:

#+ARCHIVE: :: * Completed.

Và xáo trộn trở thành lưu trữ

Thay vì sắp xếp các mục, làm thế nào về một khung nhìn được sắp xếp?

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

Hạn chế nó vào tập tin hiện tại với <. Bạn có thể đánh dấu XONG và lưu trữ từ chế độ xem được sắp xếp.


1

Bạn cũng có thể định nghĩa một org-agenda-cmp-user-definedhàm và thêm nó vào org-agenda-sorting-strategy. Đây là một ví dụ tôi tạo ra.

(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

Bạn có thể sử dụng thư viện này do tôi tạo: https://github.com/felipelalli/org-sort-t task

Nó sử dụng thuật toán Sắp xếp hợp nhất bằng cách hỏi người dùng nếu một tác vụ A quan trọng hơn B, và sau đó xây dựng một danh sách được sắp xếp.


Bạn có thể thêm một số mô tả về những gì nó làm, và đặc biệt là nó khác với các câu trả lời khác như thế nào.
Andrew Swann

Nó sử dụng thuật toán Sắp xếp hợp nhất bằng cách hỏi người dùng nếu một tác vụ A quan trọng hơn B, và sau đó xây dựng một danh sách được sắp xếp.
Felipe
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.