From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Dokos Subject: [PATCH] Allow early-warning anniversaries in agends [was: Re: org-bbdb-birthday reminder] Date: Sun, 16 Aug 2015 13:25:51 -0400 Message-ID: <87pp2n6t7k.fsf_-_@pierrot.dokosmarshall.org> References: <87a8ufdqte.fsf@free.fr> <871tf89qh8.fsf@fastmail.fm> <87wpwzlmpn.fsf@free.fr> <87lhdftjzy.fsf@fastmail.fm> <871tf690lg.fsf@pierrot.dokosmarshall.org> <878u9ehris.fsf@fastmail.fm> <87vbcg76lq.fsf@free.fr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:54613) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZR1hL-00031f-9x for emacs-orgmode@gnu.org; Sun, 16 Aug 2015 13:26:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZR1hI-0005j5-2A for emacs-orgmode@gnu.org; Sun, 16 Aug 2015 13:26:19 -0400 Received: from plane.gmane.org ([80.91.229.3]:45811) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZR1hH-0005is-O9 for emacs-orgmode@gnu.org; Sun, 16 Aug 2015 13:26:16 -0400 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1ZR1hG-00049L-Du for emacs-orgmode@gnu.org; Sun, 16 Aug 2015 19:26:14 +0200 Received: from pool-108-20-41-232.bstnma.fios.verizon.net ([108.20.41.232]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 16 Aug 2015 19:26:14 +0200 Received: from ndokos by pool-108-20-41-232.bstnma.fios.verizon.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 16 Aug 2015 19:26:14 +0200 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain Julien Cubizolles writes: > Matt Lundin writes: > >> Nick Dokos 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. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Allow-early-warning-anniversaries-in-agenda.patch Content-Description: Allow early-warning anniversaries in agenda >From ba42045c9905e698db1bd62a2d547c29a9e9f097 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 | 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 --=-=-= Content-Type: text/plain Thanks! -- Nick --=-=-=--