>From f90ab3346f0b49b7397d1b963359f14a48a019f1 Mon Sep 17 00:00:00 2001 From: Nick Dokos 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: + address@hidden +* Anniversaries + :PROPERTIES: + :CATEGORY: Anniv + :END: +%%(org-bbdb-anniversaries-future 3) address@hidden 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