org: Come ordinare i titoli per TODO e quindi per priorità?


24

Ho spesso un elenco come questo:

* 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

Vorrei prima ordinarlo in base alla taskword "TODO". Quindi gli articoli all'interno del TODO ordinato vorrei ordinare per priorità. (sarebbe quindi piacevole ordinare ulteriormente per "Sforzo").

E intendo che attualmente posso fare clic sull'intestazione principale e ordinare i bambini già per priorità o per parola chiave, ma non per entrambi.

L'ordinamento per entrambi è possibile come una strategia di ordinamento?


Attualmente ho due titoli

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

Ma il problema con questo approccio è che devo costantemente mescolare i compiti quando li completo.

[EDIT]
Questo è un po 'simile a questo, tranne per il fatto che non potevo dare un senso alla sua risposta per trasferirla ai miei bisogni?


1
La funzione org-sort-entriesagirà su un'intestazione principale per tutte le sottovoci oppure può ordinare ciò che si trova in una regione selezionata. Ci sono opzioni interattive tra cui scegliere. Puoi anche usarlo a livello di programmazione e sono possibili diversi tipi: uso spesso a, o, p, t (uno dopo l'altro per raggiungere 4 livelli di criteri di ordinamento). Ad esempio, è possibile ordinare prima tutto in ordine alfabetico, quindi in base a parole chiave, quindi in ordine di priorità e in base al tempo.
elenco delle leggi

Ciao, sono a conoscenza dell'opzione org-sort-entry per ordinare le attività figlio. Ho aggiornato la domanda in modo da riflettere meglio ciò. Grazie per il tuo commento.
Leo Ufimtsev,

Ecco un link ad un approccio dettagliato per l'ordinamento un buffer org-mode di programmazione: stackoverflow.com/a/22232709/2112489
lawlist

Ho già questo link nella mia domanda. Quanto sopra è un po 'su misura per le esigenze specifiche di qualcuno. Esiste un approccio più generale / approccio più semplice?
Leo Ufimtsev,

1
@LeoUfimtsev Prova a impostare org-refile-targetsqualcosa di simile (setq org-refile-targets '((nil . (:maxlevel . 6)))). Ciò renderà le org-modeintestazioni degli spettacoli fino a una profondità di 6 durante il refiling. È possibile controllare la documentazione org-refile-targetsper ulteriori informazioni.
itsjeyd

Risposte:


19

Sarebbe bello se ci fosse qualcosa di simile con org-agenda-sorting-stratagycui lavorare org-sort-entries, ma non sembra esserci. Possiamo falsificarlo poiché org-sort-entriespossiamo prendere un argomento specificando una funzione che assegna una chiave (stringa o numero) a ciascuna intestazione, che verrà utilizzata per ordinare le voci quando ?fviene fornito il tipo di ordinamento. Tutto quello che dobbiamo fare è ottenere una stringa per le proprietà TODO e PRIORITY. Il trucco è che vogliamo ordinare la proprietà TODO in base alla sua posizione org-todo-keywords, non in ordine alfabetico.

(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-entriesordinerà per parola chiave TODO e romperà i legami con PRIORITY (usando org-default-priorityquando non viene data priorità). Questo si interromperà se hai più di 1000 parole chiave TODO, il che è una buona ragione per non farlo.


Oh mio Dio, grazie per la sceneggiatura. Un problema: ho installato il trattino. Quindi ho provato lo script, ma sto ricevendo un errore: la definizione del simbolo è nulla: todo-to-int. Immagino che tu abbia quella funzione da qualche parte nel tuo file .emacs ma hai dimenticato di includere in quanto sopra? o forse qualche errore di battitura?
Leo Ufimtsev,

Ho cambiato la funzione che converte una parola chiave in un int todo-to-intdopo aver incollato la mia risposta. Ora è riparato.
erikstokes,

1
Ora funziona tutto. Amico, grazie per tutti i tuoi sforzi, molto apprezzato MrGreen.
Leo Ufimtsev,

1
NB: non è più consigliabile utilizzare cl secondo i documenti .
cammil

1

Aggiungi quanto segue al tuo file:

#+ARCHIVE: :: * Completed.

E il mescolamento diventa l' archiviazione

Invece di ordinare le voci, che ne dici di una vista ordinata?

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

Limitare il file corrente con <. È possibile contrassegnare FATTO e archiviare dalla vista ordinata.


1

È inoltre possibile definire una org-agenda-cmp-user-definedfunzione e aggiungerla a org-agenda-sorting-strategy. Questo è quello che ho creato come esempio.

(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

Puoi utilizzare questa libreria creata da me: https://github.com/felipelalli/org-sort-tasks

Utilizza l'alge Merge Sort chiedendo all'utente se un'attività A è più importante di B, quindi crea un elenco ordinato.


Puoi aggiungere una descrizione di ciò che fa, e in particolare come differisce dalle altre risposte.
Andrew Swann,

Utilizza l'alge Merge Sort chiedendo all'utente se un'attività A è più importante di B, quindi crea un elenco ordinato.
Felipe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.