From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Ryan C. Thompson" Subject: Useful utility function: org-sort-multi Date: Fri, 28 Aug 2009 18:38:00 -0700 Message-ID: <4A988678.6020202@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MhCtP-0004u9-Ey for emacs-orgmode@gnu.org; Fri, 28 Aug 2009 21:38:11 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MhCtK-0004tx-Rv for emacs-orgmode@gnu.org; Fri, 28 Aug 2009 21:38:10 -0400 Received: from [199.232.76.173] (port=44778 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MhCtK-0004tu-Lb for emacs-orgmode@gnu.org; Fri, 28 Aug 2009 21:38:06 -0400 Received: from mail-pz0-f202.google.com ([209.85.222.202]:34024) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MhCtK-0004vO-61 for emacs-orgmode@gnu.org; Fri, 28 Aug 2009 21:38:06 -0400 Received: by pzk40 with SMTP id 40so2338006pzk.26 for ; Fri, 28 Aug 2009 18:38:04 -0700 (PDT) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: org-mode Mailinglist 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))" (interactive) (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." (interactive) (org-sort-multi ?o ?p ?T))