emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* org-bbdb-birthday reminder
@ 2015-07-29 13:41 Julien Cubizolles
  2015-08-12 20:55 ` Matt Lundin
  0 siblings, 1 reply; 18+ messages in thread
From: Julien Cubizolles @ 2015-07-29 13:41 UTC (permalink / raw)
  To: emacs-orgmode

I'm using org-bbdb-anniversaries to use the bbdb-anniversaries. At the
moment, it only displays the birthdays of the day. How can I generate a
reminder for a few days before the actual birthday ?

Julien.

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

* Re: org-bbdb-birthday reminder
  2015-07-29 13:41 org-bbdb-birthday reminder Julien Cubizolles
@ 2015-08-12 20:55 ` Matt Lundin
  2015-08-13  1:36   ` Nick Dokos
  2015-08-13  6:35   ` Julien Cubizolles
  0 siblings, 2 replies; 18+ messages in thread
From: Matt Lundin @ 2015-08-12 20:55 UTC (permalink / raw)
  To: Julien Cubizolles; +Cc: emacs-orgmode

Julien Cubizolles <j.cubizolles@free.fr> writes:

> I'm using org-bbdb-anniversaries to use the bbdb-anniversaries. At the
> moment, it only displays the birthdays of the day. How can I generate a
> reminder for a few days before the actual birthday ?

This is not possible at the moment with bbdb-anniversaries. 

For advanced reminders of birthdays and the like, you could use a
diary-sexp:

