emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Nick Dokos <nicholas.dokos@hp.com>
To: Robert Goldman <rpgoldman@sift.info>
Cc: emacs-orgmode@gnu.org
Subject: Re: Re: Emacs-orgmode Digest, Vol 39, Issue 122
Date: Sat, 30 May 2009 15:39:40 -0400	[thread overview]
Message-ID: <15960.1243712380@gamaville.dokosmarshall.org> (raw)
In-Reply-To: Message from Robert Goldman <rpgoldman@sift.info> of "Sat, 30 May 2009 13:50:17 CDT." <4A217FE9.9000408@sift.info>

Robert Goldman <rpgoldman@sift.info> wrote:

> > Date: Fri, 29 May 2009 23:24:58 -0700
> > From: Keith Swartz <gnu@oneroad.com>
> > Subject: [Orgmode] Lazy evaluation when defining org-remember-template
> > To: "[orgmode]" <emacs-orgmode@gnu.org>
> > 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<RET>

which says 

(format-time-string "%A")

  e entry<RET>

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


   

      reply	other threads:[~2009-05-30 19:41 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <E1MAI2p-0004xN-DP@box188.bluehost.com>
2009-05-30 18:50 ` Emacs-orgmode Digest, Vol 39, Issue 122 Robert Goldman
2009-05-30 19:39   ` Nick Dokos [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=15960.1243712380@gamaville.dokosmarshall.org \
    --to=nicholas.dokos@hp.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=rpgoldman@sift.info \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).