From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carsten Dominik Subject: Re: org-mode and appointments Date: Tue, 26 Feb 2008 17:06:21 +0100 Message-ID: References: <87ejb063bz.fsf@gollum.intra.norang.ca> Mime-Version: 1.0 (Apple Message framework v919.2) Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JU2K5-0003XK-Ut for emacs-orgmode@gnu.org; Tue, 26 Feb 2008 11:06:30 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JU2K3-0003X5-22 for emacs-orgmode@gnu.org; Tue, 26 Feb 2008 11:06:29 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JU2K2-0003X2-S5 for emacs-orgmode@gnu.org; Tue, 26 Feb 2008 11:06:26 -0500 Received: from ug-out-1314.google.com ([66.249.92.175]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JU2K2-0004di-9Y for emacs-orgmode@gnu.org; Tue, 26 Feb 2008 11:06:26 -0500 Received: by ug-out-1314.google.com with SMTP id a2so1396735ugf.48 for ; Tue, 26 Feb 2008 08:06:24 -0800 (PST) In-Reply-To: <87ejb063bz.fsf@gollum.intra.norang.ca> 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: Bernt Hansen Cc: emacs-orgmode@gnu.org Hi Bernt, Bastien is quite busy, so let me replay On Feb 26, 2008, at 12:09 AM, Bernt Hansen wrote: > Hi Bastien, > > I'm using your function for creating appointments: > > ,----[ my-org-agenda-to-appt in .emacs ] > | ;; Make appt aware of appointments from the agenda > | (defun my-org-agenda-to-appt (&optional filter) > | "Activate appointments found in `org-agenda-files'. > | When prefixed, prompt for a regular expression and use it as a > | filter: only add entries if they match this regular expression. > | > | FILTER can be a string. In this case, use this string as a > | regular expression to filter results. > | > | FILTER can also be an alist, with the car of each cell being > | either 'headline or 'category. For example: > | > | '((headline \"IMPORTANT\") > | (category \"Work\")) > | > | will only add headlines containing IMPORTANT or headlines > | belonging to the category \"Work\"." > | (interactive "P") > | (require 'org) > | (require 'calendar) > | (if (equal filter '(4)) > | (setq filter (read-from-minibuffer "Regexp filter: "))) > | (let* ((cnt 0) ; count added events > | (today (org-date-to-gregorian > | (time-to-days (current-time)))) > | (files org-agenda-files) entries file) > | ;; Get all entries which may contain an appt > | (while (setq file (pop files)) > | (setq entries > | (append entries > | (org-agenda-get-day-entries > | file today > | :timestamp :scheduled :deadline)))) > | (setq entries (delq nil entries)) > | ;; Map thru entries and find if they pass thru the filter > | (mapc > | (lambda(x) > | (let* ((evt (org-trim (get-text-property 1 'txt x))) > | (cat (get-text-property 1 'org-category x)) > | (tod (get-text-property 1 'time-of-day x)) > | (ok (or (null filter) > | (and (stringp filter) (string-match filter evt)) > | (and (listp filter) > | (or (string-match > | (cadr (assoc 'category filter)) cat) > | (string-match > | (cadr (assoc 'headline filter)) evt)))))) > | ;; FIXME Shall we remove text-properties for the appt text? > | ;; (setq evt (set-text-properties 0 (length evt) nil evt)) > | (when (and ok tod) > | (setq tod (number-to-string tod) > | tod (when (string-match > | "\\([0-9]\\{1,2\\}\\)\\([0-9]\\{2\\}\\)" tod) > | (concat (match-string 1 tod) ":" > | (match-string 2 tod)))) > | (appt-add tod evt) > | (setq cnt (1+ cnt))))) entries) > | (message "Added %d event%s for today" cnt (if (> cnt 1) "s" > "")))) > `---- > > and this has been working pretty well for me. I really appreciate you > posting this on the list (a long time ago :) ) > > I have a function key binding to rerun this function when I add new > appointments for today. > > ,----[ Activate the appointments in .emacs ] > | (global-set-key (kbd " a") 'my-org-agenda-to-appt) > | ;; Get appointments for today > | (my-org-agenda-to-appt) > | (appt-activate t) > `---- > > I have the following wishlist items for this function but don't > currently have the lisp skills to fix it. > > - [ ] Clear the appointment list when rerunning the > my-org-agenda-to-appt > If I move an appointment to anther day and use f9-a the old > appointment reminder is still there and bugs me when the time > rolls around. > I only use org appointment entries so clearing the list should > be > trivial. I don't use diary entries anymore. In this case, setting `appt-time-msg-list' to nil before calling my- org-agenda-to-appt should be fine. BTW, org.el contains `org-agenda-to-appt' which is a very slightly improved version of this function, so no need to keep it in .emacs. > - [ ] Future deadlines are reported for today. > I have an installation deadline at 8PM on Thursday. Since > it's a > deadline it shows up in my agenda today with a 3 day warning... > and my-org-agenda-to-appt picks this up and makes an appointment > for today -- which is incorrect. I don't need an appointment > for > this until Thursday. Do (let ((org-deadline-warning-days 0)) around the call. Actually, yes, this should be part f org-agenda-to- appt, I will put it in. But for now you can do it in your update function. There is a bug in the documentation of org-deadline-warning-days saying that only negative numbers will be enforced. In fact, 0 will also be enforced. > - [ ] If I leave Emacs running overnight is there a good way to reset > the appointment list at midnight? Take a look at the function `run-at-time'. This could be set up in .emacs, better to not execute this each time you update your appointment list. So to summarize, this is really all you need in .emacs: ;; Get appointments for today (global-set-key (kbd " a") 'my-org-agenda-to-appt) (defun my-org-agenda-to-appt () (interactive) (let ((org-deadline-warning-days 0)) ;; will be automatic in org 5.23 (org-agenda-to-appt))) (my-org-agenda-to-appt) (appt-activate t) (run-at-time "24:01" nil 'my-org-agenda-to-appt)