Subject: bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.

From: Yuchen Pei <[email-masked]>
Date: Wed, 25 Aug 2021 13:46:48 +1000

Hello,

See below my first patch to Emacs.  The copyright assignment has 
already been done BTW.

Let me know what you think. Would you like me to add some tests?

From d385b1bc02f2922fbff4496f81d4574d0abcf082 Mon Sep 17 00:00:00 2001
From: Yuchen Pei <[email-masked]>
Date: Wed, 25 Aug 2021 13:37:20 +1000
Subject: [PATCH] Adding diary-offset, a diary-sexp offsetting another
 diary-sexp.

A bit like diary-remind, as a diary-sexp rather than reminder, and
also support both positive and negative offsets.

This is useful when for example your organization has a committee
meeting two days after every monthly meeting which takes place on the
third Thursday, or if you would like to attend a virtual meeting
scheduled in a different timezone causing a difference in the date.
---
 doc/emacs/calendar.texi    | 14 ++++++++++++++
 lisp/calendar/diary-lib.el | 11 +++++++++++
 2 files changed, 25 insertions(+)

diff --git a/doc/emacs/calendar.texi b/doc/emacs/calendar.texi
index 3750e78e70..44766c92de 100644
--- a/doc/emacs/calendar.texi
+++ b/doc/emacs/calendar.texi
@@ -1363,6 +1363,20 @@ Special Diary Entries
 Thursday of January, February, and March.  If the month is @code{t}, the
 entry applies to all months of the year.
 
+@findex diary-offset
+@example
+%%(diary-offset '(diary-float t 3 4) 2) Monthly post-event committee meeting
+@end example
+
+@noindent
+This entry applies to the Saturday after the third Thursday of each
+month.  The 2 specifies number of days after when the sexp
+@samp{'(diary-float t 3 4)} would evaluate to @code{t}.  This is
+useful when for example your organization has a committee meeting two
+days after every monthly meeting which takes place on the third
+Thursday, or if you would like to attend a virtual meeting scheduled
+in a different timezone causing a difference in the date.
+
   Each of the standard sexp diary entries takes an optional parameter
 specifying the name of a face or a single-character string to use when
 marking the entry in the calendar.  Most generally, sexp diary entries
diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el
index f57fe26058..d83a60680f 100644
--- a/lisp/calendar/diary-lib.el
+++ b/lisp/calendar/diary-lib.el
@@ -2014,6 +2014,17 @@ diary-cyclic
     (and (>= diff 0) (zerop (% diff n))
          (cons mark (format entry cycle (diary-ordinal-suffix cycle))))))
 
+;; To be called from diary-sexp-entry, where DATE, ENTRY are bound.
+(defun diary-offset (sexp days)
+  "Offsetted diary entry.
+Entry applies if the date is DAYS days after another diary-sexp SEXP."
+  (with-no-warnings (defvar date) (defvar entry))
+  (integerp days)
+  (let ((date
+	 (calendar-gregorian-from-absolute
+	  (- (calendar-absolute-from-gregorian date) days))))
+    (eval sexp)))
+
 (defun diary-day-of-year ()
   "Day of year and number of days remaining in the year of date diary entry."
   (with-no-warnings (defvar date))
-- 
2.33.0

-- 
Best,
Yuchen

PGP Key: 47F9 D050 1E11 8879 9040  4941 2126 7E93 EF86 DFD0
           <https://ypei.me/assets/ypei-pubkey.txt>