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.