unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
@ 2021-08-25  3:46 Yuchen Pei
  2021-08-25 11:31 ` Lars Ingebrigtsen
                   ` (2 more replies)
  0 siblings, 3 replies; 21+ messages in thread
From: Yuchen Pei @ 2021-08-25  3:46 UTC (permalink / raw)
  To: 50195


[-- Attachment #1.1: Type: text/plain, Size: 164 bytes --]

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?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: the patch --]
[-- Type: text/x-patch, Size: 2827 bytes --]

From d385b1bc02f2922fbff4496f81d4574d0abcf082 Mon Sep 17 00:00:00 2001
From: Yuchen Pei <hi@ypei.me>
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


[-- Attachment #1.3: Type: text/plain, Size: 131 bytes --]


-- 
Best,
Yuchen

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 243 bytes --]

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25  3:46 bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp Yuchen Pei
@ 2021-08-25 11:31 ` Lars Ingebrigtsen
  2021-08-25 11:52 ` Eli Zaretskii
  2021-08-26 10:26 ` bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp Michael Heerdegen
  2 siblings, 0 replies; 21+ messages in thread
From: Lars Ingebrigtsen @ 2021-08-25 11:31 UTC (permalink / raw)
  To: Yuchen Pei; +Cc: 50195

Yuchen Pei <hi@ypei.me> writes:

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

Looks useful -- some tests would be nice.

> +;; 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

The (integerp days) here doesn't do anything -- is it supposed to be
(when (integerp days)

?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25  3:46 bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp Yuchen Pei
  2021-08-25 11:31 ` Lars Ingebrigtsen
@ 2021-08-25 11:52 ` Eli Zaretskii
  2021-08-25 12:06   ` Lars Ingebrigtsen
  2021-08-26  6:49   ` bug#50195: [PATCH] Adding diary-offset to diary-lib.el Yuchen Pei
  2021-08-26 10:26 ` bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp Michael Heerdegen
  2 siblings, 2 replies; 21+ messages in thread
From: Eli Zaretskii @ 2021-08-25 11:52 UTC (permalink / raw)
  To: Yuchen Pei; +Cc: 50195

> From: Yuchen Pei <hi@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.

> 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.

> 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.

> --- 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.

> +@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.

