Package: emacs;
Reported by: Yuchen Pei <hi <at> ypei.me>
Date: Wed, 25 Aug 2021 05:57:01 UTC
Severity: wishlist
Tags: patch
Fixed in version 28.1
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Yuchen Pei <hi <at> ypei.me> Cc: eliz <at> gnu.org, 50195 <at> debbugs.gnu.org Subject: bug#50195: [PATCH] Adding diary-offset to diary-lib.el Date: Thu, 26 Aug 2021 16:54:00 +1000
[Message part 1 (text/plain, inline)]
Sorry, forgot the attach the patch. Here it is.
[0001-Adding-diary-offset-to-diary-lib.el.patch (text/x-patch, inline)]
From 4df9db3eeb3b048579768050ae7bb413fefe9557 Mon Sep 17 00:00:00 2001 From: Yuchen Pei <hi <at> ypei.me> 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
[Message part 3 (text/plain, inline)]
Yuchen Pei <hi <at> ypei.me> writes: > Thanks for the comments. > Eli Zaretskii <eliz <at> gnu.org> writes: > >>> From: Yuchen Pei <hi <at> ypei.me> >>> 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 <https://ypei.me/assets/ypei-pubkey.txt>
[signature.asc (application/pgp-signature, inline)]
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.