Browse Source

org-agenda.el: Fix handling of one-time delays

* lisp/org-agenda.el (org-agenda-get-scheduled): Fix handling
of one-time delays.

Thanks to hhkg for reporting this.
Bastien 5 months ago
parent
commit
39c656870c
1 changed files with 23 additions and 7 deletions
  1. 23 7
      lisp/org-agenda.el

+ 23 - 7
lisp/org-agenda.el

@@ -6275,6 +6275,10 @@ scheduled items with an hour specification like [h]h:mm."
 			    (org-agenda--timestamp-to-absolute deadline))
 			 org-scheduled-delay-days))
 		   (t 0))))
+	       (diff-r (abs (- repeat current)))
+	       (ddays-once (or (and (string-match "--\\([0-9]+\\)[hdwmy]" s)
+				    (string-to-number (match-string 1 s)))
+			       0))
 	       (ddays
 		(cond
 		 ;; Nullify delay when a repeater triggered already
@@ -6293,13 +6297,25 @@ scheduled items with an hour specification like [h]h:mm."
 	  (unless (and todayp
 		       habitp
 		       (bound-and-true-p org-habit-show-all-today))
-	    (when (or (and (> ddays 0) (< diff ddays))
-		      (> diff (or (and habitp org-habit-scheduled-past-days)
-				  org-scheduled-past-days))
-		      (> schedule current)
-		      (and (/= current schedule)
-			   (/= current today)
-			   (/= current repeat)))
+	    (when (or
+		   ;; no one-time delay, not repeated delay
+		   (and (not ddays-once) (not (= ddays diff-r)))
+		   ;; one-time delay, but not for today
+		   (and ddays-once
+			(not (= diff diff-r))
+			(= ddays-once diff-r))
+		   ;; normal delay, but already in the past
+		   (and (> ddays 0) (< diff ddays))
+		   ;; a habit, but past `org-habit-scheduled-past-days'
+		   (> diff (or (and habitp org-habit-scheduled-past-days)
+			       org-scheduled-past-days))
+		   ;; schedule in the future
+		   (> schedule current)
+		   ;; no delay, not scheduled today, no deadline for today
+		   (and (= ddays 0)
+			(/= current schedule)
+			(/= current today)
+			(/= current repeat)))
 	      (throw :skip nil)))
 	  ;; Possibly skip done tasks.
 	  (when (and donep