org: Wie sortiere ich Überschriften nach TODO und dann nach Priorität?

24

Ich habe oft eine Liste wie diese:

* 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

Ich möchte es zuerst nach dem Taskword 'TODO' sortieren. Dann möchte ich die Artikel im sortierten TODO nach Priorität sortieren. (Es wäre dann schön, weiter nach "Aufwand" zu sortieren).

Und ich meine, momentan kann ich auf die Hauptüberschrift klicken und die Kinder bereits entweder nach Priorität oder nach Aufgaben-Schlüsselwort sortieren, aber nicht nach beiden.

Ist eine Sortierung nach beidem wie eine Sortierstrategie möglich?


Derzeit habe ich zwei Überschriften

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

Das Problem bei diesem Ansatz ist jedoch, dass ich ständig Aufgaben verschieben muss, wenn ich sie erledige.

[EDIT]
Dies ist ein bisschen ähnlich wie dies außer dass ich nicht Sinn seiner Antwort machen könnte es auf meine Bedürfnisse zu übertragen?

Leo Ufimtsev
quelle
1
Die Funktion org-sort-entrieswirkt entweder auf eine Hauptüberschrift für alle Unterüberschriften oder kann sortieren, was sich in einer ausgewählten Region befindet. Sie können zwischen interaktiven Optionen wählen. Sie können es auch programmgesteuert verwenden, und mehrere Sortierungen sind möglich - ich verwende oft a, o, p, t (eine nach der anderen, um 4 Ebenen von Sortierkriterien zu erreichen). Beispielsweise können Sie alles zuerst nach Alphabet, dann nach Aufgabenschlüsselwörtern, dann nach Priorität und dann nach Zeit sortieren.
Gesetzesliste
Hallo, mir ist die Option org-sort-entries bekannt, mit der untergeordnete Aufgaben sortiert werden können. Ich habe die Frage aktualisiert, um dies besser widerzuspiegeln. Danke für deinen Kommentar.
Leo Ufimtsev
Hier ist ein Link zu einer detaillierten Methode zum
lawlist
Ich habe diesen Link bereits in meiner Frage. Das oben Genannte ist irgendwie auf die spezifischen Bedürfnisse einer Person zugeschnitten. Gibt es einen allgemeineren / einfacheren Ansatz?
Leo Ufimtsev
1
@LeoUfimtsev Versuchen Sie die Einstellung org-refile-targetsauf etwas wie (setq org-refile-targets '((nil . (:maxlevel . 6)))). Das macht org-modeShow Schriften bis zu einer Tiefe von 6 , wenn erneuten Ablegen. org-refile-targetsWeitere Informationen finden Sie in der Dokumentation .
Es ist der

Antworten:

19

Es wäre toll, wenn so etwas org-agenda-sorting-stratagyfunktionieren würde org-sort-entries, aber es scheint nicht so zu sein. Wir können es vortäuschen, da org-sort-entriesein Argument verwendet werden kann, das eine Funktion angibt, die jeder Überschrift eine (Zeichenfolge oder Zahl) -Taste zuweist, die zum Sortieren der Einträge verwendet wird, wenn der ?fSortiertyp angegeben wird. Wir müssen nur einen String für die Eigenschaften TODO und PRIORITY abrufen. Der Trick ist, dass wir die TODO-Eigenschaft org-todo-keywordsnicht alphabetisch, sondern nach ihrer Position sortieren möchten .

(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-entriesSortiert nach dem TODO-Schlüsselwort und unterbricht die Bindung mit PRIORITY ( org-default-prioritywenn keine Priorität vergeben wird). Dies funktioniert nicht, wenn Sie mehr als 1000 TODO-Schlüsselwörter haben. Dies ist ein guter Grund, dies nicht zu tun.

erikstokes
quelle
Omg, danke für das Drehbuch. Ein Problem: Ich habe dash installiert. Dann habe ich das Skript ausprobiert, aber es wird eine Fehlermeldung angezeigt: Die Symboldefinition ist ungültig: todo-to-int. Ich nehme an, Sie haben diese Funktion irgendwo in Ihrer .emacs-Datei, haben aber vergessen, die oben genannten einzuschließen? oder vielleicht ein Tippfehler?
Leo Ufimtsev
Ich habe die Funktion geändert, die ein Schlüsselwort in ein int in konvertiert, todo-to-intnachdem ich es in meine Antwort eingefügt habe. Es ist jetzt behoben.
Erikstokes
1
Jetzt funktioniert alles. Alter, danke für all deine Mühen, sehr geschätzt :-D.
Leo Ufimtsev
1
NB: Es wird nicht länger empfohlen, cl gemäß den Dokumenten zu verwenden .
cammil
1

Fügen Sie Ihrer Datei Folgendes hinzu:

#+ARCHIVE: :: * Completed.

Und das Mischen wird zur Archivierung

Wie wäre es mit einer sortierten Ansicht, anstatt die Einträge zu sortieren?

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

Schränken Sie es mit auf die aktuelle Datei ein <. In der sortierten Ansicht können Sie FERTIG markieren und archivieren.

Sohn eines Gnus
quelle
1

Sie können auch eine org-agenda-cmp-user-definedFunktion definieren und hinzufügen org-agenda-sorting-strategy. Dies ist das, was ich als Beispiel erstellt habe.

(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
quelle
1

Sie können diese von mir erstellte Bibliothek verwenden: https://github.com/felipelalli/org-sort-tasks

Es verwendet den Algorithmus Sortieren zusammenführen, indem es den Benutzer fragt, ob eine Aufgabe A wichtiger ist als B, und dann eine sortierte Liste erstellt.

Felipe
quelle
Können Sie eine Beschreibung dessen hinzufügen, was dies bewirkt, und insbesondere, wie es sich von den anderen Antworten unterscheidet?
Andrew Swann
Sie verwendet den Algorithmus Sortieren zusammenführen, indem sie den Benutzer fragt, ob eine Aufgabe A wichtiger ist als B, und dann eine sortierte Liste erstellt.
Felipe