From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adam Spiers Subject: Re: inserting files within remember templates Date: Sat, 24 Nov 2007 14:52:27 +0000 Message-ID: <20071124145227.GB30662@atlantic.linksys.moosehall> References: <20071105181739.GB13544@atlantic.linksys.moosehall> <8A730AEC-45F4-4A2F-BD38-24DEBF937445@science.uva.nl> <20071106163647.GC13544@atlantic.linksys.moosehall> <20071106223950.GA6033@atlantic.linksys.moosehall> <31C9500E-1350-48A8-9738-5C7EFC072AB0@science.uva.nl> Reply-To: Adam Spiers Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1IvwMy-0003sY-KD for emacs-orgmode@gnu.org; Sat, 24 Nov 2007 09:52:32 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1IvwMw-0003on-TF for emacs-orgmode@gnu.org; Sat, 24 Nov 2007 09:52:31 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1IvwMw-0003oc-N9 for emacs-orgmode@gnu.org; Sat, 24 Nov 2007 09:52:30 -0500 Received: from mail.beimborn.com ([70.84.38.100]) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1IvwMw-00085G-8b for emacs-orgmode@gnu.org; Sat, 24 Nov 2007 09:52:30 -0500 Received: from mail.beimborn.com (localhost.localdomain [127.0.0.1]) by mail.beimborn.com (8.12.11.20060308/8.12.8) with ESMTP id lAOEqSlq012097 for ; Sat, 24 Nov 2007 08:52:28 -0600 Received: from localhost (localhost [[UNIX: localhost]]) by mail.beimborn.com (8.12.11.20060308/8.12.11/Submit) id lAOEqSw5012091 for emacs-orgmode@gnu.org; Sat, 24 Nov 2007 14:52:28 GMT Content-Disposition: inline In-Reply-To: <31C9500E-1350-48A8-9738-5C7EFC072AB0@science.uva.nl> 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: emacs-orgmode@gnu.org On Wed, Nov 07, 2007 at 09:42:55AM +0100, Carsten Dominik wrote: > On 6 Nov 2007, at 11:39 PM, Adam Spiers wrote: > > On Tue, Nov 06, 2007 at 04:36:47PM +0000, Adam Spiers wrote: > > > This could easily be accomplished if remember templates allowed > > > syntax such as > > > > > > ,------ > > > | * %T > > > | %(shell-command-to-string "grep 'last full' /proc/acpi/battery/BAT0/info") > > > `------ > > > > OK, it turns out that this was easy to implement, and I think the > > patch is small enough that it could be accepted even though I haven't > > got around to sending back the copyright assignment form yet (sorry - > > this *will* happen at some point!) > > I'll take this patch, thanks. [snipped] > >There might need to be some debate about how to handle read errors in > >the case of invalid syntax. Or perhaps some people already have > >`%(...)' within their remember templates for some really unusual > >reason, and don't want it interpreted? Though in the latter case, one > >could argue that it might make sense to require `%' always to be > >escaped as `%%' if used literally, to be on the safe side. Here's a better version. Differences: - Supports insertion of the contents of another file via %[/path/to/file] - Embeds any errors within the template, making it clearer that an error occurred, and also exactly which bit of the template caused it. This also lets the user manually correct the error and finish their remembering workflow before having to go back and fix the template, which is much more in keeping with the "remember this quick before I forget!" spirit of remember itself. - Patches texinfo file. - Respects Carsten's apparent preference for having indent-tabs-mode set (though this may make the below patch's indentation look strange due to the hard tabs). diff -r 09b1470ac170 org.el --- a/org.el Wed Oct 31 09:46:35 2007 +0000 +++ b/org.el Sat Nov 24 14:39:51 2007 +0000 @@ -12806,6 +12806,30 @@ to be run from that hook to fucntion pro (replace-match (or (eval (intern (concat "v-" (match-string 1)))) "") t t)) + ;; %[] Insert contents of a file. + (goto-char (point-min)) + (while (re-search-forward "%\\[\\(.+\\)\\]" nil t) + (let ((start (match-beginning 0)) + (end (match-end 0)) + (filename (expand-file-name (match-string 1)))) + (goto-char start) + (delete-region start end) + (condition-case error + (insert-file-contents filename) + (error (insert (format "%%![Couldn't insert %s: %s]" + filename error)))))) + ;; %() embedded elisp + (goto-char (point-min)) + (while (re-search-forward "%\\((.+)\\)" nil t) + (goto-char (match-beginning 0)) + (let ((template-start (point))) + (forward-char 1) + (let ((result + (condition-case error + (eval (read (current-buffer))) + (error (format "%%![Error: %s]" error))))) + (delete-region template-start (point)) + (insert result)))) ;; From the property list (when plist-p (goto-char (point-min)) diff -r 09b1470ac170 org.texi --- a/org.texi Wed Oct 31 09:46:35 2007 +0000 +++ b/org.texi Sat Nov 24 14:39:51 2007 +0000 @@ -4378,6 +4378,8 @@ insertion of content: %^g @r{prompt for tags, with completion on tags in target file.} %^G @r{prompt for tags, with completion all tags in all agenda files.} %:keyword @r{specific information for certain link types, see below} +%[pathname] @r{insert the contents of the file given by @code{pathname}} +%(sexp) @r{evaluate elisp @code{(sexp)} and replace with the result} @end example @noindent