From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carsten Dominik Subject: Re: Capture template and elisp expression Date: Fri, 7 Jan 2011 15:14:15 +0100 Message-ID: References: <4D25B0BE.3040408@gmail.com> <23766.1294352789@gamaville.americas.hpqcorp.net> <87mxnc6hnf.fsf@gmail.com> Mime-Version: 1.0 (Apple Message framework v936) Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes Content-Transfer-Encoding: quoted-printable Return-path: Received: from [140.186.70.92] (port=57097 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PbD5B-0002ra-UQ for emacs-orgmode@gnu.org; Fri, 07 Jan 2011 09:14:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PbD5A-0000w5-Fq for emacs-orgmode@gnu.org; Fri, 07 Jan 2011 09:14:21 -0500 Received: from mail-ew0-f41.google.com ([209.85.215.41]:64409) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PbD5A-0000vy-2r for emacs-orgmode@gnu.org; Fri, 07 Jan 2011 09:14:20 -0500 Received: by ewy27 with SMTP id 27so8524615ewy.0 for ; Fri, 07 Jan 2011 06:14:18 -0800 (PST) In-Reply-To: <87mxnc6hnf.fsf@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: =?UTF-8?Q?=C5=A0t=C4=9Bp=C3=A1n_N=C4=9Bmec?= Cc: nicholas.dokos@hp.com, emacs-orgmode , Rainer M Krug On Jan 7, 2011, at 1:08 PM, =C5=A0t=C4=9Bp=C3=A1n N=C4=9Bmec wrote: > Carsten Dominik writes: > >> On Jan 6, 2011, at 11:26 PM, Nick Dokos wrote: >> >>> Rainer M Krug wrote: >>> >>>> >>>> Hi >>>> >>>> I want to use a Capture Template to record changes to files under >>>> version control. Everything works as expected, but I would like to >>>> include the current revision in the template. >>>> >>>> Therefore I tried the following: >>>> >>>> * %T %? at %a by Rainer M Krug, email: Rainer@krugs.de >>>> %(vc-working-revision buffer-file-name) >>>> >>>> for the template, but I get an error: >>>> >>>> **** <2011-01-06 Thu 13:06> at >>>> [[file:~/Documents/Projects/BiocontrolAndAlienDynamics/ >>>> nonSpatialAcacia/trunc/R/nsa.org::*Finalise][Finalise]] >>>> by Rainer M Krug, email: Rainer@krugs.de %![Error: (wrong-type- >>>> argument >>>> stringp nil)] >>>> >>>> Any idea how I could get the revision of the org file from which =20= >>>> the >>>> Capture has been initiated (here >>>> ~/Documents/Projects/BiocontrolAndAlienDynamics/nonSpatialAcacia/ >>>> trunc/R/nsa.org >>>> )? >>>> >>> >>> There are a few problems: the evaluation of the sexp happens in the >>> capture buffer where buffer-file-name returns nil. Even if you could >>> get the file name, vc-working-revision would return nil on a file =20= >>> that >>> is not VC-registered and the template would barf. >>> >>> Those are easy problems to solve but there is another one that seems >>> insurmountable (with current code): my original thought was to use =20= >>> the >>> %a escape to pass the link to a lisp function, extract the file name >>> from it[fn:1] and run vc-working-revision on it (with appropriate =20= >>> safeguards >>> to catch non-VC files), something like this: >>> >>> "* %T %? at %a by Rainer M Krug, email: Rainer@krugs.de %(rk- >>> custom-function-to-get-vc-revision \"%a\")" >>> >>> However, this fails because at the time that %(sexp) constructs are >>> expanded, simple %a etc. constructs have not been expanded yet, so =20= >>> what >>> the function above gets is a literal "%a": the subtitution =20 >>> sequence is >>> >>> ;; %[] Insert contents of a file. >>> >>> ... >>> >>> ;; %() embedded elisp >>> >>> ... >>> >>> ;; Simple %-escapes >>> >>> (see lisp/org-capture.el, lines 1181-1229 or so). >>> >>> Moreover, this sequence was different and was changed deliberately =20= >>> (see >>> the thread http://thread.gmane.org/gmane.emacs.orgmode/27649), so =20= >>> if it >>> is changed back, Sebastion Rose will not be happy :-) >>> >>> So it seems there is no way to pass values from the capture =20 >>> context to a >>> lisp function in the capture template, but maybe I'm missing =20 >>> something. >>> >>> Thanks, >>> Nick >>> >>> Footnotes: >>> [fn:1] Is there an easier way to get the filename of the file I was >>> visiting when I initiated the capture? If not, should there be? =20 >>> Perhaps >>> a %f escape? >> >> Hi Nick, >> >> you can use >> >> (buffer-file-name (org-capture-get :original-buffer)) >> >> and we could certainly introduce a special escape for it if helpful. >> >> If it is easier, we can also put the filename itself into the =20 >> property list, >> and any other information we like. This should happen in the =20 >> function >> org-capture, >> close to the location where the buffer is stored, so near this line: >> >> (org-capture-put :original-buffer orig-buf :annotation = annotation >> :initial initial) >> >> org-capture uses this property list precisely so that it is simple >> to add any information required. >> >> Note that, after the template has been filled in, it is better >> to access information in the property list with >> >> >> (org-capture-get PROPERTY 'local) >> >> to avoid conflicts with other ongoing capture processes. >> >> Hope this helps. > > Why aren't the %() expressions simply evaluated in the original buffer > (if available)? That would solve these issues in a general way. It =20 > seems > to me that there is no advantage to evaluating the expressions in the > temporary capture buffer, but I'm not familiar with the code so I =20 > might > be missing something. Is there a reason for that? The sexp can be used to insert stuff into the template, so I think it is correct to evaluate it in the template buffer. - Carsten=