diff options
author | Bastien Guerry <bzg@altern.org> | 2013-02-05 15:03:29 +0100 |
---|---|---|
committer | Bastien Guerry <bzg@altern.org> | 2013-02-06 17:23:24 +0100 |
commit | 8517be79b5c1fe165d23ea65ad70a282e9c595bb (patch) | |
tree | aa5ac9d7bae6890e2800631411d72516e0a2f58a | |
parent | b91fe131ae744ed98a516c00229a81d6fe06d0f4 (diff) | |
download | org-mode-8517be79b5c1fe165d23ea65ad70a282e9c595bb.tar.gz |
org-agenda.el: Implement new sorting strategies
* org-agenda.el (org-agenda-sorting-strategy): Document the
new sorting strategies.
(org-agenda-get-todos, org-agenda-get-timestamps)
(org-agenda-get-deadlines, org-agenda-get-scheduled): Add a
`ts-date' text property with scheduled, deadline or timetamp
date.
(org-cmp-ts): New function to compare timestamps.
(org-em): Add a docstring.
(org-entries-lessp): Use `org-cmp-ts' to compare timestamps.
Implement the following sorting strategies: timestamp-up/down,
scheduled-up/down, deadline-up/down, ts-up/down (for active
timestamps) and tsia-up/down (for inactive timestamps.)
-rw-r--r-- | lisp/org-agenda.el | 84 |
1 files changed, 78 insertions, 6 deletions
diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index c3a4ac4..663d1b5 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -1417,6 +1417,16 @@ symbols are recognized: time-up Put entries with time-of-day indications first, early first time-down Put entries with time-of-day indications first, late first +timestamp-up Sort by any timestamp, early first +timestamp-down Sort by any timestamp, late first +scheduled-up Sort by scheduled timestamp, early first +scheduled-down Sort by scheduled timestamp, late first +deadline-up Sort by deadline timestamp, early first +deadline-down Sort by deadline timestamp, late first +ts-up Sort by active timestamp, early first +ts-down Sort by active timestamp, late first +tsia-up Sort by inactive timestamp, early first +tsia-down Sort by inactive timestamp, late first category-keep Keep the default order of categories, corresponding to the sequence in `org-agenda-files'. category-up Sort alphabetically by category, A-Z. @@ -5346,7 +5356,7 @@ the documentation of `org-diary'." "|") "\\|") "\\)")) (t org-not-done-regexp)))) - marker priority category category-pos level tags todo-state + marker priority category category-pos level tags todo-state ts-date ts-date-type ee txt beg end inherited-tags) (goto-char (point-min)) (while (re-search-forward regexp nil t) @@ -5362,6 +5372,33 @@ the documentation of `org-diary'." (goto-char (match-beginning 2)) (setq marker (org-agenda-new-marker (match-beginning 0)) category (org-get-category) + ts-date (let (ts) + (save-match-data + (cond ((org-em 'scheduled-up 'scheduled-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get (point) "SCHEDULED") + ts-date-type " scheduled")) + ((org-em 'deadline-up 'deadline-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get (point) "DEADLINE") + ts-date-type " deadline")) + ((org-em 'ts-up 'ts-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get (point) "TIMESTAMP") + ts-date-type " timestamp")) + ((org-em 'tsia-up 'tsia-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get (point) "TIMESTAMP_IA") + ts-date-type " timestamp_ia")) + ((org-em 'timestamp-up 'timestamp-down + org-agenda-sorting-strategy-selected) + (setq ts (or (org-entry-get (point) "SCHEDULED") + (org-entry-get (point) "DEADLINE") + (org-entry-get (point) "TIMESTAMP") + (org-entry-get (point) "TIMESTAMP_IA")) + ts-date-type "")) + (t (setq ts-date-type ""))) + (when ts (org-time-string-to-absolute ts)))) category-pos (get-text-property (point) 'org-category-position) txt (org-trim (buffer-substring (match-beginning 2) (match-end 0))) @@ -5381,8 +5418,9 @@ the documentation of `org-diary'." 'org-marker marker 'org-hd-marker marker 'priority priority 'org-category category 'level level + 'ts-date ts-date 'org-category-position category-pos - 'type "todo" 'todo-state todo-state) + 'type (concat "todo" ts-date-type) 'todo-state todo-state) (push txt ee) (if org-agenda-todo-list-sublevels (goto-char (match-end 2)) @@ -5506,7 +5544,7 @@ Do we have a reason to ignore this TODO entry because it has a time stamp? marker hdmarker deadlinep scheduledp clockp closedp inactivep donep tmp priority category category-pos level ee txt timestr tags b0 b3 e3 head todo-state end-of-match show-all warntime habitp - inherited-tags) + inherited-tags ts-date) (goto-char (point-min)) (while (setq end-of-match (re-search-forward regexp nil t)) (setq b0 (match-beginning 0) @@ -5578,6 +5616,7 @@ Do we have a reason to ignore this TODO entry because it has a time stamp? 'org-marker marker 'org-hd-marker hdmarker 'org-category category 'date date 'level level + 'ts-date (org-time-string-to-absolute timestr) 'org-category-position category-pos 'todo-state todo-state 'warntime warntime @@ -5961,7 +6000,7 @@ See also the user option `org-agenda-clock-consistency-checks'." (d1 (calendar-absolute-from-gregorian date)) ; DATE bound by calendar d2 diff dfrac wdays pos pos1 category category-pos level tags suppress-prewarning ee txt head face s todo-state - show-all upcomingp donep timestr warntime inherited-tags) + show-all upcomingp donep timestr warntime inherited-tags ts-date) (goto-char (point-min)) (while (re-search-forward regexp nil t) (catch :skip @@ -6061,6 +6100,7 @@ See also the user option `org-agenda-clock-consistency-checks'." 'org-marker (org-agenda-new-marker pos) 'warntime warntime 'level level + 'ts-date d2 'org-hd-marker (org-agenda-new-marker pos1) 'priority (+ (- diff) (org-get-priority txt)) @@ -6103,7 +6143,7 @@ FRACTION is what fraction of the head-warning time has passed." deadline-results)) d2 diff pos pos1 category category-pos level tags donep ee txt head pastschedp todo-state face timestr s habitp show-all - did-habit-check-p warntime inherited-tags) + did-habit-check-p warntime inherited-tags ts-date) (goto-char (point-min)) (while (re-search-forward regexp nil t) (catch :skip @@ -6205,6 +6245,7 @@ FRACTION is what fraction of the head-warning time has passed." 'org-hd-marker (org-agenda-new-marker pos1) 'type (if pastschedp "past-scheduled" "scheduled") 'date (if pastschedp d2 date) + 'ts-date d2 'warntime warntime 'level level 'priority (if habitp @@ -6831,6 +6872,20 @@ could bind the variable in the options section of a custom command.") (cond ((< ta tb) -1) ((< tb ta) +1)))) +(defsubst org-cmp-ts (a b &optional type) + "Compare the timestamps values of entries A and B. +When TYPE is \"scheduled\", \"deadline\", \"timestamp\" +or \"timestamp_ia\", compare within each of these type. +When TYPE is the empty string, compare all timestamps +without respect of their type." + (let* ((def (if org-sort-agenda-notime-is-late 9901 -1)) + (ta (or (and (string-match type (get-text-property 1 'type a)) + (get-text-property 1 'ts-date a)) def)) + (tb (or (and (string-match type (get-text-property 1 'type b)) + (get-text-property 1 'ts-date b)) def))) + (cond ((< ta tb) -1) + ((< tb ta) +1)))) + (defsubst org-cmp-habit-p (a b) "Compare the todo states of strings A and B." (let ((ha (get-text-property 1 'org-habit-p a)) @@ -6838,13 +6893,30 @@ could bind the variable in the options section of a custom command.") (cond ((and ha (not hb)) -1) ((and (not ha) hb) +1)))) -(defsubst org-em (x y list) (or (memq x list) (memq y list))) +(defsubst org-em (x y list) + "Is X or Y a member of LIST?" + (or (memq x list) (memq y list))) (defun org-entries-lessp (a b) "Predicate for sorting agenda entries." ;; The following variables will be used when the form is evaluated. ;; So even though the compiler complains, keep them. (let* ((ss org-agenda-sorting-strategy-selected) + (timestamp-up (and (org-em 'timestamp-up 'timestamp-down ss) + (org-cmp-ts a b ""))) + (timestamp-down (if timestamp-up (- timestamp-up) nil)) + (scheduled-up (and (org-em 'scheduled-up 'scheduled-down ss) + (org-cmp-ts a b "scheduled"))) + (scheduled-down (if scheduled-up (- scheduled-up) nil)) + (deadline-up (and (org-em 'deadline-up 'deadline-down ss) + (org-cmp-ts a b "deadline"))) + (deadline-down (if deadline-up (- deadline-up) nil)) + (tsia-up (and (org-em 'tsia-up 'tsia-down ss) + (org-cmp-ts a b "iatimestamp_ia"))) + (tsia-down (if tsia-up (- tsia-up) nil)) + (ts-up (and (org-em 'ts-up 'ts-down ss) + (org-cmp-ts a b "timestamp"))) + (ts-down (if ts-up (- ts-up) nil)) (time-up (and (org-em 'time-up 'time-down ss) (org-cmp-time a b))) (time-down (if time-up (- time-up) nil)) |