> +(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.

> +  (with-no-warnings (defvar date) (defvar entry))

Why did you need this?

> +  (integerp days)

Isn't it better to use an assertion?

Thanks.





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25 11:52 ` Eli Zaretskii
@ 2021-08-25 12:06   ` Lars Ingebrigtsen
  2021-08-25 12:24     ` Eli Zaretskii
  2021-08-26  6:49   ` bug#50195: [PATCH] Adding diary-offset to diary-lib.el Yuchen Pei
  1 sibling, 1 reply; 21+ messages in thread
From: Lars Ingebrigtsen @ 2021-08-25 12:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Yuchen Pei, 50195

Eli Zaretskii <eliz@gnu.org> writes:

>> +  (with-no-warnings (defvar date) (defvar entry))
>
> Why did you need this?

It's how all these functions in diary-lib are defined after the lexical
rewrite -- the `eval' depends on those dynamic variables.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25 12:06   ` Lars Ingebrigtsen
@ 2021-08-25 12:24     ` Eli Zaretskii
  2021-08-25 12:38       ` Lars Ingebrigtsen
  2021-08-25 15:22       ` Michael Heerdegen
  0 siblings, 2 replies; 21+ messages in thread
From: Eli Zaretskii @ 2021-08-25 12:24 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: hi, 50195

> From: Lars Ingebrigtsen <larsi@gnus.org>
> Cc: Yuchen Pei <hi@ypei.me>,  50195@debbugs.gnu.org
> Date: Wed, 25 Aug 2021 14:06:02 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> +  (with-no-warnings (defvar date) (defvar entry))
> >
> > Why did you need this?
> 
> It's how all these functions in diary-lib are defined after the lexical
> rewrite -- the `eval' depends on those dynamic variables.

Ugh!  Is it worth it?  If we cannot convert these functions to use
lexical-binding, maybe we should say lexical-binding: nil in the first
line of the file, and remove all those gross kludges?





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25 12:24     ` Eli Zaretskii
@ 2021-08-25 12:38       ` Lars Ingebrigtsen
  2021-08-25 15:22       ` Michael Heerdegen
  1 sibling, 0 replies; 21+ messages in thread
From: Lars Ingebrigtsen @ 2021-08-25 12:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: hi, 50195

Eli Zaretskii <eliz@gnu.org> writes:

>> It's how all these functions in diary-lib are defined after the lexical
>> rewrite -- the `eval' depends on those dynamic variables.
>
> Ugh!  Is it worth it?  If we cannot convert these functions to use
> lexical-binding, maybe we should say lexical-binding: nil in the first
> line of the file, and remove all those gross kludges?

I think having all files lexically bound is a win in itself -- it means
that you know the Lisp dialect without looking at the mode line (and can
write code that depends on closures etc freely).

It does lead to these hacks here, yes, but it's already done, so...

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25 12:24     ` Eli Zaretskii
  2021-08-25 12:38       ` Lars Ingebrigtsen
@ 2021-08-25 15:22       ` Michael Heerdegen
  2021-08-25 15:32         ` Michael Heerdegen
  2021-08-25 16:07         ` Eli Zaretskii
  1 sibling, 2 replies; 21+ messages in thread
From: Michael Heerdegen @ 2021-08-25 15:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Lars Ingebrigtsen, hi, 50195

Eli Zaretskii <eliz@gnu.org> writes:

> > It's how all these functions in diary-lib are defined after the lexical
> > rewrite -- the `eval' depends on those dynamic variables.
>
> Ugh!  Is it worth it?  If we cannot convert these functions to use
> lexical-binding, maybe we should say lexical-binding: nil in the first
> line of the file, and remove all those gross kludges?

That would not work, you would still get warnings about free variables.

This case is a bit special and not directly related to lexical-binding
because these variables are just not declared with `defvar' (and I think
we don't want to introduce global variables like `date').

Michael.





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25 15:22       ` Michael Heerdegen
@ 2021-08-25 15:32         ` Michael Heerdegen
  2021-08-25 16:07         ` Eli Zaretskii
  1 sibling, 0 replies; 21+ messages in thread
From: Michael Heerdegen @ 2021-08-25 15:32 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Lars Ingebrigtsen, hi, 50195

Michael Heerdegen <michael_heerdegen@web.de> writes:

> This case is a bit special and not directly related to lexical-binding
> because these variables are just not declared with `defvar' (and I think
> we don't want to introduce global variables like `date').

(defvar date) could work, but note that the code uses `date' as function
argument variable as well, so adding this would introduce "shadowing"
warnings for these appearances.

Michael.





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25 15:22       ` Michael Heerdegen
  2021-08-25 15:32         ` Michael Heerdegen
@ 2021-08-25 16:07         ` Eli Zaretskii
  2021-08-25 16:22           ` Michael Heerdegen
  1 sibling, 1 reply; 21+ messages in thread
From: Eli Zaretskii @ 2021-08-25 16:07 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: larsi, hi, 50195

> From: Michael Heerdegen <michael_heerdegen@web.de>
> Cc: Lars Ingebrigtsen <larsi@gnus.org>,  hi@ypei.me,  50195@debbugs.gnu.org
> Date: Wed, 25 Aug 2021 17:22:04 +0200
> 
> > Ugh!  Is it worth it?  If we cannot convert these functions to use
> > lexical-binding, maybe we should say lexical-binding: nil in the first
> > line of the file, and remove all those gross kludges?
> 
> That would not work, you would still get warnings about free variables.

I don't understand.  This code did compile under dynamic-binding, so
what warnings did you have in mind?

> This case is a bit special and not directly related to lexical-binding
> because these variables are just not declared with `defvar' (and I think
> we don't want to introduce global variables like `date').

