org: Comment trier les titres par TODO puis par priorité?

24

J'ai souvent une liste comme celle-ci:

* 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

Je voudrais d'abord le trier selon le mot de tâche 'TODO'. Ensuite, les éléments à l'intérieur du TODO trié, je voudrais trier par priorité. (il serait alors intéressant de trier davantage par "Effort").

Et je veux dire actuellement que je peux cliquer sur l'en-tête principal et trier les enfants déjà par priorité ou par mot clé todo, mais pas les deux.

Le tri par les deux est-il possible comme la stratégie de tri?


Actuellement, j'ai deux rubriques

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

Mais le problème avec cette approche est que je dois constamment mélanger les tâches lorsque je les termine.

[EDIT]
C'est un peu similaire à cela, sauf que je ne pouvais pas donner un sens à sa réponse pour la transférer à mes besoins?

Leo Ufimtsev
la source
1
La fonction org-sort-entriesagira soit sur un titre principal pour tous les sous-titres, soit elle pourra trier ce qui se trouve dans une région sélectionnée. Vous avez le choix entre des options interactives. Vous pouvez également l'utiliser par programme, et plusieurs sortes sont possibles - j'utilise souvent a, o, p, t (l'une après l'autre pour accomplir 4 niveaux de critères de tri). Par exemple, vous pouvez tout trier d'abord par ordre alphabétique, puis par todo mots-clés, puis par priorité, puis par heure.
lawlist
Bonjour, je connais l'option org-sort-entries pour trier les tâches enfants. J'ai mis à jour la question afin de mieux refléter cela. Merci pour votre commentaire.
Leo Ufimtsev
Voici un lien vers une approche détaillée pour trier un tampon en mode org par programmation: stackoverflow.com/a/22232709/2112489
lawlist
J'ai déjà ce lien dans ma question. Ce qui précède est un peu adapté aux besoins spécifiques de quelqu'un. Existe-t-il une approche plus générale / plus facile?
Leo Ufimtsev
1
@LeoUfimtsev Essayez de définir org-refile-targetsquelque chose comme (setq org-refile-targets '((nil . (:maxlevel . 6)))). Cela fera org-modeapparaître les titres jusqu'à une profondeur de 6 lors du rechargement. Vous pouvez consulter la documentation org-refile-targetspour plus d'informations.
itsjeyd

Réponses:

19

Ce serait formidable s'il y avait quelque chose comme org-agenda-sorting-stratagyça qui fonctionnait org-sort-entries, mais il ne semble pas y en avoir. Nous pouvons le simuler car nous org-sort-entriespouvons prendre un argument spécifiant une fonction attribuant une clé (chaîne ou numéro) à chaque en-tête, qui sera utilisée pour trier les entrées lorsque le ?ftype de tri est donné. Tout ce que nous avons à faire est d'obtenir une chaîne pour les propriétés TODO et PRIORITY. L'astuce est que nous voulons trier la propriété TODO par sa position dans org-todo-keywords, et non par ordre alphabétique.

(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-entriestriera par le mot clé TODO et rompra les liens avec PRIORITY (à utiliser org-default-prioritylorsqu'aucune priorité n'est donnée). Cela se cassera si vous avez plus de 1000 mots-clés TODO, ce qui est une bonne raison de ne pas le faire.

erikstokes
la source
Omg, merci pour le script. Un problème: j'ai installé dash. J'ai ensuite essayé le script, mais je reçois une erreur: la définition du symbole est vide: todo-to-int. Je suppose que vous avez cette fonction quelque part dans votre fichier .emacs, mais vous avez oublié d'inclure ce qui précède? ou peut-être une faute de frappe?
Leo Ufimtsev
J'ai changé la fonction qui convertit un mot clé en int todo-to-intaprès avoir collé dans ma réponse. C'est réparé maintenant.
erikstokes
1
Maintenant, tout fonctionne. Mec, merci pour tous vos efforts, très très apprécié :-D.
Leo Ufimtsev
1
NB: Il n'est plus recommandé d'utiliser cl selon la documentation .
cammil
1

Ajoutez les éléments suivants à votre fichier:

#+ARCHIVE: :: * Completed.

Et le brassage devient l' archivage

Plutôt que de trier les entrées, que diriez-vous d'une vue triée?

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

Limitez-le au fichier actuel avec <. Vous pouvez marquer TERMINÉ et archiver à partir de la vue triée.

Fils d'un gnou
la source
1

Vous pouvez également définir une org-agenda-cmp-user-definedfonction et l'ajouter à org-agenda-sorting-strategy. C'est celui que j'ai créé à titre d'exemple.

(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
la source
1

Vous pouvez utiliser cette bibliothèque faite par moi: https://github.com/felipelalli/org-sort-tasks

Il utilise algo Tri par fusion en demandant à l'utilisateur si une tâche A est plus importante que B, puis crée une liste triée.

Felipe
la source
Pouvez-vous ajouter une description de ce que cela fait, et en particulier en quoi il diffère des autres réponses.
Andrew Swann
Il utilise algo Merge Sort en demandant à l'utilisateur si une tâche A est plus importante que B, puis crée une liste triée.
Felipe