[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] Useful utility function: org-sort-multi

From: Carsten Dominik
Subject: Re: [Orgmode] Useful utility function: org-sort-multi
Date: Sun, 30 Aug 2009 10:09:01 +0200

On Aug 29, 2009, at 3:38 AM, Ryan C. Thompson wrote:

I found myself having to sort by multiple criteria, and I was doing it with multiple calls to org-sort-entries-or-items. Then I decided to abstract the repetition into a function. Here it is:

(defun org-sort-multi (&rest sort-types)
"Sort successively by a list of criteria, in descending order of importance. For example, sort first by TODO status, then by priority, then by date, then alphabetically, case-sensitive. Each criterion is either a character or a cons pair (BOOL . CHAR), where BOOL is whether or not to sort case-sensitively, and CHAR is one of the characters defined in ``org-sort-entries-or-items''.
So, the example above could be accomplished with:
(org-sort-multi ?o ?p ?t (t . ?a))"
 (mapc #'(lambda (sort-type)
(when (characterp sort-type) (setq sort-type (cons nil sort-type))) (org-sort-entries-or-items (car sort-type) (cdr sort- type)))
       (reverse sort-types)))

Note the call to reverse. This makes it so that the first criterion you provide is the dominant criterion. Try it out to see how it works, and let me know if there's a better way to pass the arguments.

Just as an example, the particular sorting function I wanted to write now becomes this:

(defun org-sort-custom ()
"Sort children of node by todo status and by priority and by date, so the * TODO [#A] items with latest dates go to the top."
 (org-sort-multi ?o ?p ?T))

Hi Ryan,

this looks interesting, but I am not sure I understand how it works.
It looks to me that each sorting step will completely re-sort the entire
list of items, so the final sorting will win in the end.

Or am I missing something here?

- Carsten

Emacs-orgmode mailing list
Remember: use `Reply All' to send replies to the list.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]