From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ryo TAKAISHI Subject: Re: [PATCH] Capture: Expand keyword within %(SEXP) in template Date: Sun, 04 Nov 2012 16:51:36 +0900 Message-ID: <87hap5rek7.fsf@gmail.com> References: <1351848001-11636-1-git-send-email-ryo.takaishi.0@gmail.com> <87ip9oi5qt.fsf@gmail.com> <878vak9kib.fsf@gmail.com> <87a9v0hz7j.fsf@gmail.com> <87lieknhjy.fsf@gmail.com> <87sj8rgjn6.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([208.118.235.92]:34285) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TUuzZ-0005o5-K7 for emacs-orgmode@gnu.org; Sun, 04 Nov 2012 02:51:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TUuzY-0006R9-CB for emacs-orgmode@gnu.org; Sun, 04 Nov 2012 02:51:37 -0500 Received: from mail-pa0-f41.google.com ([209.85.220.41]:56607) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TUuzY-0006Qy-5a for emacs-orgmode@gnu.org; Sun, 04 Nov 2012 02:51:36 -0500 Received: by mail-pa0-f41.google.com with SMTP id fa10so3469630pad.0 for ; Sun, 04 Nov 2012 00:51:34 -0700 (PDT) In-Reply-To: <87sj8rgjn6.fsf@gmail.com> (Nicolas Goaziou's message of "Sat, 03 Nov 2012 09:45:01 +0100") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Nicolas Goaziou Cc: emacs-orgmode@gnu.org Nicolas Goaziou writes: > The code looks good, although I would have moved the external `mapcar' > within the worker function in order to make its purpose clearer. > > Also, would you mind to provide a docstring for the function? Something > along the lines of: > > "Recursively replace capture link keywords in ATTR sexp. > Such keywords are prefixed with "%:". See `org-capture-template' for > more information." > > You may also want to rename it > `org-capture--expand-keyword-in-embedded-elisp' to insist on the fact it > is an internal function. That's not mandatory, though. > > Finally, this feature must be documented in `org-capture-templates' > docstring and org.texi. Hello, I fixed and added document in docstring & org.texi. Is my additional document fully? Regards, Ryo doc/org.texi | 2 ++ lisp/org-capture.el | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/doc/org.texi b/doc/org.texi index b23f492..b661dac 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -6853,6 +6853,8 @@ dynamic insertion of content. The templates are expanded in the order given her @smallexample %[@var{file}] @r{Insert the contents of the file given by @var{file}.} %(@var{sexp}) @r{Evaluate Elisp @var{sexp} and replace with the result.} + @r{If sexp's attr is link keyword (@code{%:keyword}),} + @r{it will be expanded using @code{org-store-link-plist}.} @r{The sexp must return a string.} %<...> @r{The result of format-time-string on the ... format specification.} %t @r{Timestamp, date only.} diff --git a/lisp/org-capture.el b/lisp/org-capture.el index 1dfffc6..fcaa4f9 100644 --- a/lisp/org-capture.el +++ b/lisp/org-capture.el @@ -224,6 +224,8 @@ be replaced with content and expanded in this order: %[pathname] Insert the contents of the file given by `pathname'. %(sexp) Evaluate elisp `(sexp)' and replace with the result. + If sexp's attr is link keyword (%:keyword), it will + be expanded using `org-store-link-plist`. %<...> The result of format-time-string on the ... format specification. %t Time stamp, date only. %T Time stamp with date and time. @@ -1621,10 +1623,26 @@ The template may still contain \"%?\" for cursor positioning." (goto-char (match-beginning 0)) (let ((template-start (point))) (forward-char 1) - (let ((result (org-eval (read (current-buffer))))) + (let* ((sexp (org-capture-expand-keyword-in-embedded-elisp + (read (current-buffer)))) + (result (org-eval sexp))) (delete-region template-start (point)) (insert result)))))) +(defun org-capture--expand-keyword-in-embedded-elisp (attr) + "Recursively replace capture link keywords in ATTR sexp. +Such keywords are prefixed with "%:". See `org-capture-template` +for more information." + (cond ((consp attr) + (mapcar 'org-capture--expand-keyword-in-embedded-elisp attr)) + ((symbolp attr) + (let* ((attr-symbol (symbol-name attr)) + (key (and (string-match "%\\(:.*\\)" attr-symbol) + (intern (match-string 1 attr-symbol))))) + (or (plist-get org-store-link-plist key) + attr))) + (t attr))) + (defun org-capture-inside-embedded-elisp-p () "Return non-nil if point is inside of embedded elisp %(sexp)." (let (beg end) -- 1.7.9.5