org: Bagaimana cara mengurutkan judul dengan TODO dan kemudian berdasarkan prioritas?

24

Saya sering memiliki daftar seperti ini:

* 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

Saya ingin mengurutkannya sesuai dengan taskword 'TODO' terlebih dahulu. Kemudian barang-barang di dalam TODO yang diurutkan saya ingin mengurutkan berdasarkan prioritas. (Maka akan menyenangkan untuk mengurutkan lebih lanjut dengan "Usaha").

Dan maksud saya saat ini saya dapat mengklik tajuk utama dan mengurutkan anak-anak dengan prioritas atau dengan kata kunci, tetapi tidak keduanya.

Apakah mengurutkan berdasarkan keduanya mungkin seperti strategi sortir?


Saat ini saya memiliki dua judul

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

Tetapi masalah dengan pendekatan ini adalah bahwa saya harus terus-menerus mengacak tugas ketika saya menyelesaikannya.

[EDIT]
Ini agak mirip dengan ini, kecuali bahwa saya tidak bisa memahami jawabannya untuk mentransfernya ke kebutuhan saya?

Leo Ufimtsev
sumber
1
Fungsi ini org-sort-entriesakan bertindak pada tajuk utama untuk semua subjudul, atau dapat mengurutkan apa yang ada di wilayah yang dipilih. Ada opsi interaktif untuk Anda pilih. Anda secara terprogram dapat menggunakannya juga, dan beberapa macam dimungkinkan - Saya sering menggunakan a, o, p, t (satu demi satu untuk mencapai 4 level kriteria penyortiran). Misalnya, Anda dapat mengurutkan semuanya terlebih dahulu berdasarkan abjad, lalu dengan kata kunci, lalu berdasarkan prioritas, lalu menurut waktu.
hukum
Halo, saya mengetahui opsi org-sort-entries untuk mengurutkan tugas anak. Saya telah memperbarui pertanyaan agar lebih mencerminkan hal itu. Terima kasih atas komentarmu.
Leo Ufimtsev
Berikut ini tautan ke pendekatan terperinci untuk menyortir buffer mode-org secara terprogram: stackoverflow.com/a/22232709/2112489
hukum
Saya sudah memiliki tautan ini di pertanyaan saya. Di atas agak disesuaikan dengan kebutuhan spesifik seseorang. Apakah ada tujuan yang lebih umum / pendekatan yang lebih mudah?
Leo Ufimtsev
1
@LeoUfimtsev Coba atur org-refile-targetssesuatu seperti (setq org-refile-targets '((nil . (:maxlevel . 6)))). Itu akan membuat org-modejudul tajuk hingga kedalaman 6 saat refiling. Anda dapat memeriksa dokumentasi untuk org-refile-targetsinformasi lebih lanjut.
itsjeyd

Jawaban:

19

Akan lebih bagus jika ada sesuatu seperti org-agenda-sorting-stratagyitu bekerja dengan baik org-sort-entries, tetapi sepertinya tidak ada. Kami dapat memalsukannya karena org-sort-entriesdapat mengambil argumen yang menetapkan fungsi yang menetapkan kunci (string atau angka) untuk setiap judul, yang akan digunakan untuk mengurutkan entri ketika ?fjenis penyortiran diberikan. Yang harus kita lakukan adalah mendapatkan string untuk properti TODO dan PRIORITY. Kuncinya adalah kita ingin menyortir properti TODO berdasarkan posisinya org-todo-keywords, bukan berdasarkan abjad.

(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-entriesakan mengurutkan berdasarkan kata kunci TODO dan memutuskan hubungan dengan PRIORITY (menggunakan org-default-priorityketika tidak ada prioritas diberikan). Ini akan rusak jika Anda memiliki lebih dari 1000 kata kunci TODO, yang merupakan alasan bagus untuk tidak melakukannya.

erikstokes
sumber
Omg, terima kasih atas skripnya. Masalah: Saya memasang tanda hubung. Kemudian mencoba skrip, tapi saya mendapatkan kesalahan: Definisi simbol tidak berlaku: todo-to-int. Saya kira Anda memiliki fungsi itu di suatu tempat di file .emacs Anda tetapi lupa memasukkan di atas? atau mungkin salah ketik?
Leo Ufimtsev
Saya mengubah fungsi yang mengubah kata kunci menjadi int menjadi todo-to-intsetelah saya menempelkan jawaban saya. Sudah diperbaiki sekarang.
erikstokes
1
Sekarang semua berfungsi. Bung, terima kasih atas semua usaha Anda, sangat dihargai :-D.
Leo Ufimtsev
1
NB: Tidak lagi direkomendasikan untuk menggunakan cl menurut dokumen .
cammil
1

Tambahkan yang berikut ke file Anda:

#+ARCHIVE: :: * Completed.

Dan menyeret menjadi pengarsipan

Daripada mengurutkan entri, bagaimana dengan tampilan yang diurutkan?

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

Batasi ke file saat ini dengan <. Anda dapat menandai DIBUAT dan arsipkan dari tampilan yang diurutkan.

Anak seorang Gnu
sumber
1

Anda juga dapat mendefinisikan org-agenda-cmp-user-definedfungsi dan menambahkannya ke org-agenda-sorting-strategy. Ini yang saya buat sebagai contoh.

(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)
Prgrm.celeritas
sumber
1

Anda dapat menggunakan perpustakaan ini yang dibuat oleh saya: https://github.com/felipelalli/org-sort-tasks

Ini menggunakan Gabung Urut algo dengan meminta pengguna jika tugas A lebih penting daripada B, dan kemudian membangun daftar diurutkan.

Felipe
sumber
Bisakah Anda menambahkan beberapa deskripsi tentang apa yang dilakukannya, dan khususnya bagaimana perbedaannya dari jawaban yang lain.
Andrew Swann
Ini menggunakan Gabung Urut algo dengan meminta pengguna jika tugas A lebih penting daripada B, dan kemudian membangun daftar diurutkan.
Felipe