Re: [O] Repeaters in plain timestamps

2013-11-15 Thread François Pinard
Hi, Org people.

Merely revisiting the Org mailing list after many days.  Gosh!  That
list is fairly active! :-)

Quoting an earlier message of mine:

> The manual, section "8.3.2 Repeated tasks", says:

>Some tasks need to be repeated again and again.  Org mode helps to
>organize such tasks using a so-called repeater in a DEADLINE, SCHEDULED,
>or plain timestamp.

> Examples and directions given in the page are related to DEADLINE, and
> a few words suggest that SCHEDULED works the same.  But the page does
> not say how one may handle repeaters with plain timestamps.  I merely
> would like to update them so they show the date for the next
> iteration, a bit like command "t d" already does on a DEADLINE
> repeater.

For what it may be worth, I kludged this code for bumping the following
repeated timestamps on the current line.  I stole most of the code, and
did not write much myself:


(defun fp-org-bump-timestamp ()
  ;; Adapted from (org.el) org-auto-repeat-maybe.
  (interactive)
  (save-excursion
(beginning-of-line)
(when (re-search-forward org-ts-regexp (line-end-position) t)
  (let ((ts (match-string 1))
(whata '(("h" . hour) ("d" . day) ("m" . month) ("y" . year)))
n time)
(when (string-match "\\([.+]\\)?\\(\\+[0-9]+\\)\\([hdwmy]\\)" ts)
  (setq n (string-to-number (match-string 2 ts))
what (match-string 3 ts))
  (if (equal what "w") (setq n (* n 7) what "d"))
  (if (and (equal what "h")
   (not (string-match "[0-9]\\{1,2\\}:[0-9]\\{2\\}" ts)))
  (user-error "Cannot repeat in Repeat in %d hour(s) because no 
hour has been set" n))
  ;; Preparation, see if we need to modify the start date for the change
  (when (match-end 1)
(setq time (save-match-data (org-time-string-to-time ts)))
(cond
 ((equal (match-string 1 ts) ".")
  ;; Shift starting date to today
  (org-timestamp-change
   (- (org-today) (time-to-days time))
   'day))
 ((equal (match-string 1 ts) "+")
  (let ((nshiftmax 10) (nshift 0))
(while (or (= nshift 0)
   (<= (time-to-days time)
   (time-to-days (current-time
  (when (= (incf nshift) nshiftmax)
(or (y-or-n-p (message "%d repeater intervals were not 
enough to shift date past today.  Continue? " nshift))
(error "Abort")))
  (org-timestamp-change n (cdr (assoc what whata)))
  (org-at-timestamp-p t)
  (setq ts (match-string 1))
  (setq time (save-match-data (org-time-string-to-time ts)
  (org-timestamp-change (- n) (cdr (assoc what whata)))
  ;; rematch, so that we have everything in place for the real shift
  (org-at-timestamp-p t)
  (setq ts (match-string 1))
  (string-match "\\([.+]\\)?\\(\\+[0-9]+\\)\\([hdwmy]\\)" ts
  (org-timestamp-change n (cdr (assoc what whata)) nil t))



[O] Repeaters in plain timestamps

2013-09-15 Thread François Pinard
Hi, Org people.

The manual, section "8.3.2 Repeated tasks", says:

   Some tasks need to be repeated again and again.  Org mode helps to
   organize such tasks using a so-called repeater in a DEADLINE, SCHEDULED,
   or plain timestamp.

Examples and directions given in the page are related to DEADLINE, and a
few words suggest that SCHEDULED works the same.  But the page does not
say how one may handle repeaters with plain timestamps.

I merely would like to update them so they show the date for the next
iteration, a bit like command "t d" already does on a DEADLINE repeater.

François

P.S. Someone on the list strongly advise me to avoid DEADLINE and
SCHEDULED unless they are really meaningful for me, and so did I.  But
for many cases of events which are not heavy (birthdays are a good
example), repeaters are still meaningful.