As I mentioned a lot of times, I use Org-mode – and in particular, clocking – very heavily. Sometimes I have this Org entry with a lot of (clocked) subentries, and I’d like to see which ones of them I haven’t touched in a long time – and which ones I’ve been working recently.
I wanted to ask on the Org mailing list whether it was possible, but – taught by experience – I decided to check in the manual first. Unsurprisingly, the feature is (almost) already there. It’s called
org-sort and is bound to
C-c ^. You can invoke it on the “parent” entry and then choose the sorting order (it works differently on lists and tables, though). The one interesting here is
T, which means “time”. The sorting key is the first active timestamp in the entry, and in case there are no active timestamps, the first inactive one. Since I usually don’t have active timestamps on things I clock, this is enough for me. In case this is a problem,
org-sort also accepts an
f (for function) and then asks for any Elisp function acting as a predicate; writing one treating active and inactive timestamps in the same way would most probably be very easy.
Interestingly enough, there is almost no need to write such a function. Deep in the Org-mode guts, in
org-clock.el, there lies hidden a function called
org-clock-get-last-clock-out-time. It’s almost never really used, but it does what we want. The only problem is that it returns a time value, i.e. not sth you can feed into
org-sort. But this is easy to remedy:
(defun org-clock-get-last-clock-out-unix-time () "Return the last clock-out time for the current sub-tree as a Unix time." (time-to-seconds (org-clock-get-last-clock-out-time)))
Note also that lowercase letters in
org-sort correspond to ascending order and uppercase ones to descending ones. It might also be interesting to know that
org-sort is really kind of a “dispatcher”, calling
org-sort-list or just
org-sort-entries (depending on what the point is at).