From mboxrd@z Thu Jan 1 00:00:00 1970 From: Noorul Islam K M Subject: Re: Some useful timestamp s-expressions Date: Thu, 19 Aug 2010 04:17:50 +0530 Message-ID: <61706302-0365-4614-9BFB-25ACA0B3D652@noorul.com> References: Mime-Version: 1.0 (iPod Mail 8A293) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Return-path: Received: from [140.186.70.92] (port=35826 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OlrS0-0003v3-P0 for emacs-orgmode@gnu.org; Wed, 18 Aug 2010 18:49:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OlrQf-0000kJ-EM for emacs-orgmode@gnu.org; Wed, 18 Aug 2010 18:48:22 -0400 Received: from mail-pw0-f41.google.com ([209.85.160.41]:43063) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OlrQf-0000k8-3h for emacs-orgmode@gnu.org; Wed, 18 Aug 2010 18:48:17 -0400 Received: by pwi3 with SMTP id 3so836024pwi.0 for ; Wed, 18 Aug 2010 15:48:15 -0700 (PDT) In-Reply-To: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Paul Sexton Cc: "emacs-orgmode@gnu.org" I think it will be great if this goes into worg? - Noorul On Aug 19, 2010, at 1:52 AM, Paul Sexton wrote: > In org, timestamps can be in the usual angle-bracket format, > eg <2010-08-19 +2w>, or you can use lisp s-expressions. These are in the s= ame > format as the s-expressions used in the 'diary'/'calendar' emacs packages.= I > only discovered these recently but have been able to use them to schedule s= ome > complex recurring items. I thought I would share the code here. >=20 > 1. Recurring items with a limited number of occurrences >=20 > For example, say you are taking night classes in Spanish. The class is eve= ry > Wednesday evening at 7pm, starting on 18 August, and runs for 8 weeks. AFA= IK > Org's timestamps do not support limited occurrences of recurrent items -- y= ou > have to schedule the item with infinite recurrences, then delete it when i= t > finishes. >=20 > To schedule the Spanish classes, put the following in your .emacs: >=20 > (defun diary-limited-cyclic (recurrences interval m d y) > "For use in emacs diary. Cyclic item with limited number of recurrences. > Occurs every INTERVAL days, starting on YYYY-MM-DD, for a total of > RECURRENCES occasions." > (let ((startdate (calendar-absolute-from-gregorian (list m d y))) > (today (calendar-absolute-from-gregorian date))) > (and (not (minusp (- today startdate))) > (zerop (% (- today startdate) interval)) > (< (floor (- today startdate) interval) recurrences)))) >=20 > The item in the org file looks like this: >=20 >=20 > ** 19:00-21:00 Spanish lessons > <%%(diary-limited-cyclic 8 7 8 18 2010)> >=20 >=20 > 2. Public holiday that is "the nearest Monday to DATE" >=20 > In New Zealand each regional capital has an "Anniversary Day". The date of= =20 > Auckland's anniversary day is "the nearest Monday to 29 January".=20 >=20 > Put this in your .emacs: >=20 > (defun calendar-nearest-to (target-dayname target-day target-month) > "Recurring event that occurs in the nearest TARGET-DAYNAME to > the date TARGET-DAY, TARGET-MONTH each year." > (interactive) > (let* ((dayname (calendar-day-of-week date)) > (target-date (list target-month target-day (calendar-extract-year d= ate))) > (days-diff (abs (- (calendar-day-number date) > (calendar-day-number target-date))))) > (and (=3D dayname target-dayname) > (< days-diff 4)))) >=20 > Now we can schedule Auckland Anniversary Day. The first argument, 1, means= > Monday (days of the week are numbered starting with Sunday=3D0). >=20 >=20 > *** Auckland Anniversary Day > <%%(calendar-nearest-to 1 29 1)> >=20 >=20 > 3. Public holiday on "the 4th Monday in October". >=20 > This does not require any additions to .emacs: >=20 >=20 > *** Labour Day (NZ) > <%%(diary-float 10 1 4)> >=20 >=20 > 4. Easter >=20 > Easter's date moves around from year to year according to a complicated se= t of > criteria which I do not claim to understand. However the following code wi= ll > allow you to schedule recurring events relative to Easter sunday. >=20 > Note: the function da-easter is from: > http://github.com/soren/elisp/blob/master/da-kalender.el >=20 > Put the following in your .emacs: >=20 > (defun da-easter (year) > "Calculate the date for Easter Sunday in YEAR. Returns the date in the > Gregorian calendar, ie (MM DD YY) format." > (let* ((century (1+ (/ year 100))) > (shifted-epact (% (+ 14 (* 11 (% year 19)) > (- (/ (* 3 century) 4)) > (/ (+ 5 (* 8 century)) 25) > (* 30 century)) > 30)) > (adjusted-epact (if (or (=3D shifted-epact 0) > (and (=3D shifted-epact 1) > (< 10 (% year 19)))) > (1+ shifted-epact) > shifted-epact)) > (paschal-moon (- (calendar-absolute-from-gregorian > (list 4 19 year)) > adjusted-epact))) > (calendar-dayname-on-or-before 0 (+ paschal-moon 7)))) >=20 >=20 > (defun da-easter-gregorian (year) > (calendar-gregorian-from-absolute (da-easter year))) >=20 > (defun calendar-days-from-easter () > "When used in a diary sexp, this function will calculate how many days > are between the current date (DATE) and Easter Sunday." > (- (calendar-absolute-from-gregorian date) > (da-easter (calendar-extract-year date)))) >=20 > Now we can schedule the public holidays associated with Easter as=20 > recurring events. Good Friday is 2 days before "Easter", Easter Monday is o= ne > day after. >=20 >=20 > *** Good Friday > <%%(=3D -2 (calendar-days-from-easter))> >=20 > *** Easter Sunday > <%%(=3D 0 (calendar-days-from-easter))> >=20 > *** Easter Monday > <%%(=3D 1 (calendar-days-from-easter))> >=20 >=20 > Paul >=20 >=20 >=20 > _______________________________________________ > Emacs-orgmode mailing list > Please use `Reply All' to send replies to the list. > Emacs-orgmode@gnu.org > http://lists.gnu.org/mailman/listinfo/emacs-orgmode