From mboxrd@z Thu Jan 1 00:00:00 1970 From: ydl@mit.edu (Yuri D. Lensky) Subject: Re: [Patch] Fix date-based sorting of tags and tags-todo agenda views Date: Sun, 08 Feb 2015 13:54:55 -0500 Message-ID: <86pp9k8c8w.fsf@mit.edu> References: <1D119613313E504D8C7FDD06E9B6DD40C951ADE8@OC11expo28.exchange.mit.edu> <87d25ltokq.fsf@nicolasgoaziou.fr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:59695) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YKX0Y-0001La-9M for emacs-orgmode@gnu.org; Sun, 08 Feb 2015 13:55:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YKX0V-0006mk-00 for emacs-orgmode@gnu.org; Sun, 08 Feb 2015 13:55:02 -0500 Received: from mail-qa0-x231.google.com ([2607:f8b0:400d:c00::231]:44932) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YKX0U-0006ma-Pd for emacs-orgmode@gnu.org; Sun, 08 Feb 2015 13:54:58 -0500 Received: by mail-qa0-f49.google.com with SMTP id v8so18024250qal.8 for ; Sun, 08 Feb 2015 10:54:58 -0800 (PST) Received: from YL-PC ([18.189.68.65]) by mx.google.com with ESMTPSA id g9sm6451724qaa.28.2015.02.08.10.54.57 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 08 Feb 2015 10:54:57 -0800 (PST) In-Reply-To: <87d25ltokq.fsf@nicolasgoaziou.fr> (Nicolas Goaziou's message of "Sat, 07 Feb 2015 22:14:19 +0100") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: "emacs-orgmode@gnu.org" --=-=-= Content-Type: text/plain Done. >From 131435ac43d950bad2bb42b92982f498de74a31f Mon Sep 17 00:00:00 2001 From: "Yuri D. Lensky" Date: Sat, 7 Feb 2015 13:37:46 -0500 Subject: [PATCH] Fix timestamp-based sorting of tags-based entries in agenda * lisp/org.el (org-scan-tags): Fix agenda org tags scans to properly add timestamp property, completely analogously to org-agenda-get-todos. * lisp/org-agenda.el (org-agenda-entry-get-agenda-timestamp, org-agenda-get-todos): Factored timestamp retrieval code out to separate function org-agenda-entry-get-agenda-timestamp from org-agenda-get-todos. Before this fix, timestamps were ignored when sorting agenda views of the 'tags' and 'tags-todo' types. --- lisp/org-agenda.el | 66 +++++++++++++++++++++++++++++++----------------------- lisp/org.el | 11 +++++++-- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index e7cfd27..5b04cac 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -5362,6 +5362,39 @@ the documentation of `org-diary'." (defvar org-heading-keyword-regexp-format) ; defined in org.el (defvar org-agenda-sorting-strategy-selected nil) +(defun org-agenda-entry-get-agenda-timestamp (pom) + "Given a point or maker POM, returns a cons cell of the +timestamp and the timestamp type relevant for the sorting +strategy in `org-agenda-sorting-strategy-selected'." + (let (ts ts-date-type) + (save-match-data + (cond ((org-em 'scheduled-up 'scheduled-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get pom "SCHEDULED") + ts-date-type " scheduled")) + ((org-em 'deadline-up 'deadline-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get pom "DEADLINE") + ts-date-type " deadline")) + ((org-em 'ts-up 'ts-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get pom "TIMESTAMP") + ts-date-type " timestamp")) + ((org-em 'tsia-up 'tsia-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get pom "TIMESTAMP_IA") + ts-date-type " timestamp_ia")) + ((org-em 'timestamp-up 'timestamp-down + org-agenda-sorting-strategy-selected) + (setq ts (or (org-entry-get pom "SCHEDULED") + (org-entry-get pom "DEADLINE") + (org-entry-get pom "TIMESTAMP") + (org-entry-get pom "TIMESTAMP_IA")) + ts-date-type "")) + (t (setq ts-date-type ""))) + (cons (when ts (ignore-errors (org-time-string-to-absolute ts))) + ts-date-type)))) + (defun org-agenda-get-todos () "Return the TODO information for agenda display." (let* ((props (list 'face nil @@ -5386,7 +5419,8 @@ the documentation of `org-diary'." "|") "\\|") "\\)")) (t org-not-done-regexp)))) - marker priority category level tags todo-state ts-date ts-date-type + marker priority category level tags todo-state + ts-date ts-date-type ts-date-pair ee txt beg end inherited-tags todo-state-end-pos) (goto-char (point-min)) (while (re-search-forward regexp nil t) @@ -5406,33 +5440,9 @@ 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 (ignore-errors (org-time-string-to-absolute ts))))) + ts-date-pair (org-agenda-entry-get-agenda-timestamp (point)) + ts-date (car ts-date-pair) + ts-date-type (cdr ts-date-pair) txt (org-trim (buffer-substring (match-beginning 2) (match-end 0))) inherited-tags (or (eq org-agenda-show-inherited-tags 'always) diff --git a/lisp/org.el b/lisp/org.el index a095f8d..795186a 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -14177,7 +14177,8 @@ headlines matching this string." lspos tags tags-list (tags-alist (list (cons 0 org-file-tags))) (llast 0) rtn rtn1 level category i txt - todo marker entry priority) + todo marker entry priority + ts-date ts-date-type ts-date-pair) (when (not (or (member action '(agenda sparse-tree)) (functionp action))) (setq action (list 'lambda nil action))) (save-excursion @@ -14194,6 +14195,10 @@ headlines matching this string." (goto-char (setq lspos (match-beginning 0))) (setq level (org-reduced-level (org-outline-level)) category (org-get-category)) + (when (eq action 'agenda) + (setq ts-date-pair (org-agenda-entry-get-agenda-timestamp (point)) + ts-date (car ts-date-pair) + ts-date-type (cdr ts-date-pair))) (setq i llast llast level) ;; remove tag lists from same and sublevels (while (>= i level) @@ -14265,7 +14270,9 @@ headlines matching this string." (org-add-props txt props 'org-marker marker 'org-hd-marker marker 'org-category category 'todo-state todo - 'priority priority 'type "tagsmatch") + 'ts-date ts-date + 'priority priority + 'type (concat "tagsmatch" ts-date-type)) (push txt rtn)) ((functionp action) (setq org-map-continue-from nil) -- 1.9.4.msysgit.2 Nicolas Goaziou writes: > Hello, > > Yuri D Lensky writes: > >> An example to test this problem: >> >> Evaluate: >> (setq org-agenda-custom-commands >> '(("t" "TEST" tags-todo "tag" >> ((org-agenda-sorting-strategy '(deadline-up)))))) >> then run the view. It will not be sorted properly before the patch, >> but will be after. > > Thank you. It looks good. > >> I would also recommend factoring the code that I added out into >> a separate function (as it also appears almost verbatim in >> org-agenda-get-todos), but I am not sure the conventions or desire for >> this. > > I agree it would be good to do that refactoring. Do you want to take > care of it in the same patch? > >> From c8a7211639d9c138a3b3dcb7e3ce7c85264580f1 Mon Sep 17 00:00:00 2001 >> From: "Yuri D. Lensky" >> Date: Sat, 7 Feb 2015 13:37:46 -0500 >> Subject: [PATCH] Fix timestamp-based sorting of tags-based entries in agenda >> >> * lisp/org.el (org-scan-tags): Fix agenda org tags scans to properly >> add timestamp property, completely analogously to org-agenda-get-todos. >> >> Before this fix, timestamps were ignored when sorting agenda views of >> the 'tags' and 'tags-todo' types. > > You need to add TINYCHANGE at the end of the commit message. If your > patch ends up being more than 20 lines long, you'll also need to sign > FSF assignment (if not already done). See > > http://orgmode.org/worg/org-contribute.html#unnumbered-2 > > > Regards, --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Fix-timestamp-based-sorting-of-tags-based-entries-in.patch Content-Description: Patch >From 131435ac43d950bad2bb42b92982f498de74a31f Mon Sep 17 00:00:00 2001 From: "Yuri D. Lensky" Date: Sat, 7 Feb 2015 13:37:46 -0500 Subject: [PATCH] Fix timestamp-based sorting of tags-based entries in agenda * lisp/org.el (org-scan-tags): Fix agenda org tags scans to properly add timestamp property, completely analogously to org-agenda-get-todos. * lisp/org-agenda.el (org-agenda-entry-get-agenda-timestamp, org-agenda-get-todos): Factored timestamp retrieval code out to separate function org-agenda-entry-get-agenda-timestamp from org-agenda-get-todos. Before this fix, timestamps were ignored when sorting agenda views of the 'tags' and 'tags-todo' types. --- lisp/org-agenda.el | 66 +++++++++++++++++++++++++++++++----------------------- lisp/org.el | 11 +++++++-- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index e7cfd27..5b04cac 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -5362,6 +5362,39 @@ the documentation of `org-diary'." (defvar org-heading-keyword-regexp-format) ; defined in org.el (defvar org-agenda-sorting-strategy-selected nil) +(defun org-agenda-entry-get-agenda-timestamp (pom) + "Given a point or maker POM, returns a cons cell of the +timestamp and the timestamp type relevant for the sorting +strategy in `org-agenda-sorting-strategy-selected'." + (let (ts ts-date-type) + (save-match-data + (cond ((org-em 'scheduled-up 'scheduled-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get pom "SCHEDULED") + ts-date-type " scheduled")) + ((org-em 'deadline-up 'deadline-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get pom "DEADLINE") + ts-date-type " deadline")) + ((org-em 'ts-up 'ts-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get pom "TIMESTAMP") + ts-date-type " timestamp")) + ((org-em 'tsia-up 'tsia-down + org-agenda-sorting-strategy-selected) + (setq ts (org-entry-get pom "TIMESTAMP_IA") + ts-date-type " timestamp_ia")) + ((org-em 'timestamp-up 'timestamp-down + org-agenda-sorting-strategy-selected) + (setq ts (or (org-entry-get pom "SCHEDULED") + (org-entry-get pom "DEADLINE") + (org-entry-get pom "TIMESTAMP") + (org-entry-get pom "TIMESTAMP_IA")) + ts-date-type "")) + (t (setq ts-date-type ""))) + (cons (when ts (ignore-errors (org-time-string-to-absolute ts))) + ts-date-type)))) + (defun org-agenda-get-todos () "Return the TODO information for agenda display." (let* ((props (list 'face nil @@ -5386,7 +5419,8 @@ the documentation of `org-diary'." "|") "\\|") "\\)")) (t org-not-done-regexp)))) - marker priority category level tags todo-state ts-date ts-date-type + marker priority category level tags todo-state + ts-date ts-date-type ts-date-pair ee txt beg end inherited-tags todo-state-end-pos) (goto-char (point-min)) (while (re-search-forward regexp nil t) @@ -5406,33 +5440,9 @@ 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 (ignore-errors (org-time-string-to-absolute ts))))) + ts-date-pair (org-agenda-entry-get-agenda-timestamp (point)) + ts-date (car ts-date-pair) + ts-date-type (cdr ts-date-pair) txt (org-trim (buffer-substring (match-beginning 2) (match-end 0))) inherited-tags (or (eq org-agenda-show-inherited-tags 'always) diff --git a/lisp/org.el b/lisp/org.el index a095f8d..795186a 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -14177,7 +14177,8 @@ headlines matching this string." lspos tags tags-list (tags-alist (list (cons 0 org-file-tags))) (llast 0) rtn rtn1 level category i txt - todo marker entry priority) + todo marker entry priority + ts-date ts-date-type ts-date-pair) (when (not (or (member action '(agenda sparse-tree)) (functionp action))) (setq action (list 'lambda nil action))) (save-excursion @@ -14194,6 +14195,10 @@ headlines matching this string." (goto-char (setq lspos (match-beginning 0))) (setq level (org-reduced-level (org-outline-level)) category (org-get-category)) + (when (eq action 'agenda) + (setq ts-date-pair (org-agenda-entry-get-agenda-timestamp (point)) + ts-date (car ts-date-pair) + ts-date-type (cdr ts-date-pair))) (setq i llast llast level) ;; remove tag lists from same and sublevels (while (>= i level) @@ -14265,7 +14270,9 @@ headlines matching this string." (org-add-props txt props 'org-marker marker 'org-hd-marker marker 'org-category category 'todo-state todo - 'priority priority 'type "tagsmatch") + 'ts-date ts-date + 'priority priority + 'type (concat "tagsmatch" ts-date-type)) (push txt rtn)) ((functionp action) (setq org-map-continue-from nil) -- 1.9.4.msysgit.2 --=-=-=--