org: Başlıkları TODO'ya göre ve sonra önceliğe göre nasıl sıralayabilirim?


24

Sık sık böyle bir liste var:

* 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

Önce 'TODO' görev kelimesine göre sıralamak istiyorum. Sonra sıralanan TODO içindeki öğeler önceliğe göre sıralamak istiyorum. (daha sonra "Çaba" ile daha fazla sıralama yapmak güzel olurdu).

Ve şu anda ana başlığa tıklayabilir ve çocukları zaten öncelik sırasına göre veya todo anahtar kelimesine göre sıralayabilirim, ikisini birden değil.

Sıralama stratejisi gibi sıralama yapmak mümkün mü?


Şu anda iki başlığım var

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

Ancak bu yaklaşımla ilgili sorun, tamamladığımda sürekli görevleri karıştırmam gerektiğidir.

[DÜZENLE]
Bu kadar tür benzer bu onun cevabını duygusu benim ihtiyaçlarına aktarmak gelemedi dışında?


1
İşlev org-sort-entries, tüm alt başlıklar için ana başlık üzerinde hareket eder ya da seçilen bölgede ne olduğunu sıralayabilir. Seçebileceğiniz etkileşimli seçenekler var. Programlı olarak da kullanabilirsiniz ve birkaç çeşit mümkündür - sık sık a, o, p, t kullanırım (bir sonrakiden sonra 4 sıralama kriterini gerçekleştirmek için). Örneğin, her şeyi önce alfabetik olarak, ardından anahtar kelimeleri, sonra önceliğe ve sonra zamana göre sıralayabilirsiniz.
kanun listesi

Merhaba, alt görevleri sıralamak için org-sort-input seçeneğinin farkındayım. Sorunu daha iyi yansıtacak şekilde güncelledim. Yorumun için teşekkür ederim.
Leo Ufimtsev

Bir org modu arabelleğini programsal olarak sıralamak için detaylı bir yaklaşıma bir link: stackoverflow.com/a/22232709/2112489
lawlist

Benim sorumla zaten bu bağlantı var. Yukarıdaki tür birinin özel ihtiyaçlarına göre düzenlenmiştir. Daha genel bir amaç / daha kolay bir yaklaşım var mı?
Leo Ufimtsev

1
@LeoUfimtsev org-refile-targetsGibi bir şey ayarlamayı deneyin (setq org-refile-targets '((nil . (:maxlevel . 6)))). Bu, org-modeyeniden doldururken 6 derinliğine kadar gösteri başlıkları yapacaktır. Daha org-refile-targetsfazla bilgi için belgelere bakabilirsiniz .
Şubat'ta

Yanıtlar:


19

Gibi bir şey olsa daha iyi olurdu org-agenda-sorting-stratagyberaber çalışıyorduk org-sort-entries, ama orada görünmüyor. Sahte olabiliriz, çünkü org-sort-entriesher başlık için bir (string veya number) tuşu atanan bir fonksiyon belirten bir argüman alabilir, bu da ?fsıralama tipi verildiğinde girişleri sıralamak için kullanılacaktır . Tek yapmamız gereken TODO ve PRIORITY özellikleri için bir dize almak. İşin püf noktası, TODO özelliğini org-todo-keywordsalfabetik olarak değil , konumuyla sıralamak istiyoruz .

(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-entriesTODO anahtar sözcüğüne göre sıralar ve ÖNCELİK ile bağları koparır ( org-default-priorityöncelik verilmediğinde kullanır). Bu, 1000'den fazla TODO anahtar kelimeniz varsa kesilecektir, bu da bunu yapmamak için iyi bir nedendir.


Omg, senaryo için teşekkürler. Bir sorun: Ben çizgi kurdum. Sonra betiği denedim, ancak bir hata alıyorum: Sembol tanımı geçersiz: todo-to-int. Bu işlevin .emacs dosyanızda bir yerde olduğunu tahmin ediyorum ama yukarıdakileri de unuttum? ya da belki biraz yazım hatası?
Leo Ufimtsev

Anahtar kelimemi todo-to-intcevabımı yapıştırdıktan sonra bir int anahtarına dönüştüren işlevi değiştirdim . Şimdi düzeltildi.
erikstokes

1
Şimdi hepsi çalışıyor. Dostum, gayretlerin için teşekkür ederim, çok minnettarım :-D.
Leo Ufimtsev

1
Not: Artık dokümanlara göre cl kullanılması önerilmez .
cammil

1

Aşağıdakileri dosyanıza ekleyin:

#+ARCHIVE: :: * Completed.

Karıştırma arşivleme haline geldi

Girişleri sıralamak yerine, sıralı bir görünüme ne dersiniz?

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

Geçerli dosyayla ile sınırla <. DONE'yi ve arşivi sıralı görünümden işaretleyebilirsiniz.


1

Ayrıca bir org-agenda-cmp-user-definedfonksiyon tanımlayabilir ve ekleyebilirsiniz org-agenda-sorting-strategy. Örnek olarak yarattığım şey bu.

(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

Benim tarafımdan yapılan bu kütüphaneyi kullanabilirsiniz: https://github.com/felipelalli/org-sort-tasks

Bir görevin A'dan B'den daha önemli olup olmadığını sorarak Merge Sort algo'yu kullanır ve ardından sıralanmış bir liste oluşturur.


Bunun ne yaptığını ve özellikle diğer cevaplardan nasıl farklılaştığını açıklayabilir misiniz?
Andrew Swann

Bir görevin A'dan B'den daha önemli olup olmadığını sorarak Merge Sort algo'yu kullanır ve ardından sıralanmış bir liste oluşturur.
Felipe
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.