You are saying this always emitted warnings?





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25 16:07         ` Eli Zaretskii
@ 2021-08-25 16:22           ` Michael Heerdegen
  2021-08-26  6:52             ` Yuchen Pei
  0 siblings, 1 reply; 21+ messages in thread
From: Michael Heerdegen @ 2021-08-25 16:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, hi, 50195

Eli Zaretskii <eliz@gnu.org> writes:

> > That would not work, you would still get warnings about free variables.
>
> I don't understand.  This code did compile under dynamic-binding, so
> what warnings did you have in mind?

You can just try, they look like

| In diary-list-entries-1:
| diary-lib.el:731:17: Warning: reference to free variable ‘number’
| diary-lib.el:734:48: Warning: reference to free variable ‘list-only’

I just removed lexical-binding from the header and commented the
`with-no-warnings' call in `diary-list-entries-1'.

> > This case is a bit special and not directly related to lexical-binding
> > because these variables are just not declared with `defvar' (and I think
> > we don't want to introduce global variables like `date').
>
> You are saying this always emitted warnings?

AFAIR there have been problems with these variables and warnings about
them for a long time, and different measures to handle them.  I think
(I'm not sure) we had (defvar date) in the file in the past.  If you
want to have any useful information you must ask Stefan, he was the one
that worked on that.

Michael.





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset to diary-lib.el
  2021-08-25 11:52 ` Eli Zaretskii
  2021-08-25 12:06   ` Lars Ingebrigtsen
@ 2021-08-26  6:49   ` Yuchen Pei
  2021-08-26  6:54     ` Yuchen Pei
  1 sibling, 1 reply; 21+ messages in thread
From: Yuchen Pei @ 2021-08-26  6:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 50195

[-- Attachment #1: Type: text/plain, Size: 3464 bytes --]

Thanks for the comments.
Eli Zaretskii <eliz@gnu.org> writes:

>> From: Yuchen Pei <hi@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>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 243 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25 16:22           ` Michael Heerdegen
@ 2021-08-26  6:52             ` Yuchen Pei
  2021-08-26  9:26               ` Michael Heerdegen
  0 siblings, 1 reply; 21+ messages in thread
From: Yuchen Pei @ 2021-08-26  6:52 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: larsi, 50195

[-- Attachment #1: Type: text/plain, Size: 1548 bytes --]


Michael Heerdegen <michael_heerdegen@web.de> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> > That would not work, you would still get warnings about free 
>> > variables.
>>
>> I don't understand.  This code did compile under 
>> dynamic-binding, so
>> what warnings did you have in mind?
>
> You can just try, they look like
>
> | In diary-list-entries-1:
> | diary-lib.el:731:17: Warning: reference to free variable 
> ‘number’
> | diary-lib.el:734:48: Warning: reference to free variable 
> ‘list-only’
>
> I just removed lexical-binding from the header and commented the
> `with-no-warnings' call in `diary-list-entries-1'.

Which command did you use to compile?  I compiled with just `make` 
and there was no warning.

>
>> > This case is a bit special and not directly related to 
>> > lexical-binding
>> > because these variables are just not declared with `defvar' 
>> > (and I think
>> > we don't want to introduce global variables like `date').
>>
>> You are saying this always emitted warnings?
>
> AFAIR there have been problems with these variables and warnings 
> about
> them for a long time, and different measures to handle them.  I 
> think
> (I'm not sure) we had (defvar date) in the file in the past.  If 
> you
> want to have any useful information you must ask Stefan, he was 
> the one
> that worked on that.
>
> Michael.


-- 
Best,
Yuchen

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 243 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset to diary-lib.el
  2021-08-26  6:49   ` bug#50195: [PATCH] Adding diary-offset to diary-lib.el Yuchen Pei
@ 2021-08-26  6:54     ` Yuchen Pei
  2021-08-27 13:16       ` Yuchen Pei
  0 siblings, 1 reply; 21+ messages in thread
From: Yuchen Pei @ 2021-08-26  6:54 UTC (permalink / raw)
  Cc: 50195


[-- Attachment #1.1: Type: text/plain, Size: 49 bytes --]

Sorry, forgot the attach the patch. Here it is.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: 0001-Adding-diary-offset-to-diary-lib.el.patch --]
[-- Type: text/x-patch, Size: 3989 bytes --]

From 4df9db3eeb3b048579768050ae7bb413fefe9557 Mon Sep 17 00:00:00 2001
From: Yuchen Pei <hi@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


[-- Attachment #1.3: Type: text/plain, Size: 3638 bytes --]


Yuchen Pei <hi@ypei.me> writes:

> Thanks for the comments.
> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> From: Yuchen Pei <hi@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>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 243 bytes --]

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-26  6:52             ` Yuchen Pei
@ 2021-08-26  9:26               ` Michael Heerdegen
  0 siblings, 0 replies; 21+ messages in thread
From: Michael Heerdegen @ 2021-08-26  9:26 UTC (permalink / raw)
  To: Yuchen Pei; +Cc: larsi, 50195

[-- Attachment #1: Type: text/plain, Size: 398 bytes --]

Yuchen Pei <hi@ypei.me> writes:

> > I just removed lexical-binding from the header and commented the
> > `with-no-warnings' call in `diary-list-entries-1'.
>
> Which command did you use to compile?  I compiled with just `make` and
> there was no warning.

B from dired.  But I get these warnings also with "make", just tried now
(using master).

To avoid misunderstandings, this is what I tried:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Test-warnings-in-diary-lib.patch --]
[-- Type: text/x-diff, Size: 1073 bytes --]

From b1f973c7c5ed6591bb7132b9254ee549f44162d2 Mon Sep 17 00:00:00 2001
From: Michael Heerdegen <michael_heerdegen@web.de>
Date: Thu, 26 Aug 2021 11:21:14 +0200
Subject: [PATCH] Test warnings in diary-lib

---
 lisp/calendar/diary-lib.el | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el
index f57fe26058..8044768476 100644
--- a/lisp/calendar/diary-lib.el
+++ b/lisp/calendar/diary-lib.el
@@ -1,4 +1,4 @@
-;;; diary-lib.el --- diary functions  -*- lexical-binding:t -*-
+;;; diary-lib.el --- diary functions

 ;; Copyright (C) 1989-1990, 1992-1995, 2001-2021 Free Software
 ;; Foundation, Inc.
@@ -726,7 +726,6 @@ diary-list-entries-1
 MONTHS is an array of month names.  SYMBOL marks diary entries of the type
 in question.  ABSFUNC is a function that converts absolute dates to dates
 of the appropriate type."
-  (with-no-warnings (defvar number) (defvar list-only))
   (let ((gdate original-date))
     (dotimes (_ number)
       (diary-list-entries-2
--
2.30.2


[-- Attachment #3: Type: text/plain, Size: 11 bytes --]



Michael.

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-25  3:46 bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp Yuchen Pei
  2021-08-25 11:31 ` Lars Ingebrigtsen
  2021-08-25 11:52 ` Eli Zaretskii
@ 2021-08-26 10:26 ` Michael Heerdegen
  2021-08-27 13:11   ` Yuchen Pei
  2 siblings, 1 reply; 21+ messages in thread
From: Michael Heerdegen @ 2021-08-26 10:26 UTC (permalink / raw)
  To: Yuchen Pei; +Cc: 50195

Yuchen Pei <hi@ypei.me> writes:

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

Because we are just talking about it: my personal solution for this kind
of problem: I extended the diary language with some date arithmetic
functions and a `date-let' macro, that allows you to solve the same task
like

  (date-let ((date+ date 2))
    SEXP)

An advantage is that this saves one layer of `eval', and it allows the
delta of days to be an expression (that might depend on the DATE).

I also worked on finer grained solutions for the problems of the kind
"every Nth Xday of the month unless it's a day that fulfills some TEST
(e.g., it's a holiday), then use an alternative date.  Useful for
specifying rules for garbage collection (real-life garbage, not Emacs
gc).

I planned to provide these things as a separate library, and I'm not
against what has been supposed here, just wanted to mention an
alternative view on the problem.

Michael.





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp.
  2021-08-26 10:26 ` bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp Michael Heerdegen
@ 2021-08-27 13:11   ` Yuchen Pei
  0 siblings, 0 replies; 21+ messages in thread
From: Yuchen Pei @ 2021-08-27 13:11 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 50195

[-- Attachment #1: Type: text/plain, Size: 1410 bytes --]


Michael Heerdegen <michael_heerdegen@web.de> writes:

> Yuchen Pei <hi@ypei.me> writes:
>
>> A bit like diary-remind, as a diary-sexp rather than reminder, 
>> and
>> also support both positive and negative offsets.
>
> Because we are just talking about it: my personal solution for 
> this kind
> of problem: I extended the diary language with some date 
> arithmetic
> functions and a `date-let' macro, that allows you to solve the 
> same task
> like
>
>   (date-let ((date+ date 2))
>     SEXP)
>
> An advantage is that this saves one layer of `eval', and it 
> allows the
> delta of days to be an expression (that might depend on the 
> DATE).

Interesting - I never thought of defining my own let macro.

>
> I also worked on finer grained solutions for the problems of the 
> kind
> "every Nth Xday of the month unless it's a day that fulfills 
> some TEST
> (e.g., it's a holiday), then use an alternative date.  Useful 
> for
> specifying rules for garbage collection (real-life garbage, not 
> Emacs
> gc).
>
> I planned to provide these things as a separate library, and I'm 
> not
> against what has been supposed here, just wanted to mention an
> alternative view on the problem.

Thanks, I'll be curious to see your library when it gets 
published.

>
> Michael.


-- 
Best,
Yuchen

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 243 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset to diary-lib.el
  2021-08-26  6:54     ` Yuchen Pei
@ 2021-08-27 13:16       ` Yuchen Pei
  2021-09-03 22:40         ` Yuchen Pei
  0 siblings, 1 reply; 21+ messages in thread
From: Yuchen Pei @ 2021-08-27 13:16 UTC (permalink / raw)
  To: eliz, 50195

[-- Attachment #1: Type: text/plain, Size: 8273 bytes --]

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.
Yuchen Pei <hi@ypei.me> writes:

> Sorry, forgot the attach the patch. Here it is.
>
> From 4df9db3eeb3b048579768050ae7bb413fefe9557 Mon Sep 17 
> 00:00:00 2001
> From: Yuchen Pei <hi@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
>
>
> Yuchen Pei <hi@ypei.me> writes:
>
>> Thanks for the comments.
>> Eli Zaretskii <eliz@gnu.org> writes:
>>
>>>> From: Yuchen Pei <hi@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>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 243 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset to diary-lib.el
  2021-08-27 13:16       ` Yuchen Pei
@ 2021-09-03 22:40         ` Yuchen Pei
  2021-09-04  6:15           ` Eli Zaretskii
  0 siblings, 1 reply; 21+ messages in thread
From: Yuchen Pei @ 2021-09-03 22:40 UTC (permalink / raw)
  To: 50195

[-- Attachment #1: Type: text/plain, Size: 8644 bytes --]


Yuchen Pei <hi@ypei.me> 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 <hi@ypei.me> writes:
>
>> Sorry, forgot the attach the patch. Here it is.
>>
>> From 4df9db3eeb3b048579768050ae7bb413fefe9557 Mon Sep 17 
>> 00:00:00
>> 2001
>> From: Yuchen Pei <hi@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
>>
>>
>> Yuchen Pei <hi@ypei.me> writes:
>>
>>> Thanks for the comments.
>>> Eli Zaretskii <eliz@gnu.org> writes:
>>>
>>>>> From: Yuchen Pei <hi@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>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 243 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset to diary-lib.el
  2021-09-03 22:40         ` Yuchen Pei
@ 2021-09-04  6:15           ` Eli Zaretskii
  2021-09-04  6:29             ` Lars Ingebrigtsen
  0 siblings, 1 reply; 21+ messages in thread
From: Eli Zaretskii @ 2021-09-04  6:15 UTC (permalink / raw)
  To: Yuchen Pei; +Cc: 50195

> From: Yuchen Pei <hi@ypei.me>
> Cc: eliz@gnu.org
> Date: Sat, 04 Sep 2021 08:40:07 +1000
> 
> Yuchen Pei <hi@ypei.me> 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?

I have no further comments.





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset to diary-lib.el
  2021-09-04  6:15           ` Eli Zaretskii
@ 2021-09-04  6:29             ` Lars Ingebrigtsen
  2021-09-04  7:21               ` Yuchen Pei
  0 siblings, 1 reply; 21+ messages in thread
From: Lars Ingebrigtsen @ 2021-09-04  6:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Yuchen Pei, 50195

Eli Zaretskii <eliz@gnu.org> 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?
>
> I have no further comments.

Looks good to me, so I've pushed it to Emacs 28 (with some trivial
changes).

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#50195: [PATCH] Adding diary-offset to diary-lib.el
  2021-09-04  6:29             ` Lars Ingebrigtsen
@ 2021-09-04  7:21               ` Yuchen Pei
  0 siblings, 0 replies; 21+ messages in thread
From: Yuchen Pei @ 2021-09-04  7:21 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 50195

[-- Attachment #1: Type: text/plain, Size: 698 bytes --]


Lars Ingebrigtsen <larsi@gnus.org> writes:

> Eli Zaretskii <eliz@gnu.org> 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?
>>
>> I have no further comments.
>
> Looks good to me, so I've pushed it to Emacs 28 (with some 
> trivial
> changes).

Cool, thanks!

-- 
Best,
Yuchen

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 243 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2021-09-04  7:21 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-08-25  3:46 bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp Yuchen Pei
2021-08-25 11:31 ` Lars Ingebrigtsen
2021-08-25 11:52 ` Eli Zaretskii
2021-08-25 12:06   ` Lars Ingebrigtsen
2021-08-25 12:24     ` Eli Zaretskii
2021-08-25 12:38       ` Lars Ingebrigtsen
2021-08-25 15:22       ` Michael Heerdegen
2021-08-25 15:32         ` Michael Heerdegen
2021-08-25 16:07         ` Eli Zaretskii
2021-08-25 16:22           ` Michael Heerdegen
2021-08-26  6:52             ` Yuchen Pei
2021-08-26  9:26               ` Michael Heerdegen
2021-08-26  6:49   ` bug#50195: [PATCH] Adding diary-offset to diary-lib.el Yuchen Pei
2021-08-26  6:54     ` Yuchen Pei
2021-08-27 13:16       ` Yuchen Pei
2021-09-03 22:40         ` Yuchen Pei
2021-09-04  6:15           ` Eli Zaretskii
2021-09-04  6:29             ` Lars Ingebrigtsen
2021-09-04  7:21               ` Yuchen Pei
2021-08-26 10:26 ` bug#50195: [PATCH] Adding diary-offset, a diary-sexp offsetting another diary-sexp Michael Heerdegen
2021-08-27 13:11   ` Yuchen Pei

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).