%%(diary-remind '(org-anniversary 1996 8 20) -7) Someone turns %s

Best,
Matt

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

* Re: org-bbdb-birthday reminder
  2015-08-12 20:55 ` Matt Lundin
@ 2015-08-13  1:36   ` Nick Dokos
  2015-08-13  6:35   ` Julien Cubizolles
  1 sibling, 0 replies; 18+ messages in thread
From: Nick Dokos @ 2015-08-13  1:36 UTC (permalink / raw)
  To: emacs-orgmode

Matt Lundin <mdl@imapmail.org> writes:

> Julien Cubizolles <j.cubizolles@free.fr> writes:
>
>> I'm using org-bbdb-anniversaries to use the bbdb-anniversaries. At the
>> moment, it only displays the birthdays of the day. How can I generate a
>> reminder for a few days before the actual birthday ?
>
> This is not possible at the moment with bbdb-anniversaries. 
>
> For advanced reminders of birthdays and the like, you could use a
> diary-sexp:
>
> %%(diary-remind '(org-anniversary 1996 8 20) -7) Someone turns %s
>

org-bbdb-anniversaries depends on having a dynamically bound variable
called 'date' in the format (month day year) and produces the list
of anniversaries for that particular date. Instead of doing

%%(org-bbdb-anniversaries)

you could do

%%(let ((date '(9 1 2015))) (org-bbdb-anniversaries))

which produces the anniversaries for 2015-09-01,
no matter what the current date is. That's silly of
course but you could take advantage of it as follows:
you could define your own function and do

%%(my-anniversaries)

org-bbdb-anniversaries produces a list of strings, one string for each
anniversary falling on the given date. So your function
would have to calculate the list of dates that it wants anniversaries
for, and for each date d in that list calculate the list of
anniversaries for that date:

   (let ((date d)) (org-bbdb-anniversaries))

probably annotating each string in the resulting list with the date of
the anniversary and accumulating it in a single list, which it would
then return.

Obviously lots of details are missing - nevertheless, I hope it helps
a bit.

Nick

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

* Re: org-bbdb-birthday reminder
  2015-08-12 20:55 ` Matt Lundin
  2015-08-13  1:36   ` Nick Dokos
@ 2015-08-13  6:35   ` Julien Cubizolles
  2015-08-13 13:07     ` Matt Lundin
  1 sibling, 1 reply; 18+ messages in thread
From: Julien Cubizolles @ 2015-08-13  6:35 UTC (permalink / raw)
  To: Matt Lundin; +Cc: emacs-orgmode

Matt Lundin <mdl@imapmail.org> writes:


> This is not possible at the moment with bbdb-anniversaries. 

I thought someone would have felt the need to have this list of upcoming
birthdays. I'm guess not so many of you always end up rushing to buy
presents in the last days the way I dO.

> For advanced reminders of birthdays and the like, you could use a
> diary-sexp:
>
> %%(diary-remind '(org-anniversary 1996 8 20) -7) Someone turns %s

I'll give it a try thanks, but you need one line per birthday you want
to be reminded of. It would be much easier to have just a field in bbdb
to select these contatcs.

Julien.

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

* Re: org-bbdb-birthday reminder
  2015-08-13  6:35   ` Julien Cubizolles
@ 2015-08-13 13:07     ` Matt Lundin
  2015-08-14  0:26       ` Nick Dokos
  0 siblings, 1 reply; 18+ messages in thread
From: Matt Lundin @ 2015-08-13 13:07 UTC (permalink / raw)
  To: Julien Cubizolles; +Cc: emacs-orgmode

Julien Cubizolles <j.cubizolles@free.fr> writes:

> Matt Lundin <mdl@imapmail.org> writes:
>
>> For advanced reminders of birthdays and the like, you could use a
>> diary-sexp:
>>
>> %%(diary-remind '(org-anniversary 1996 8 20) -7) Someone turns %s
>
> I'll give it a try thanks, but you need one line per birthday you want
> to be reminded of. It would be much easier to have just a field in bbdb
> to select these contatcs.

You could use a "calendar" agenda to look for upcoming birthdays
generated by org-bbdb-anniversaries:

--8<---------------cut here---------------start------------->8---
(add-to-list 'org-agenda-custom-commands
             '("c" "Calendar" agenda ""
                ((org-agenda-span 'month) 
                 (org-agenda-time-grid nil) ;;
                 (org-agenda-entry-types '(:timestamp :sexp)))))
--8<---------------cut here---------------end--------------->8---

If (for speed's sake) you wanted to limit the calendar just to
birthdays, you could create an org file with a single headline:

--8<---------------cut here---------------start------------->8---
* Birthdays
%%(org-bbdb-anniversaries)
--8<---------------cut here---------------end--------------->8---

...and then add an org-agenda-files line that points just to that
minimal file to the custom command above.

Matt

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

* Re: org-bbdb-birthday reminder
  2015-08-13 13:07     ` Matt Lundin
@ 2015-08-14  0:26       ` Nick Dokos
  2015-08-14 14:30         ` Matt Lundin
  0 siblings, 1 reply; 18+ messages in thread
From: Nick Dokos @ 2015-08-14  0:26 UTC (permalink / raw)
  To: emacs-orgmode

Here's a quick implementation of the method I described earlier
in the thread:

--8<---------------cut here---------------start------------->8---
;;; Return list of anniversaries for today and the next n (default: 7) days.
;;; This is meant to be used in an org file instead of org-bbdb-anniversaries:
;;;
;;; %%(my-anniversaries)
;;;
;;; or
;;; %%(my-anniversaries 3)
;;;
;;; to override the 7-day default.

(defun date-list (date &optional n)
  "Return a list of dates in (m d y) format from 'date' to n days hence."
  (if (not n) (setq n 7))
  (let ((abs (calendar-absolute-from-gregorian date))
        (i 0)
        ret)
    (while (<= i n)
      (setq ret (cons (calendar-gregorian-from-absolute (+ abs i)) ret))
      (setq i (1+ i)))
    (reverse ret)))

(defun annotate-link-with-date (d l)
  "Annotate text of each element of l with the anniversary date.
  The assumption is that the text is a bbdb link  of the form
  [[bbdb:name][Description]] and the annotation
  is added to the description."
  (let ((f (lambda (x)
             (string-match "]]" x)
             (replace-match (format " -- %d-%d-%d\\&" (caddr d) (car d) (cadr d)) nil nil x))))
    (mapcar f l)))

(defun my-anniversaries (&optional n)
  "Return list of anniversaries for today and the next n days (default 7).
'date' is dynamically bound."
  (let ((dates (date-list date n))
        (f (lambda (d) (let ((date d)) (annotate-link-with-date d (org-bbdb-anniversaries))))))
    (delete nil (mapcan f dates))))
    
--8<---------------cut here---------------end--------------->8---

Lightly tested. Hope it helps

-- 
Nick

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

* Re: org-bbdb-birthday reminder
  2015-08-14  0:26       ` Nick Dokos
@ 2015-08-14 14:30         ` Matt Lundin
  2015-08-15 18:24           ` Julien Cubizolles
  2015-08-16 13:46           ` org-bbdb-birthday reminder Bastien Guerry
  0 siblings, 2 replies; 18+ messages in thread
From: Matt Lundin @ 2015-08-14 14:30 UTC (permalink / raw)
  To: Nick Dokos; +Cc: emacs-orgmode

Nick Dokos <ndokos@gmail.com> writes:

> Here's a quick implementation of the method I described earlier
> in the thread:

This works great. Thanks! Perhaps we could integrate something like this
into org-bbdb.el...

Matt

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

* Re: org-bbdb-birthday reminder
  2015-08-14 14:30         ` Matt Lundin
@ 2015-08-15 18:24           ` Julien Cubizolles
  2015-08-16 17:25             ` [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder] Nick Dokos
  2015-08-16 13:46           ` org-bbdb-birthday reminder Bastien Guerry
  1 sibling, 1 reply; 18+ messages in thread
From: Julien Cubizolles @ 2015-08-15 18:24 UTC (permalink / raw)
  To: Matt Lundin; +Cc: Nick Dokos, emacs-orgmode

Matt Lundin <mdl@imapmail.org> writes:

> Nick Dokos <ndokos@gmail.com> writes:
>
>> Here's a quick implementation of the method I described earlier
>> in the thread:
>
> This works great. Thanks! Perhaps we could integrate something like this
> into org-bbdb.el...

I second that. It's exactly what I was looking for.

Thanks,

Julien.

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

* Re: org-bbdb-birthday reminder
  2015-08-14 14:30         ` Matt Lundin
  2015-08-15 18:24           ` Julien Cubizolles
@ 2015-08-16 13:46           ` Bastien Guerry
  1 sibling, 0 replies; 18+ messages in thread
From: Bastien Guerry @ 2015-08-16 13:46 UTC (permalink / raw)
  To: Matt Lundin; +Cc: Nick Dokos, emacs-orgmode

Hi Matt and Nick,

Matt Lundin <mdl@imapmail.org> writes:

> Nick Dokos <ndokos@gmail.com> writes:
>
>> Here's a quick implementation of the method I described earlier
>> in the thread:
>
> This works great. Thanks! Perhaps we could integrate something like this
> into org-bbdb.el...

Agreed.  Nick, would you like to provide a patch against master?

Thanks in advance!

-- 
 Bastien

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

* [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder]
  2015-08-15 18:24           ` Julien Cubizolles
@ 2015-08-16 17:25             ` Nick Dokos
  2015-08-17  9:16               ` Nicolas Goaziou
  0 siblings, 1 reply; 18+ messages in thread
From: Nick Dokos @ 2015-08-16 17:25 UTC (permalink / raw)
  To: emacs-orgmode

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

Julien Cubizolles <j.cubizolles@free.fr> writes:

> Matt Lundin <mdl@imapmail.org> writes:
>
>> Nick Dokos <ndokos@gmail.com> writes:
>>
>>> Here's a quick implementation of the method I described earlier
>>> in the thread:
>>
>> This works great. Thanks! Perhaps we could integrate something like this
>> into org-bbdb.el...
>
> I second that. It's exactly what I was looking for.
>

Here's a patch to add a new function to org-bbdb.el that provides early
warning for upcoming anniversaries; it also adds some documentation to
org.texi.

I cleaned up the implementation a bit: the date list is produced in a
somewhat more lisp-ish way, the other helper functions have been moved
into the new org-bbdb-anniversaries-future function to avoid polluting
the name space. I could probably move the date list function in there as
well, but it seems generic enough that it should be independently
available.

The meaning of the optional argument has changed: in the previous
version, it meant "today plus the next n days"; now it means "today plus
the next (n-1) days".

Let me know what you think.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Allow early-warning anniversaries in agenda --]
[-- Type: text/x-patch, Size: 3829 bytes --]

From ba42045c9905e698db1bd62a2d547c29a9e9f097 Mon Sep 17 00:00:00 2001
From: Nick Dokos <ndokos@gmail.com>
Date: Sun, 16 Aug 2015 12:22:55 -0400
Subject: [PATCH] Allow early-warning anniversaries in agenda.

* lisp/org-bbdb.el (org-bbdb-anniversaries-future, org-bbdb-date-list): New functions.

* doc/org.texi: Document the usage of `org-bbdb-anniversaries-future'.

Feature requested by Julien Cubizolles:

http://thread.gmane.org/gmane.emacs.orgmode/99344
---
 doc/org.texi     | 14 ++++++++++++++
 lisp/org-bbdb.el | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+)

diff --git a/doc/org.texi b/doc/org.texi
index b23be03..927ecbd 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -8046,6 +8046,20 @@ hash with anniversaries.  However, from then on things will be very fast---much
 faster in fact than a long list of @samp{%%(diary-anniversary)} entries
 in an Org or Diary file.
 
+If you would like to see upcoming anniversaries with a bit of forewarning,
+you can use the following instead:
+
+@example
+* Anniversaries
+  :PROPERTIES:
+  :CATEGORY: Anniv
+  :END:
+%%(org-bbdb-anniversaries-future 3)
+@end example
+
+That will give you three days' warning: on the anniversary date itself and the
+two days prior. The argument is optional: if omitted, it defaults to 7.
+
 @subsubheading Appointment reminders
 @cindex @file{appt.el}
 @cindex appointment reminders
diff --git a/lisp/org-bbdb.el b/lisp/org-bbdb.el
index c489385..7c717d7 100644
--- a/lisp/org-bbdb.el
+++ b/lisp/org-bbdb.el
@@ -397,6 +397,58 @@ This is used by Org to re-create the anniversary hash table."
         ))
     text))
 
+;;; Return list of anniversaries for today and the next n-1 (default: n=7) days.
+;;; This is meant to be used in an org file instead of org-bbdb-anniversaries:
+;;;
+;;; %%(org-bbdb-anniversaries-future)
+;;;
+;;; or
+;;;
+;;; %%(org-bbdb-anniversaries-future 3)
+;;;
+;;; to override the 7-day default.
+
+(defun org-bbdb-date-list (date n)
+  "Return a list of dates in (m d y) format from the given 'date' to n-1 days hence."
+  (let ((abs (calendar-absolute-from-gregorian date))
+        ret)
+    (reverse (dotimes (i n ret)
+	       (setq ret (cons (calendar-gregorian-from-absolute (+ abs i)) ret))))))
+
+;;;###autoload
+(defun org-bbdb-anniversaries-future (&optional n)
+  "Return list of anniversaries for today and the next n-1 days (default n=7)."
+  (if (not n) (setq n 7))
+  (if (<= n 0) nil
+    (let* (
+	   ;; list of relevant dates.
+	   (dates (org-bbdb-date-list date n))
+	   ;; Function to annotate text of each element of l with the anniversary date d.
+	   (annotate-descriptions
+	    (lambda (d l)
+	      (let ((modify-description
+		     (lambda (x)
+		       ;; The assumption here is that x is a bbdb link of the form
+		       ;; [[bbdb:name][description]]
+		       ;; This function rather arbitrarily modifies the description
+		       ;; by adding the date to it in a fixed format.
+		       (string-match "]]" x)
+		       (replace-match (format " -- %d-%02d-%02d\\&" (third d) (first d) (second d))
+				      nil nil x))))
+		(mapcar modify-description l))))
+	   ;; Function to generate the list of annotated anniversaries
+	   ;; for the given date d.
+	   (gen-anniversaries
+	    (lambda (d)
+	      (let ((date d))
+		;; rebind 'date' so that org-bbdb-anniversaries will be
+		;; fooled into giving us the list for the given date
+		;; and then annotate the descriptions for that date.
+		(funcall annotate-descriptions d (org-bbdb-anniversaries))))))
+      ;; map the gen-anniversaries function over the dates
+      ;; and nconc the results into a single list
+      (apply 'nconc (mapcar gen-anniversaries dates)))))
+
 (defun org-bbdb-complete-link ()
   "Read a bbdb link with name completion."
   (require 'bbdb-com)
-- 
2.4.3


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


Thanks!
-- 
Nick

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

* Re: [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder]
  2015-08-16 17:25             ` [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder] Nick Dokos
@ 2015-08-17  9:16               ` Nicolas Goaziou
  2015-08-17 16:42                 ` Nick Dokos
  0 siblings, 1 reply; 18+ messages in thread
From: Nicolas Goaziou @ 2015-08-17  9:16 UTC (permalink / raw)
  To: Nick Dokos; +Cc: emacs-orgmode

Hello,

Nick Dokos <ndokos@gmail.com> writes:

> Here's a patch to add a new function to org-bbdb.el that provides early
> warning for upcoming anniversaries; it also adds some documentation to
> org.texi.

Thank you. Some comments follow.

> +(defun org-bbdb-date-list (date n)
> +  "Return a list of dates in (m d y) format from the given 'date' to n-1 days hence."
> +  (let ((abs (calendar-absolute-from-gregorian date))
> +        ret)
> +    (reverse (dotimes (i n ret)
> +	       (setq ret (cons (calendar-gregorian-from-absolute (+ abs i)) ret))))))

  (dotimes (i n (nreverse ret))
    (push (calendar-gregorian-from-absolute (+ abs i)) ret))

> +
> +;;;###autoload
> +(defun org-bbdb-anniversaries-future (&optional n)
> +  "Return list of anniversaries for today and the next n-1 days (default n=7)."
> +  (if (not n) (setq n 7))

  (let ((n (or n 7)))
    (when (<= n 0) (error "..."))
    (let* (...)))
 
> +  (if (<= n 0) nil
> +    (let* (
> +	   ;; list of relevant dates.

You need to capitalize comments.

> +	   (dates (org-bbdb-date-list date n))
> +	   ;; Function to annotate text of each element of l with the anniversary date d.
> +	   (annotate-descriptions
> +	    (lambda (d l)
> +	      (let ((modify-description
> +		     (lambda (x)
> +		       ;; The assumption here is that x is a bbdb link of the form
> +		       ;; [[bbdb:name][description]]
> +		       ;; This function rather arbitrarily modifies the description
> +		       ;; by adding the date to it in a fixed format.

Missing full stop in first sentence.

> +		       (string-match "]]" x)
> +		       (replace-match (format " -- %d-%02d-%02d\\&" (third d) (first d) (second d))
> +				      nil nil x))))
> +		(mapcar modify-description l))))

Why don't you simply write

  (mapcar (lambda (x) (string-match "]]" x) ...)
          l)

?

> +	   ;; Function to generate the list of annotated anniversaries
> +	   ;; for the given date d.
> +	   (gen-anniversaries
> +	    (lambda (d)
> +	      (let ((date d))
> +		;; rebind 'date' so that org-bbdb-anniversaries will be
> +		;; fooled into giving us the list for the given date
> +		;; and then annotate the descriptions for that date.

"Rebind".

> +		(funcall annotate-descriptions d (org-bbdb-anniversaries))))))
> +      ;; map the gen-anniversaries function over the dates
> +      ;; and nconc the results into a single list

Missing capitalization and full stop.

> +      (apply 'nconc (mapcar gen-anniversaries dates)))))

#'nconc (there is also `cl-mapcan').

Also, gen-anniversaries is a one-liner. I don't think it deserves its
own name.

IOW, wouldn't it be better to use less levels of indirection, i.e., less
helper functions?


Regards,

-- 
Nicolas Goaziou

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

* Re: [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder]
  2015-08-17  9:16               ` Nicolas Goaziou
@ 2015-08-17 16:42                 ` Nick Dokos
  2015-08-17 16:57                   ` Rasmus
  0 siblings, 1 reply; 18+ messages in thread
From: Nick Dokos @ 2015-08-17 16:42 UTC (permalink / raw)
  To: emacs-orgmode

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

Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

> Hello,
>
> Nick Dokos <ndokos@gmail.com> writes:
>
>> Here's a patch to add a new function to org-bbdb.el that provides early
>> warning for upcoming anniversaries; it also adds some documentation to
>> org.texi.
>
> Thank you. Some comments follow.
>

Thanks for the comments. Revised patch attached.

>
>> +      (apply 'nconc (mapcar gen-anniversaries dates)))))
>
> #'nconc (there is also `cl-mapcan').
>

I did a mapcan originally and saw that it was an alias for cl-mapcan in
cl-extras.el and that got me scared: I vaguely recalled some rules about
using cl-* stuff, but I don't really remember the rules any more. For
future reference, are they written down somewhere? Also, does it matter
if I use the alias "mapcan" instead of "cl-mapcan"?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Allow early-warning anniversaries in agenda. --]
[-- Type: text/x-patch, Size: 3739 bytes --]

From f90ab3346f0b49b7397d1b963359f14a48a019f1 Mon Sep 17 00:00:00 2001
From: Nick Dokos <ndokos@gmail.com>
Date: Sun, 16 Aug 2015 12:22:55 -0400
Subject: [PATCH] Allow early-warning anniversaries in agenda.

* lisp/org-bbdb.el (org-bbdb-anniversaries-future, org-bbdb-date-list): New functions.

* doc/org.texi: Document the usage of `org-bbdb-anniversaries-future'.

Feature requested by Julien Cubizolles:

http://thread.gmane.org/gmane.emacs.orgmode/99344
---
 doc/org.texi     | 14 ++++++++++++++
 lisp/org-bbdb.el | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/doc/org.texi b/doc/org.texi
index b23be03..927ecbd 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -8046,6 +8046,20 @@ hash with anniversaries.  However, from then on things will be very fast---much
 faster in fact than a long list of @samp{%%(diary-anniversary)} entries
 in an Org or Diary file.
 
+If you would like to see upcoming anniversaries with a bit of forewarning,
+you can use the following instead:
+
+@example
+* Anniversaries
+  :PROPERTIES:
+  :CATEGORY: Anniv
+  :END:
+%%(org-bbdb-anniversaries-future 3)
+@end example
+
+That will give you three days' warning: on the anniversary date itself and the
+two days prior. The argument is optional: if omitted, it defaults to 7.
+
 @subsubheading Appointment reminders
 @cindex @file{appt.el}
 @cindex appointment reminders
diff --git a/lisp/org-bbdb.el b/lisp/org-bbdb.el
index c489385..e03cda9 100644
--- a/lisp/org-bbdb.el
+++ b/lisp/org-bbdb.el
@@ -397,6 +397,55 @@ This is used by Org to re-create the anniversary hash table."
         ))
     text))
 
+;;; Return list of anniversaries for today and the next n-1 (default: n=7) days.
+;;; This is meant to be used in an org file instead of org-bbdb-anniversaries:
+;;;
+;;; %%(org-bbdb-anniversaries-future)
+;;;
+;;; or
+;;;
+;;; %%(org-bbdb-anniversaries-future 3)
+;;;
+;;; to override the 7-day default.
+
+(defun org-bbdb-date-list (date n)
+  "Return a list of dates in (m d y) format from the given 'date' to n-1 days hence."
+  (let ((abs (calendar-absolute-from-gregorian date))
+        ret)
+    (dotimes (i n (nreverse ret))
+	       (push (calendar-gregorian-from-absolute (+ abs i)) ret))))
+
+;;;###autoload
+(defun org-bbdb-anniversaries-future (&optional n)
+  "Return list of anniversaries for today and the next n-1 days (default n=7)."
+  (let ((n (or n 7)))
+    (when (<= n 0)
+      (error "The (optional) argument of `org-bbdb-anniversaries-future' must be positive"))
+    (let (
+	  ;; List of relevant dates.
+	  (dates (org-bbdb-date-list date n))
+	  ;; Function to annotate text of each element of l with the anniversary date d.
+	  (annotate-descriptions
+	   (lambda (d l)
+	     (mapcar (lambda (x)
+		       ;; The assumption here is that x is a bbdb link of the form
+		       ;; [[bbdb:name][description]].
+		       ;; This function rather arbitrarily modifies the description
+		       ;; by adding the date to it in a fixed format.
+		       (string-match "]]" x)
+		       (replace-match (format " -- %d-%02d-%02d\\&" (third d) (first d) (second d))
+				      nil nil x))
+		     l))))
+      ;; Map a function that generates anniversaries for each date over the dates
+      ;; and nconc the results into a single list.
+      (cl-mapcan (lambda (d)
+		   (let ((date d))
+		     ;; Rebind 'date' so that org-bbdb-anniversaries will be
+		     ;; fooled into giving us the list for the given date
+		     ;; and then annotate the descriptions for that date.
+		     (funcall annotate-descriptions d (org-bbdb-anniversaries))))
+		 dates))))
+
 (defun org-bbdb-complete-link ()
   "Read a bbdb link with name completion."
   (require 'bbdb-com)
-- 
2.4.3


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


Thanks!
-- 
Nick

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

* Re: [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder]
  2015-08-17 16:42                 ` Nick Dokos
@ 2015-08-17 16:57                   ` Rasmus
  2015-08-17 17:35                     ` Nicolas Goaziou
  0 siblings, 1 reply; 18+ messages in thread
From: Rasmus @ 2015-08-17 16:57 UTC (permalink / raw)
  To: emacs-orgmode

Nick Dokos <ndokos@gmail.com> writes:

> I did a mapcan originally and saw that it was an alias for cl-mapcan in
> cl-extras.el and that got me scared: I vaguely recalled some rules about
> using cl-* stuff, but I don't really remember the rules any more. For
> future reference, are they written down somewhere?

My understanding is (require 'cl-lib) is OK.  We can probably kill a lot
of our own prefixed functions by using cl-lib functions.  And IMO we
should.  (require 'cl) is not good (other than when byte-compiling).

Correct me if I'm wrong. 

So cl-mapcan is OK.

> Also, does it matter if I use the alias "mapcan" instead of "cl-mapcan"?

I think for newer Emacs the prefix is preferred.  Sometimes the older
versions do not have it (e.g. outline-mode).  I don't know when the change
was made....

Rasmus

-- 
Lasciate ogni speranza o voi che entrate: siete nella mani di'machellaio

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

* Re: [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder]
  2015-08-17 16:57                   ` Rasmus
@ 2015-08-17 17:35                     ` Nicolas Goaziou
  2015-10-06 15:11                       ` Nick Dokos
  0 siblings, 1 reply; 18+ messages in thread
From: Nicolas Goaziou @ 2015-08-17 17:35 UTC (permalink / raw)
  To: Rasmus; +Cc: emacs-orgmode

Rasmus <rasmus@gmx.us> writes:

> Nick Dokos <ndokos@gmail.com> writes:
>
>> I did a mapcan originally and saw that it was an alias for cl-mapcan in
>> cl-extras.el and that got me scared: I vaguely recalled some rules about
>> using cl-* stuff, but I don't really remember the rules any more. For
>> future reference, are they written down somewhere?
>
> My understanding is (require 'cl-lib) is OK.  We can probably kill a lot
> of our own prefixed functions by using cl-lib functions.  And IMO we
> should.  (require 'cl) is not good (other than when byte-compiling).
>
> Correct me if I'm wrong. 

cl-lib is standard in Emacs 24.3. Before that, all you can do is

  (eval-when-compile (require 'cl))

and use macros only.

> So cl-mapcan is OK.

Actually it's not until Emacs minimal version issue is sorted out by Bastien.


Regards,

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

* Re: [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder]
  2015-08-17 17:35                     ` Nicolas Goaziou
@ 2015-10-06 15:11                       ` Nick Dokos
  2015-10-07 19:58                         ` Nicolas Goaziou
  0 siblings, 1 reply; 18+ messages in thread
From: Nick Dokos @ 2015-10-06 15:11 UTC (permalink / raw)
  To: emacs-orgmode

Nicolas Goaziou <mail <at> nicolasgoaziou.fr> writes:

> 
> Rasmus <rasmus <at> gmx.us> writes:
> 
> > Nick Dokos <ndokos <at> gmail.com> writes:
> >
> >> I did a mapcan originally and saw that it was an alias for cl-mapcan in
> >> cl-extras.el and that got me scared: ...
> 
> > So cl-mapcan is OK.
> 
> Actually it's not until Emacs minimal version issue is sorted out by Bastien.
> 


IIUC, this issue has not been sorted out yet. Should I wait for that to happen, 
or change the patch to use (apply #'nconc ...) and possibly revisit it in the 
future?

Thanks,
Nick

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

* Re: [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder]
  2015-10-06 15:11                       ` Nick Dokos
@ 2015-10-07 19:58                         ` Nicolas Goaziou
  2015-10-13 15:54                           ` Nick Dokos
  2015-10-14 23:21                           ` Nick Dokos
  0 siblings, 2 replies; 18+ messages in thread
From: Nicolas Goaziou @ 2015-10-07 19:58 UTC (permalink / raw)
  To: Nick Dokos; +Cc: emacs-orgmode

Hello,

Nick Dokos <ndokos@gmail.com> writes:

> IIUC, this issue has not been sorted out yet. Should I wait for that to happen, 
> or change the patch to use (apply #'nconc ...) and possibly revisit it in the 
> future?

I think the latter is fine. There are plenty of places to revisit in the
future anyway. Thank you.


Regards,

-- 
Nicolas Goaziou

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

* Re: [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder]
  2015-10-07 19:58                         ` Nicolas Goaziou
@ 2015-10-13 15:54                           ` Nick Dokos
  2015-10-14 23:21                           ` Nick Dokos
  1 sibling, 0 replies; 18+ messages in thread
From: Nick Dokos @ 2015-10-13 15:54 UTC (permalink / raw)
  To: Nick Dokos; +Cc: emacs-orgmode

Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

> Hello,
>
> Nick Dokos <ndokos@gmail.com> writes:
>
>> IIUC, this issue has not been sorted out yet. Should I wait for that to happen, 
>> or change the patch to use (apply #'nconc ...) and possibly revisit it in the 
>> future?
>
> I think the latter is fine. There are plenty of places to revisit in the
> future anyway. Thank you.
>
>

Thanks! I pushed the change. Please let me know if there is any problem
with it.

Nick

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

* Re: [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder]
  2015-10-07 19:58                         ` Nicolas Goaziou
  2015-10-13 15:54                           ` Nick Dokos
@ 2015-10-14 23:21                           ` Nick Dokos
  1 sibling, 0 replies; 18+ messages in thread
From: Nick Dokos @ 2015-10-14 23:21 UTC (permalink / raw)
  To: Nick Dokos; +Cc: emacs-orgmode

Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

>> IIUC, this issue has not been sorted out yet. Should I wait for that to happen, 
>> or change the patch to use (apply #'nconc ...) and possibly revisit it in the 
>> future?
>
> I think the latter is fine. There are plenty of places to revisit in the
> future anyway. Thank you.

[I thought I had replied but I cannot find it - apologies if this is a
duplicate]

Thank you. I pushed the change to master in commit
75f91f0bb7aa401e62a7ce08ce01596e051c096e.

Let me know if there are any problems.

--
Nick

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

end of thread, other threads:[~2015-10-14 23:21 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-29 13:41 org-bbdb-birthday reminder Julien Cubizolles
2015-08-12 20:55 ` Matt Lundin
2015-08-13  1:36   ` Nick Dokos
2015-08-13  6:35   ` Julien Cubizolles
2015-08-13 13:07     ` Matt Lundin
2015-08-14  0:26       ` Nick Dokos
2015-08-14 14:30         ` Matt Lundin
2015-08-15 18:24           ` Julien Cubizolles
2015-08-16 17:25             ` [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder] Nick Dokos
2015-08-17  9:16               ` Nicolas Goaziou
2015-08-17 16:42                 ` Nick Dokos
2015-08-17 16:57                   ` Rasmus
2015-08-17 17:35                     ` Nicolas Goaziou
2015-10-06 15:11                       ` Nick Dokos
2015-10-07 19:58                         ` Nicolas Goaziou
2015-10-13 15:54                           ` Nick Dokos
2015-10-14 23:21                           ` Nick Dokos
2015-08-16 13:46           ` org-bbdb-birthday reminder Bastien Guerry

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

	https://git.savannah.gnu.org/cgit/emacs/org-mode.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).