org: Jak sortować nagłówki według TODO, a następnie według priorytetu?

24

Często mam taką listę:

* 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

Najpierw chciałbym posortować je według słowa zadania „DO ZROBIENIA”. Następnie elementy wewnątrz posortowanego TODO chciałbym posortować według priorytetu. (byłoby wtedy miło posortować według „Wysiłku”).

Mam na myśli, że obecnie mogę kliknąć główny nagłówek i posortować dzieci według priorytetu lub według słowa kluczowego do zrobienia, ale nie obu.

Czy sortowanie według obu jest możliwe jak strategia sortowania?


Obecnie mam dwa nagłówki

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

Problem z tym podejściem polega jednak na tym, że muszę ciągle tasować zadania po ich zakończeniu.

[EDYCJA]
Jest to trochę podobne do tego z tym wyjątkiem, że nie mogłem zrozumieć jego odpowiedzi, aby przenieść ją na moje potrzeby?

Lew Ufimcew
źródło
1
Funkcja org-sort-entriesbędzie działać albo na nagłówek główny dla wszystkich podtytułów, albo może sortować to, co znajduje się w wybranym regionie. Istnieją interaktywne opcje do wyboru. Możesz również programowo z niego korzystać, a kilka rodzajów jest możliwych - często używam a, o, p, t (jeden po drugim, aby osiągnąć 4 poziomy kryteriów sortowania). Na przykład możesz posortować wszystko najpierw według alfabetu, następnie według słów kluczowych do zrobienia, następnie według priorytetu, a następnie według czasu.
prawnik
Witaj, jestem świadomy opcji org-sort-wpisów do sortowania zadań potomnych. Zaktualizowałem pytanie, aby lepiej to odzwierciedlić. Dziękuję za Twój komentarz.
Leo Ufimcew
Oto link do szczegółowego podejścia do programowego sortowania bufora w trybie organizacji: stackoverflow.com/a/22232709/2112489
lista prawników
Mam już ten link w swoim pytaniu. Powyższe jest w pewnym sensie dostosowane do czyichś potrzeb. Czy istnieje bardziej ogólne / łatwiejsze podejście?
Leo Ufimcew
1
@LeoUfimtsev Spróbuj ustawić org-refile-targetscoś podobnego (setq org-refile-targets '((nil . (:maxlevel . 6)))). To sprawi, że org-modenagłówki pokażą się na głębokości 6 podczas uzupełniania. org-refile-targetsWięcej informacji można znaleźć w dokumentacji .
itsjeyd

Odpowiedzi:

19

Byłoby wspaniale, gdyby coś takiego org-agenda-sorting-stratagydziałało org-sort-entries, ale wydaje się, że tak nie jest. Możemy to sfałszować, ponieważ org-sort-entriesmożemy wziąć argument określający funkcję przypisującą klawisz (ciąg lub cyfrę) do każdego nagłówka, który będzie używany do sortowania wpisów, gdy ?fpodany zostanie typ sortowania. Wszystko, co musimy zrobić, to uzyskać ciąg właściwości TODO i PRIORYTET. Chodzi o to, że chcemy posortować właściwość TODO według jej pozycji org-todo-keywords, a nie alfabetycznie.

(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-entriesposortuje według słowa kluczowego TODO i zerwie więzi z PRIORYTETEM (używając, org-default-prioritygdy nie zostanie podany żaden priorytet). To się zepsuje, jeśli masz więcej niż 1000 słów kluczowych TODO, co jest dobrym powodem, aby tego nie robić.

erikstokes
źródło
Omg, dziękuję za skrypt. Problem: zainstalowałem deskę rozdzielczą. Potem wypróbowałem skrypt, ale pojawia się błąd: definicja symbolu jest nieważna: todo-to-int. Zgaduję, że masz tę funkcję gdzieś w swoim pliku .emacs, ale zapomniałeś uwzględnić w powyższym? a może literówka?
Leo Ufimcew
Zmieniłem funkcję, która konwertuje słowo kluczowe na int todo-to-intpo wklejeniu do mojej odpowiedzi. Teraz jest naprawione.
erikstokes
1
Teraz wszystko działa. Koleś, dziękuję za cały twój wysiłek, bardzo bardzo doceniany :-D.
Leo Ufimcew
1
Uwaga: Nie jest już zalecane używanie cl zgodnie z dokumentacją .
cammil
1

Dodaj następujące elementy do pliku:

#+ARCHIVE: :: * Completed.

I tasowanie staje się archiwizacją

Zamiast posortować wpisy, co powiesz na posortowany widok?

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

Ogranicz go do bieżącego pliku za pomocą <. Możesz oznaczyć GOTOWE i zarchiwizować z posortowanego widoku.

Syn GNU
źródło
1

Możesz także zdefiniować org-agenda-cmp-user-definedfunkcję i dodać ją do org-agenda-sorting-strategy. To ten, który stworzyłem jako przykład.

(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
źródło
1

Możesz skorzystać z utworzonej przeze mnie biblioteki: https://github.com/felipelalli/org-sort-tasks

Używa scalania Sortuj algo, pytając użytkownika, czy zadanie A jest ważniejsze niż B, a następnie buduje posortowaną listę.

Felipe
źródło
Czy możesz dodać opis tego, co to robi, a w szczególności, czym różni się od innych odpowiedzi?
Andrew Swann
Używa scalania Sortuj algo, pytając użytkownika, czy zadanie A jest ważniejsze niż B, a następnie buduje posortowaną listę.
Felipe