From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keith Swartz Subject: Re: org-remember templates with dynamic target headline Date: Fri, 19 Jun 2009 16:09:28 -0700 Message-ID: <4A3C1AA8.60904@oneroad.com> References: <4A3862BF.8040404@gmail.com> <5856.1245219638@gamaville.dokosmarshall.org> <4BD40C46-F53F-465B-BA92-21BDB0BE2F3A@gmail.com> Reply-To: Keith Swartz Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MHnDi-0006uz-Sg for emacs-orgmode@gnu.org; Fri, 19 Jun 2009 19:10:06 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MHnDe-0006qV-2z for emacs-orgmode@gnu.org; Fri, 19 Jun 2009 19:10:06 -0400 Received: from [199.232.76.173] (port=54564 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MHnDd-0006qI-Vw for emacs-orgmode@gnu.org; Fri, 19 Jun 2009 19:10:02 -0400 Received: from mx20.gnu.org ([199.232.41.8]:55533) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1MHnDd-000517-GH for emacs-orgmode@gnu.org; Fri, 19 Jun 2009 19:10:01 -0400 Received: from smtpauth00.csee.onr.siteprotect.com ([64.26.60.144]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MHnDZ-0001qj-P5 for emacs-orgmode@gnu.org; Fri, 19 Jun 2009 19:09:58 -0400 In-Reply-To: <4BD40C46-F53F-465B-BA92-21BDB0BE2F3A@gmail.com> 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: Carsten Dominik Cc: Keith Swartz , org-mode Hi Carsten, I think that would work, yes. Can you give an example of what it would look like now? Are you saying we can use a function call for a single element, or to produce the entire list? Thanks, Keith Carsten Dominik wrote: > > On Jun 17, 2009, at 8:20 AM, Nick Dokos wrote: > >> Daniel J. Sinder wrote: >> >>> I want a remember template that will have a target headline based on >>> the date on which I call org-remember. >>> >>> For a simple example, the effect I'd like to achieve is shown by >>> putting the following in my .emacs: >>> >>> (setq org-remember-templates >>> `(("Journal" ?j "* %u %?\n" "~/org/wjournal.org" >>> ,(format-time-string "%G: Week %V")))) >>> >>> I'm an elisp noob, but I realize the problem here is that >>> format-time-string is only evaluated once when my .emacs is read. So, >>> unless I restart emacs every week. This doesn't work. >>> >>> How can I cause format-time-string to be re-evaluated whenever >>> org-remember is called? >>> >> >> You cannot, unless you change the code. Keith Swartz had a similar >> question recently and although I cannot find it in the Gmane archive >> (second time today - maybe I'm doing something wrong), here is the last >> part of the thread: > > > Hi Nick, > > thank you for the reminder, I had wanted to do something about this. > > I am indeed a bit hesitant to allow just a lisp form here, because > erroneous > setup of the remember template structure might then lead > to hard-to-trace problems. > > However, I am fine with allowing a *function* in this element, as > it is in fact already allowed for the target file name. > > I have just pushed a fix that will accept a function in this place > and call it to get the true headline. > > Daniel, Keith, > > Hope that solves your issue. > > - Carsten > >> >> ,---- >> | To: Robert Goldman >> | cc: emacs-orgmode@gnu.org >> | From: Nick Dokos >> | Cc: nicholas.dokos@hp.com >> | Reply-to: nicholas.dokos@hp.com >> | Subject: Re: [Orgmode] Re: Emacs-orgmode Digest, Vol 39, Issue 122 >> | X-Mailer: MH-E 8.1; nmh 1.2; GNU Emacs 23.0.93 >> | Date: Sat, 30 May 2009 15:39:40 -0400 >> | Sender: nick@gamaville.dokosmarshall.org >> | >> | Robert Goldman wrote: >> | >> | > > Date: Fri, 29 May 2009 23:24:58 -0700 >> | > > From: Keith Swartz >> | > > Subject: [Orgmode] Lazy evaluation when defining >> org-remember-template >> | > > To: "[orgmode]" >> | > > Message-ID: <4A20D13A.2000603@oneroad.com> >> | > > Content-Type: text/plain; charset=ISO-8859-1; format=flowed >> | > > >> | > > ... >> | > > >> | > > Is there a way I can make that command evaluate at the time it is >> | > > invoked, rather than when it is defined? I vaguely recall doing >> | > > something like this, but that was five job roles, three houses, >> two >> | > > recessions, and two kids ago. :) >> | > > >> | > >> | > I can't swear that this will work, but note that the way you have >> | > written this, it will all be evaluated at load time, as you say. >> the >> | > 'list' function will evaluate its arguments to build the list. >> | > >> | > Now, if you don't want this to be evaluated when >> org-remember-templates >> | > is set, you can quote the form: >> | > >> | > '(format-time-string "%A") >> | > >> | > [note that you quoted the argument to format-time-string. I don't >> | > believe that's necessary, since strings evaluate to themselves, >> but I >> | > have not tested this.] >> | > >> | > Actually, I think you would get something easier to read if you >> quoted >> | > the whole list, instead of quoting each element. Something like: >> | > >> | > (list '("Todo" ?t "* TODO %?%^{To do} %^g\n :LOGBOOK:\n - >> | > Added: %U\n :END:" "d:/tmp/_my.todo" (format-time-string "%A")))) >> | > >> | >> | That's correct. >> | >> | > The question then is, "what happens when org-remember-templates is >> | > retrieved?" What you want is for this function to be evaluated >> when the >> | > templates are found and used. That will be done by >> | > org-remember-apply-template, which we can examine.... >> | > >> | > Unfortunately, I don't see in there anything which retrieves (nth 4 >> | > entry), which is the place where your format-time-string goes, so >> I'm >> | > not sure what is handling this. It's a little confusing reading >> that >> | > function's code, since "headline" is ambiguous between whether it >> means >> | > the headline of the remember note to be inserted or the headline >> under >> | > which to insert the note... I believe it's the former. >> | > >> | >> | It's the latter. >> | >> | You can figure out things like this fairly quickly by inserting a >> | (debug) at the appropriate place, and re-evaluating the defun. When >> the >> | function gets called, it will jump into the debugger when it evals the >> | (debug) form, and you can use the full power of lisp to examine >> | state. For example, here I defined the template the way you suggested, >> | placed a (debug) in org-remember-apply-template, just after the >> | insertion of the template in the remember buffer, re-evaluated the >> defun >> | (there is an eval-defun, but I prefer to do that by going to the >> end of >> | the defun - which I can do quickly: repeat M-C-u until I'm at the >> | beginning of the defun and M-C-f to move over the whole defun - and >> then >> | C-x C-e to eval the last sexpression.) >> | >> | I then call org-remember and in the resulting debug buffer, say >> | >> | e headline >> | >> | which says >> | >> | (format-time-string "%A") >> | >> | e entry >> | >> | which says >> | >> | ("* TODO %?%^{To do} %^g >> | :LOGBOOK: >> | - >> | Added: %U >> | :END:" (quote "d:/tmp/_my.todo") (format-time-string "%A")) >> | >> | Now you can see that the headline is the third element of this list >> | (i.e. (nth 2 entry) - the numbering starts from 0). >> | >> | > Perhaps someone else can figure this out, or perhaps you could >> just try >> | > quoting the list and seeing if it works to evaluate the >> | > format-time-string when you want it to. Org usually does The >> Right Thing. >> | > >> | But even org cannot perform miracles !-) Somebody has to "force the >> thunk" >> | in order for delayed evaluation to work. You'd need something like >> this >> | patch: >> | >> | --- a/lisp/org-remember.el >> | +++ b/lisp/org-remember.el >> | @@ -388,7 +388,7 @@ to be run from that hook to function properly." >> | (functionp (nth 1 entry)))) >> | (nth 1 entry) >> | org-default-notes-file)) >> | - (headline (nth 2 entry)) >> | + (headline (eval (nth 2 entry))) >> | (v-c (and (> (length kill-ring) 0) (current-kill 0))) >> | (v-x (or (org-get-x-clipboard 'PRIMARY) >> | (org-get-x-clipboard 'CLIPBOARD) >> | >> | This should work in simple cases (in particular, because the >> headline is >> | a string and strings evaluate to themselves, so it should not >> adversely affect >> | any existing template), but I certainly have not thought about >> repercussions >> | (including the possibility of *very* obscure bugs because somebody >> mistyped >> | something in the template - that would be a maintenance nightmare >> that Carsten >> | might not be willing to take on). >> | >> | Thanks, >> | Nick >> `---- >> >> HTH, >> Nick >> >> >> _______________________________________________ >> Emacs-orgmode mailing list >> Remember: use `Reply All' to send replies to the list. >> Emacs-orgmode@gnu.org >> http://lists.gnu.org/mailman/listinfo/emacs-orgmode > >