Re: [Orgmode] Some useful timestamp s-expressions
I added these to Worg. -- Manish On Thu, Aug 19, 2010 at 1:52 AM, Paul Sexton psex...@xnet.co.nz 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 same 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 some complex recurring items. I thought I would share the code here. 1. Recurring items with a limited number of occurrences For example, say you are taking night classes in Spanish. The class is every Wednesday evening at 7pm, starting on 18 August, and runs for 8 weeks. AFAIK Org's timestamps do not support limited occurrences of recurrent items -- you have to schedule the item with infinite recurrences, then delete it when it finishes. To schedule the Spanish classes, put the following in your .emacs: (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 -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 The item in the org file looks like this: ** 19:00-21:00 Spanish lessons %%(diary-limited-cyclic 8 7 8 18 2010) 2. Public holiday that is the nearest Monday to DATE In New Zealand each regional capital has an Anniversary Day. The date of Auckland's anniversary day is the nearest Monday to 29 January. Put this in your .emacs: (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 date))) (days-diff (abs (- (calendar-day-number date) (calendar-day-number target-date) (and (= dayname target-dayname) ( days-diff 4 Now we can schedule Auckland Anniversary Day. The first argument, 1, means Monday (days of the week are numbered starting with Sunday=0). *** Auckland Anniversary Day %%(calendar-nearest-to 1 29 1) 3. Public holiday on the 4th Monday in October. This does not require any additions to .emacs: *** Labour Day (NZ) %%(diary-float 10 1 4) 4. Easter Easter's date moves around from year to year according to a complicated set of criteria which I do not claim to understand. However the following code will allow you to schedule recurring events relative to Easter sunday. Note: the function da-easter is from: http://github.com/soren/elisp/blob/master/da-kalender.el Put the following in your .emacs: (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 (= shifted-epact 0) (and (= 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 (defun da-easter-gregorian (year) (calendar-gregorian-from-absolute (da-easter year))) (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 Now we can schedule the public holidays associated with Easter as recurring events. Good Friday is 2 days before Easter, Easter Monday is one day after. *** Good Friday %%(= -2 (calendar-days-from-easter)) *** Easter Sunday %%(= 0 (calendar-days-from-easter)) *** Easter Monday %%(= 1 (calendar-days-from-easter)) Paul ___ 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 ___ 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
[Orgmode] Some useful timestamp s-expressions
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 same 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 some complex recurring items. I thought I would share the code here. 1. Recurring items with a limited number of occurrences For example, say you are taking night classes in Spanish. The class is every Wednesday evening at 7pm, starting on 18 August, and runs for 8 weeks. AFAIK Org's timestamps do not support limited occurrences of recurrent items -- you have to schedule the item with infinite recurrences, then delete it when it finishes. To schedule the Spanish classes, put the following in your .emacs: (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 -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 The item in the org file looks like this: ** 19:00-21:00 Spanish lessons %%(diary-limited-cyclic 8 7 8 18 2010) 2. Public holiday that is the nearest Monday to DATE In New Zealand each regional capital has an Anniversary Day. The date of Auckland's anniversary day is the nearest Monday to 29 January. Put this in your .emacs: (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 date))) (days-diff (abs (- (calendar-day-number date) (calendar-day-number target-date) (and (= dayname target-dayname) ( days-diff 4 Now we can schedule Auckland Anniversary Day. The first argument, 1, means Monday (days of the week are numbered starting with Sunday=0). *** Auckland Anniversary Day %%(calendar-nearest-to 1 29 1) 3. Public holiday on the 4th Monday in October. This does not require any additions to .emacs: *** Labour Day (NZ) %%(diary-float 10 1 4) 4. Easter Easter's date moves around from year to year according to a complicated set of criteria which I do not claim to understand. However the following code will allow you to schedule recurring events relative to Easter sunday. Note: the function da-easter is from: http://github.com/soren/elisp/blob/master/da-kalender.el Put the following in your .emacs: (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 (= shifted-epact 0) (and (= 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 (defun da-easter-gregorian (year) (calendar-gregorian-from-absolute (da-easter year))) (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 Now we can schedule the public holidays associated with Easter as recurring events. Good Friday is 2 days before Easter, Easter Monday is one day after. *** Good Friday %%(= -2 (calendar-days-from-easter)) *** Easter Sunday %%(= 0 (calendar-days-from-easter)) *** Easter Monday %%(= 1 (calendar-days-from-easter)) Paul ___ 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
Re: [Orgmode] Some useful timestamp s-expressions
I think it will be great if this goes into worg? - Noorul On Aug 19, 2010, at 1:52 AM, Paul Sexton psex...@xnet.co.nz 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 same 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 some complex recurring items. I thought I would share the code here. 1. Recurring items with a limited number of occurrences For example, say you are taking night classes in Spanish. The class is every Wednesday evening at 7pm, starting on 18 August, and runs for 8 weeks. AFAIK Org's timestamps do not support limited occurrences of recurrent items -- you have to schedule the item with infinite recurrences, then delete it when it finishes. To schedule the Spanish classes, put the following in your .emacs: (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 -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 The item in the org file looks like this: ** 19:00-21:00 Spanish lessons %%(diary-limited-cyclic 8 7 8 18 2010) 2. Public holiday that is the nearest Monday to DATE In New Zealand each regional capital has an Anniversary Day. The date of Auckland's anniversary day is the nearest Monday to 29 January. Put this in your .emacs: (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 date))) (days-diff (abs (- (calendar-day-number date) (calendar-day-number target-date) (and (= dayname target-dayname) ( days-diff 4 Now we can schedule Auckland Anniversary Day. The first argument, 1, means Monday (days of the week are numbered starting with Sunday=0). *** Auckland Anniversary Day %%(calendar-nearest-to 1 29 1) 3. Public holiday on the 4th Monday in October. This does not require any additions to .emacs: *** Labour Day (NZ) %%(diary-float 10 1 4) 4. Easter Easter's date moves around from year to year according to a complicated set of criteria which I do not claim to understand. However the following code will allow you to schedule recurring events relative to Easter sunday. Note: the function da-easter is from: http://github.com/soren/elisp/blob/master/da-kalender.el Put the following in your .emacs: (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 (= shifted-epact 0) (and (= 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 (defun da-easter-gregorian (year) (calendar-gregorian-from-absolute (da-easter year))) (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 Now we can schedule the public holidays associated with Easter as recurring events. Good Friday is 2 days before Easter, Easter Monday is one day after. *** Good Friday %%(= -2 (calendar-days-from-easter)) *** Easter Sunday %%(= 0 (calendar-days-from-easter)) *** Easter Monday %%(= 1 (calendar-days-from-easter)) Paul ___ 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 ___ Emacs-orgmode mailing list Please use `Reply All' to send replies to the list.
Re: [Orgmode] Some useful timestamp s-expressions
Really great Paul. Did you compared your Spanish classes examples with org-diary-class? Maybe (I did not tried!) your proposal is an improvement of this function. Thank you/ Gracias, Daniel 2010/8/18 Noorul Islam K M noo...@noorul.com I think it will be great if this goes into worg? - Noorul On Aug 19, 2010, at 1:52 AM, Paul Sexton psex...@xnet.co.nz 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 same 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 some complex recurring items. I thought I would share the code here. 1. Recurring items with a limited number of occurrences For example, say you are taking night classes in Spanish. The class is every Wednesday evening at 7pm, starting on 18 August, and runs for 8 weeks. AFAIK Org's timestamps do not support limited occurrences of recurrent items -- you have to schedule the item with infinite recurrences, then delete it when it finishes. To schedule the Spanish classes, put the following in your .emacs: (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 -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 The item in the org file looks like this: ** 19:00-21:00 Spanish lessons %%(diary-limited-cyclic 8 7 8 18 2010) 2. Public holiday that is the nearest Monday to DATE In New Zealand each regional capital has an Anniversary Day. The date of Auckland's anniversary day is the nearest Monday to 29 January. Put this in your .emacs: (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 date))) (days-diff (abs (- (calendar-day-number date) (calendar-day-number target-date) (and (= dayname target-dayname) ( days-diff 4 Now we can schedule Auckland Anniversary Day. The first argument, 1, means Monday (days of the week are numbered starting with Sunday=0). *** Auckland Anniversary Day %%(calendar-nearest-to 1 29 1) 3. Public holiday on the 4th Monday in October. This does not require any additions to .emacs: *** Labour Day (NZ) %%(diary-float 10 1 4) 4. Easter Easter's date moves around from year to year according to a complicated set of criteria which I do not claim to understand. However the following code will allow you to schedule recurring events relative to Easter sunday. Note: the function da-easter is from: http://github.com/soren/elisp/blob/master/da-kalender.el Put the following in your .emacs: (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 (= shifted-epact 0) (and (= 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 (defun da-easter-gregorian (year) (calendar-gregorian-from-absolute (da-easter year))) (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 Now we can schedule the public holidays associated with Easter as recurring events. Good Friday is 2 days before Easter, Easter Monday is one day after. *** Good Friday %%(= -2 (calendar-days-from-easter)) *** Easter Sunday %%(= 0 (calendar-days-from-easter)) *** Easter Monday %%(= 1 (calendar-days-from-easter)) Paul