From f121bc5e72ac356f00f1cb31a10d2f042785667a Mon Sep 17 00:00:00 2001 From: Bastien Guerry Date: Wed, 2 Feb 2011 10:35:56 +0100 Subject: [PATCH] Make org-agenda-repeating-timestamp-show-all aware of TODO keywords. * org-agenda.el (org-agenda-repeating-timestamp-show-all): Allow to use a list of TODO keywords as the value of this variable. The agenda will show repeating stamps for entries matching these TODO keywords. (org-agenda-get-timestamps, org-agenda-get-deadlines) (org-agenda-get-scheduled): Allow the use of a list of keywords in `org-agenda-repeating-timestamp-show-all'. --- This was suggested by Jeff Horn and supported by Detlef Steuer. --- lisp/org-agenda.el | 40 ++++++++++++++++++++++++++-------------- 1 files changed, 26 insertions(+), 14 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index bbe9d8a..312482e 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -1066,10 +1066,15 @@ This option is deprecated, it is better to define a block agenda instead." (defcustom org-agenda-repeating-timestamp-show-all t "Non-nil means show all occurrences of a repeating stamp in the agenda. -When nil, only one occurrence is shown, either today or the -nearest into the future." +When set to a list of strings, only show occurrences of repeating +stamps for these TODO keywords. When nil, only one occurrence is +shown, either today or the nearest into the future." :group 'org-agenda-daily/weekly - :type 'boolean) + :type '(choice + (const :tag "Show repeating stamps" t) + (repeat :tag "Show repeating stamps for these TODO keywords" + (string :tag "TODO Keyword")) + (const :tag "Don't show repeating stamps" nil))) (defcustom org-scheduled-past-days 10000 "No. of days to continue listing scheduled items that are not marked DONE. @@ -4669,14 +4674,17 @@ This function is invoked if `org-agenda-todo-ignore-deadlines', (goto-char (point-min)) (while (setq end-of-match (re-search-forward regexp nil t)) (setq b0 (match-beginning 0) - b3 (match-beginning 3) e3 (match-end 3)) + b3 (match-beginning 3) e3 (match-end 3) + todo-state (save-match-data (ignore-errors (org-get-todo-state))) + show-all (or (eq org-agenda-repeating-timestamp-show-all t) + (member todo-state + org-agenda-repeating-timestamp-show-all))) (catch :skip (and (org-at-date-range-p) (throw :skip nil)) (org-agenda-skip) (if (and (match-end 1) (not (= d1 (org-time-string-to-absolute - (match-string 1) d1 nil - org-agenda-repeating-timestamp-show-all)))) + (match-string 1) d1 nil show-all)))) (throw :skip nil)) (if (and e3 (not (org-diary-sexp-entry (buffer-substring b3 e3) "" date))) @@ -4693,7 +4701,6 @@ This function is invoked if `org-agenda-todo-ignore-deadlines', clockp (and org-agenda-include-inactive-timestamps (or (string-match org-clock-string tmp) (string-match "]-+\\'" tmp))) - todo-state (ignore-errors (org-get-todo-state)) donep (member todo-state org-done-keywords)) (if (or scheduledp deadlinep closedp clockp (and donep org-agenda-skip-timestamp-if-done)) @@ -4904,7 +4911,7 @@ be skipped." (d1 (calendar-absolute-from-gregorian date)) ; DATE bound by calendar d2 diff dfrac wdays pos pos1 category tags suppress-prewarning - ee txt head face s todo-state upcomingp donep timestr) + ee txt head face s todo-state show-all upcomingp donep timestr) (goto-char (point-min)) (while (re-search-forward regexp nil t) (setq suppress-prewarning nil) @@ -4922,9 +4929,12 @@ be skipped." (setq s (match-string 1) txt nil pos (1- (match-beginning 1)) + todo-state (save-match-data (org-get-todo-state)) + show-all (or (eq org-agenda-repeating-timestamp-show-all t) + (member todo-state + org-agenda-repeating-timestamp-show-all)) d2 (org-time-string-to-absolute - (match-string 1) d1 'past - org-agenda-repeating-timestamp-show-all) + (match-string 1) d1 'past show-all) diff (- d2 d1) wdays (if suppress-prewarning (let ((org-deadline-warning-days suppress-prewarning)) @@ -4939,7 +4949,7 @@ be skipped." (and todayp (not org-agenda-only-exact-dates))) (= diff 0))) (save-excursion - (setq todo-state (org-get-todo-state)) + ;; (setq todo-state (org-get-todo-state)) (setq donep (member todo-state org-done-keywords)) (if (and donep (or org-agenda-skip-deadline-if-done @@ -5024,9 +5034,12 @@ FRACTION is what fraction of the head-warning time has passed." (setq s (match-string 1) txt nil pos (1- (match-beginning 1)) + todo-state (save-match-data (org-get-todo-state)) + show-all (or (eq org-agenda-repeating-timestamp-show-all t) + (member todo-state + org-agenda-repeating-timestamp-show-all)) d2 (org-time-string-to-absolute - (match-string 1) d1 'past - org-agenda-repeating-timestamp-show-all) + (match-string 1) d1 'past show-all) diff (- d2 d1)) (setq pastschedp (and todayp (< diff 0))) ;; When to show a scheduled item in the calendar: @@ -5036,7 +5049,6 @@ FRACTION is what fraction of the head-warning time has passed." (and todayp (not org-agenda-only-exact-dates))) (= diff 0)) (save-excursion - (setq todo-state (org-get-todo-state)) (setq donep (member todo-state org-done-keywords)) (if (and donep (or org-agenda-skip-scheduled-if-done -- 1.7.3.5