Yuchen Pei writes: > I didn't see this message making its way to the bug-gnu-emacs > mailing > list and I haven't heard back after the revision, so I'm not > sure if > the revised patch below has been made available for people to > see. > Sorry if this is a duplicate. Let me know what you think. Any updates? > Yuchen Pei writes: > >> Sorry, forgot the attach the patch. Here it is. >> >> From 4df9db3eeb3b048579768050ae7bb413fefe9557 Mon Sep 17 >> 00:00:00 >> 2001 >> From: Yuchen Pei >> Date: Wed, 25 Aug 2021 13:37:20 +1000 >> Subject: [PATCH] Adding diary-offset to diary-lib.el. >> >> A new diary sexp that offsets another diary sexp (Bug#50195). >> >> * doc/emacs/calendar.texi: Document the change. >> * lisp/calendar/diary-lib.el (diary-offset): >> * test/lisp/calendar/icalendar-tests.el: Add a test. >> --- >> doc/emacs/calendar.texi | 14 ++++++++++++++ >> etc/NEWS | 8 ++++++++ >> lisp/calendar/diary-lib.el | 11 +++++++++++ >> test/lisp/calendar/icalendar-tests.el | 7 +++++++ >> 4 files changed, 40 insertions(+) >> >> diff --git a/doc/emacs/calendar.texi b/doc/emacs/calendar.texi >> index 3750e78e70..18de721e28 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 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 >> +@w{@code{'(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/etc/NEWS b/etc/NEWS >> index 07a78216b8..52774b3463 100644 >> --- a/etc/NEWS >> +++ b/etc/NEWS >> @@ -2800,6 +2800,14 @@ never be narrower than 19 characters. >> 'gomoku-move-sw' and 'gomoku-move-ne' now work correctly, and >> horizontal movements now stop at the edge of the board. >> >> ++++ >> +*** New diary sexp 'diary-offset'. >> +It offsets another diary sexp by a number of days. 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. >> + >> ** xterm-mouse mode >> >> --- >> diff --git a/lisp/calendar/diary-lib.el >> b/lisp/calendar/diary-lib.el >> index f57fe26058..f71392b97f 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. Offsets SEXP by DAYS days. >> +Entry applies if the date is DAYS days after another >> diary-sexp >> SEXP." >> + (with-no-warnings (defvar date)) >> + (or (integerp days) (user-error "Days must be an integer")) >> + (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)) >> diff --git a/test/lisp/calendar/icalendar-tests.el >> b/test/lisp/calendar/icalendar-tests.el >> index 6973f7e5c9..de2a891758 100644 >> --- a/test/lisp/calendar/icalendar-tests.el >> +++ b/test/lisp/calendar/icalendar-tests.el >> @@ -1442,6 +1442,13 @@ icalendar-real-world >> SUMMARY:ff birthday (%d years old)") >> >> >> + (icalendar-tests--test-export >> + nil >> + nil >> + "%%(diary-offset '(diary-float t 3 4) 1) asdf" >> + nil) >> + >> + >> ;; FIXME! >> >> ;; export 2004-10-28 monthly, weekly entries >> -- 2.33.0 >> >> >> Yuchen Pei writes: >> >>> Thanks for the comments. >>> Eli Zaretskii writes: >>> >>>>> From: Yuchen Pei >>>>> Date: Wed, 25 Aug 2021 13:46:48 +1000 >>>>> See below my first patch to Emacs. The copyright assignment >>>>> has >>>>> already been done BTW. >>>> >>>> Congrats, and welcome aboard. >>>> >>>>> Let me know what you think. >>>> >>>> Some minor comments below. >>>> >>>>> Would you like me to add some tests? >>>> >>>> Adding more tests is always welcome, thanks. >>> >>> All diary sexp tests are in icalendar tests, but diary-offset >>> does >>> not >>> easily translate to icalendar events (exporting to icalendar >>> for >>> this >>> sexp is rather complicated if not impossible as it applies on >>> top >>> of >>> another arbitrary sexp), so I am just adding a simple >>> no-op-like >>> test. >>> >>>> >>>>> Subject: [PATCH] Adding diary-offset, a diary-sexp >>>>> offsetting >>>>> another >>>>> diary-sexp. >>>> >>>> "git am" uses the Subject for the heading line, and this >>>> Subject >>>> is >>>> too long for that. Please consider making it shorter. >>> >>> Done. >>> >>>> >>>>> 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. >>>> >>>> The commit log message should include a ChangeLog-style >>>> description >>>> of >>>> the files and functions where you made the changes. See >>>> CONTRIBUTE >>>> for more details about the format we prefer. >>>> >>>> Also, please in the next version include the bug number as >>>> part of >>>> the >>>> log message. >>> >>> Done. >>> >>>> >>>>> --- 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 >>>> >>>> That line is too long, and will overflow the page width in >>>> the >>>> printed >>>> version of the manual. Please break it in two. >>> >>> Done. I made it shorter :) >>> >>>> >>>>> +@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 >>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^ >>>> This should be in @code, not @samp. I'd also wrap it in >>>> @w{..}, >>>> so >>>> that it doesn't get broken between two lines. >>> >>> Done. >>> >>>> >>>>> +(defun diary-offset (sexp days) >>>>> + "Offsetted diary entry. >>>> >>>> The first line of a doc string should preferably mention the >>>> arguments, but without becoming too long, so it could still >>>> fit on >>>> a >>>> single line. >>> >>> Done. >>> >>>> >>>>> + (with-no-warnings (defvar date) (defvar entry)) >>>> >>>> Why did you need this? >>> >>> The sexp diary-offset itself requires the date supplied by >>> diary-sexp-entry. The sexp passed to diary-offset will ask >>> for >>> both >>> date and entry. Removed (defvar entry) as this is not needed >>> by >>> diary-offset. After the removel I tested it in org mode and >>> org >>> agenda and it works. >>> >>>> >>>>> + (integerp days) >>>> >>>> Isn't it better to use an assertion? >>> >>> Done. Added a user-error statement like in diary-cyclic. >>> >>>> >>>> Thanks. -- Best, Yuchen PGP Key: 47F9 D050 1E11 8879 9040 4941 2126 7E93 EF86 DFD0