emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Capture template and elisp expression
@ 2011-01-06 12:08 Rainer M Krug
  2011-01-06 22:26 ` Nick Dokos
  0 siblings, 1 reply; 13+ messages in thread
From: Rainer M Krug @ 2011-01-06 12:08 UTC (permalink / raw)
  To: emacs-orgmode

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


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 the
Capture has been initiated (here
~/Documents/Projects/BiocontrolAndAlienDynamics/nonSpatialAcacia/trunc/R/nsa.org
)?

Thanks,

Rainer

- -- 
Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation
Biology, UCT), Dipl. Phys. (Germany)

Centre of Excellence for Invasion Biology
Natural Sciences Building
Office Suite 2039
Stellenbosch University
Main Campus, Merriman Avenue
Stellenbosch
South Africa

Tel:        +33 - (0)9 53 10 27 44
Cell:       +27 - (0)8 39 47 90 42
Fax (SA):   +27 - (0)8 65 16 27 82
Fax (D) :   +49 - (0)3 21 21 25 22 44
Fax (FR):   +33 - (0)9 58 10 27 44
email:      Rainer@krugs.de

Skype:      RMkrug
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk0lsL4ACgkQoYgNqgF2egqR+ACfYJeAc3K6DM9YQh5E7TleGscY
i5oAn07YTRrie1i+7XieuyYcw9AOtFh/
=T3LH
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-06 12:08 Capture template and elisp expression Rainer M Krug
@ 2011-01-06 22:26 ` Nick Dokos
  2011-01-06 22:44   ` Carsten Dominik
  0 siblings, 1 reply; 13+ messages in thread
From: Nick Dokos @ 2011-01-06 22:26 UTC (permalink / raw)
  To: Rainer M Krug; +Cc: nicholas.dokos, emacs-orgmode

Rainer M Krug <r.m.krug@gmail.com> 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 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 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 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 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 what
the function above gets is a literal "%a": the subtitution 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 (see
the thread http://thread.gmane.org/gmane.emacs.orgmode/27649), so if it
is changed back, Sebastion Rose will not be happy :-)

So it seems there is no way to pass values from the capture context to a
lisp function in the capture template, but maybe I'm missing 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? Perhaps
a %f escape?

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-06 22:26 ` Nick Dokos
@ 2011-01-06 22:44   ` Carsten Dominik
  2011-01-06 23:41     ` Nick Dokos
                       ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Carsten Dominik @ 2011-01-06 22:44 UTC (permalink / raw)
  To: nicholas.dokos; +Cc: emacs-orgmode, Rainer M Krug


On Jan 6, 2011, at 11:26 PM, Nick Dokos wrote:

> Rainer M Krug <r.m.krug@gmail.com> 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 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 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 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  
> 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  
> what
> the function above gets is a literal "%a": the subtitution 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  
> (see
> the thread http://thread.gmane.org/gmane.emacs.orgmode/27649), so if  
> it
> is changed back, Sebastion Rose will not be happy :-)
>
> So it seems there is no way to pass values from the capture context  
> to a
> lisp function in the capture template, but maybe I'm missing  
> 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?  
> 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 property  
list,
and any other information we like.  This should happen in the 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.

- Carsten






>
> _______________________________________________
> Emacs-orgmode mailing list
> Please use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-06 22:44   ` Carsten Dominik
@ 2011-01-06 23:41     ` Nick Dokos
  2011-01-07  8:22     ` Rainer M Krug
  2011-01-07 12:08     ` Štěpán Němec
  2 siblings, 0 replies; 13+ messages in thread
From: Nick Dokos @ 2011-01-06 23:41 UTC (permalink / raw)
  To: Carsten Dominik; +Cc: nicholas.dokos, emacs-orgmode, Rainer M Krug

Carsten Dominik <carsten.dominik@gmail.com> wrote:

> > [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?
> > 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 property
> list,
> and any other information we like.  This should happen in the 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.
> 

It sure does - thanks!

Nick

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-06 22:44   ` Carsten Dominik
  2011-01-06 23:41     ` Nick Dokos
@ 2011-01-07  8:22     ` Rainer M Krug
  2011-01-07 14:03       ` Nick Dokos
  2011-01-07 12:08     ` Štěpán Němec
  2 siblings, 1 reply; 13+ messages in thread
From: Rainer M Krug @ 2011-01-07  8:22 UTC (permalink / raw)
  To: Carsten Dominik; +Cc: nicholas.dokos, emacs-orgmode

On 01/06/2011 11:44 PM, Carsten Dominik wrote:
> 
> On Jan 6, 2011, at 11:26 PM, Nick Dokos wrote:
> 
>> Rainer M Krug <r.m.krug@gmail.com> 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 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 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 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
>> 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 what
>> the function above gets is a literal "%a": the subtitution 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 (see
>> the thread http://thread.gmane.org/gmane.emacs.orgmode/27649), so if it
>> is changed back, Sebastion Rose will not be happy :-)
>>
>> So it seems there is no way to pass values from the capture context to a
>> lisp function in the capture template, but maybe I'm missing 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? Perhaps
>> a %f escape?
> 
> Hi Nick,

Hi Carsten,

> 
> you can use
> 
>     (buffer-file-name (org-capture-get :original-buffer))

This works perfectly - thanks a million. For the record: I use

%(vc-working-revision (buffer-file-name (org-capture-get :original-buffer)))

to get the vc revision number.
But now I thought - OK - now I can add the state of the file, returned
by vc-state (this is working i a nother document in the org-document).
So I added:

%(vc-state (buffer-file-name (org-capture-get :original-buffer)))

but I get the error

Capture abort: (wrong-type-argument char-or-string-p edited)

It seems, that vc-state (which should be "up-to-date" or "edited") does
return a different type then vc-working-revision ? Can I convert
vc-state, so that it works?

> 
> and we could certainly introduce a special escape for it if helpful.

as this is a basic info, I think it would be useful to have a special
escape for this.

> 
> If it is easier, we can also put the filename itself into the property
> list,
> and any other information we like.  This should happen in the 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.

In addition to above, it should also be in the properties, oncluding
with other information, like e.g. path.

> 
> 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.

Does this affect me for my template, or does it concern the
implementation of the buffer name as a property (above)? Because if it
does affect my template, I should ask for clarification, because I don't
understand what you mean here.

> 
> Hope this helps.

This definitely helps,

Thanks a lot,
Cheers,

Rainer

> 
> - Carsten
> 
> 
> 
> 
> 
> 
>>
>> _______________________________________________
>> Emacs-orgmode mailing list
>> Please use `Reply All' to send replies to the list.
>> Emacs-orgmode@gnu.org
>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
> 


-- 
Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation
Biology, UCT), Dipl. Phys. (Germany)

Centre of Excellence for Invasion Biology
Natural Sciences Building
Office Suite 2039
Stellenbosch University
Main Campus, Merriman Avenue
Stellenbosch
South Africa

Tel:        +33 - (0)9 53 10 27 44
Cell:       +27 - (0)8 39 47 90 42
Fax (SA):   +27 - (0)8 65 16 27 82
Fax (D) :   +49 - (0)3 21 21 25 22 44
Fax (FR):   +33 - (0)9 58 10 27 44
email:      Rainer@krugs.de

Skype:      RMkrug

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-06 22:44   ` Carsten Dominik
  2011-01-06 23:41     ` Nick Dokos
  2011-01-07  8:22     ` Rainer M Krug
@ 2011-01-07 12:08     ` Štěpán Němec
  2011-01-07 14:14       ` Carsten Dominik
  2 siblings, 1 reply; 13+ messages in thread
From: Štěpán Němec @ 2011-01-07 12:08 UTC (permalink / raw)
  To: Carsten Dominik; +Cc: nicholas.dokos, emacs-orgmode, Rainer M Krug

Carsten Dominik <carsten.dominik@gmail.com> writes:

> On Jan 6, 2011, at 11:26 PM, Nick Dokos wrote:
>
>> Rainer M Krug <r.m.krug@gmail.com> 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 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 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 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 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 what
>> the function above gets is a literal "%a": the subtitution 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 (see
>> the thread http://thread.gmane.org/gmane.emacs.orgmode/27649), so if it
>> is changed back, Sebastion Rose will not be happy :-)
>>
>> So it seems there is no way to pass values from the capture context to a
>> lisp function in the capture template, but maybe I'm missing 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? 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 property list,
> and any other information we like.  This should happen in the 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 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 might
be missing something. Is there a reason for that?

  Štěpán

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-07  8:22     ` Rainer M Krug
@ 2011-01-07 14:03       ` Nick Dokos
  2011-01-07 14:31         ` Rainer M Krug
  0 siblings, 1 reply; 13+ messages in thread
From: Nick Dokos @ 2011-01-07 14:03 UTC (permalink / raw)
  To: Rainer M Krug; +Cc: nicholas.dokos, emacs-orgmode, Carsten Dominik

Rainer M Krug <r.m.krug@gmail.com> wrote:

> But now I thought - OK - now I can add the state of the file, returned
> by vc-state (this is working i a nother document in the org-document).
> So I added:
> 
> %(vc-state (buffer-file-name (org-capture-get :original-buffer)))
> 
> but I get the error
> 
> Capture abort: (wrong-type-argument char-or-string-p edited)
> 
> It seems, that vc-state (which should be "up-to-date" or "edited") does
> return a different type then vc-working-revision ? Can I convert
> vc-state, so that it works?
> 

Yes, vc-state returns a symbol. You can convert it to a string with
symbol-name.

Nick

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-07 12:08     ` Štěpán Němec
@ 2011-01-07 14:14       ` Carsten Dominik
  2011-01-07 14:28         ` Rainer M Krug
  2011-01-07 15:00         ` Štěpán Němec
  0 siblings, 2 replies; 13+ messages in thread
From: Carsten Dominik @ 2011-01-07 14:14 UTC (permalink / raw)
  To: Štěpán Němec
  Cc: nicholas.dokos, emacs-orgmode, Rainer M Krug


On Jan 7, 2011, at 1:08 PM, Štěpán Němec wrote:

> Carsten Dominik <carsten.dominik@gmail.com> writes:
>
>> On Jan 6, 2011, at 11:26 PM, Nick Dokos wrote:
>>
>>> Rainer M Krug <r.m.krug@gmail.com> 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  
>>>> 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  
>>> 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  
>>> 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  
>>> 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  
>>> what
>>> the function above gets is a literal "%a": the subtitution  
>>> 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  
>>> (see
>>> the thread http://thread.gmane.org/gmane.emacs.orgmode/27649), so  
>>> if it
>>> is changed back, Sebastion Rose will not be happy :-)
>>>
>>> So it seems there is no way to pass values from the capture  
>>> context to a
>>> lisp function in the capture template, but maybe I'm missing  
>>> 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?  
>>> 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  
>> property list,
>> and any other information we like.  This should happen in the  
>> 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  
> 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  
> 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

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-07 14:14       ` Carsten Dominik
@ 2011-01-07 14:28         ` Rainer M Krug
  2011-01-07 15:00         ` Štěpán Němec
  1 sibling, 0 replies; 13+ messages in thread
From: Rainer M Krug @ 2011-01-07 14:28 UTC (permalink / raw)
  To: Carsten Dominik
  Cc: emacs-orgmode, nicholas.dokos, Štěpán Němec

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 01/07/2011 03:14 PM, Carsten Dominik wrote:
> 
> On Jan 7, 2011, at 1:08 PM, Štěpán Němec wrote:
> 
>> Carsten Dominik <carsten.dominik@gmail.com> writes:
>>
>>> On Jan 6, 2011, at 11:26 PM, Nick Dokos wrote:
>>>
>>>> Rainer M Krug <r.m.krug@gmail.com> 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 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 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 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
>>>> 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 what
>>>> the function above gets is a literal "%a": the subtitution 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 (see
>>>> the thread http://thread.gmane.org/gmane.emacs.orgmode/27649), so if it
>>>> is changed back, Sebastion Rose will not be happy :-)
>>>>
>>>> So it seems there is no way to pass values from the capture context
>>>> to a
>>>> lisp function in the capture template, but maybe I'm missing 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? 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
>>> property list,
>>> and any other information we like.  This should happen in the 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 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 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.

Just an idea - as you said, it makes sense to evaluate it in the
template buffer. But, if it is technically nod difficult, what about
adding an additional escape, e.g.

%ob(sexp)

for which sexp is evaluated in the original buffer, from which capture
is called? in that way, many problems could be solved with a minimum of
effort.

Cheers,

Rainer


> 
> - Carsten


- -- 
Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation
Biology, UCT), Dipl. Phys. (Germany)

Centre of Excellence for Invasion Biology
Natural Sciences Building
Office Suite 2039
Stellenbosch University
Main Campus, Merriman Avenue
Stellenbosch
South Africa

Tel:        +33 - (0)9 53 10 27 44
Cell:       +27 - (0)8 39 47 90 42
Fax (SA):   +27 - (0)8 65 16 27 82
Fax (D) :   +49 - (0)3 21 21 25 22 44
Fax (FR):   +33 - (0)9 58 10 27 44
email:      Rainer@krugs.de

Skype:      RMkrug
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk0nIxQACgkQoYgNqgF2egpzJACeMEo8CwLEdpWejMDIFSQ501J3
lPEAnjICYXk8pyhNhvbjVDB/2gi5JCW5
=Q4YK
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-07 14:03       ` Nick Dokos
@ 2011-01-07 14:31         ` Rainer M Krug
  0 siblings, 0 replies; 13+ messages in thread
From: Rainer M Krug @ 2011-01-07 14:31 UTC (permalink / raw)
  To: nicholas.dokos; +Cc: emacs-orgmode, Carsten Dominik

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 01/07/2011 03:03 PM, Nick Dokos wrote:
> Rainer M Krug <r.m.krug@gmail.com> wrote:
> 
>> But now I thought - OK - now I can add the state of the file, returned
>> by vc-state (this is working i a nother document in the org-document).
>> So I added:
>>
>> %(vc-state (buffer-file-name (org-capture-get :original-buffer)))
>>
>> but I get the error
>>
>> Capture abort: (wrong-type-argument char-or-string-p edited)
>>
>> It seems, that vc-state (which should be "up-to-date" or "edited") does
>> return a different type then vc-working-revision ? Can I convert
>> vc-state, so that it works?
>>
> 
> Yes, vc-state returns a symbol. You can convert it to a string with
> symbol-name.

Thanks - it's working perfectly now

Cheers,

Rainer

> 
> Nick


- -- 
Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation
Biology, UCT), Dipl. Phys. (Germany)

Centre of Excellence for Invasion Biology
Natural Sciences Building
Office Suite 2039
Stellenbosch University
Main Campus, Merriman Avenue
Stellenbosch
South Africa

Tel:        +33 - (0)9 53 10 27 44
Cell:       +27 - (0)8 39 47 90 42
Fax (SA):   +27 - (0)8 65 16 27 82
Fax (D) :   +49 - (0)3 21 21 25 22 44
Fax (FR):   +33 - (0)9 58 10 27 44
email:      Rainer@krugs.de

Skype:      RMkrug
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk0nI8gACgkQoYgNqgF2egpK8QCghhEbFrO6ENA93fEM8KonkB13
grwAmwas8uKA83JdoyLwXlImZtmTVtfS
=h2xa
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-07 14:14       ` Carsten Dominik
  2011-01-07 14:28         ` Rainer M Krug
@ 2011-01-07 15:00         ` Štěpán Němec
  2011-01-08 17:58           ` Carsten Dominik
  1 sibling, 1 reply; 13+ messages in thread
From: Štěpán Němec @ 2011-01-07 15:00 UTC (permalink / raw)
  To: Carsten Dominik; +Cc: nicholas.dokos, emacs-orgmode, Rainer M Krug

Carsten Dominik <carsten.dominik@gmail.com> writes:

> On Jan 7, 2011, at 1:08 PM, Štěpán Němec wrote:
>> Why aren't the %() expressions simply evaluated in the original buffer
>> (if available)? That would solve these issues in a general way. It 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 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.

I don't understand this argument. Of course the _result_ of the
evaluation is inserted into the template, but why is it useful to
evaluate the expression itself in the context of the template buffer? Is
it likely that one would be interested in some information only
available in the template buffer? To me it seems that the much more
likely case is the one of Rainer -- i.e. the need to access variable
bindings from the original buffer (buffer name, mode, other local
variables etc.).

  Štěpán

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-07 15:00         ` Štěpán Němec
@ 2011-01-08 17:58           ` Carsten Dominik
  2011-01-08 18:07             ` Štěpán Němec
  0 siblings, 1 reply; 13+ messages in thread
From: Carsten Dominik @ 2011-01-08 17:58 UTC (permalink / raw)
  To: Štěpán Němec
  Cc: nicholas.dokos, emacs-orgmode, Rainer M Krug


On Jan 7, 2011, at 4:00 PM, Štěpán Němec wrote:

> Carsten Dominik <carsten.dominik@gmail.com> writes:
>
>> On Jan 7, 2011, at 1:08 PM, Štěpán Němec wrote:
>>> Why aren't the %() expressions simply evaluated in the original  
>>> buffer
>>> (if available)? That would solve these issues in a general way. It  
>>> 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  
>>> 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.
>
> I don't understand this argument. Of course the _result_ of the
> evaluation is inserted into the template, but why is it useful to
> evaluate the expression itself in the context of the template  
> buffer? Is
> it likely that one would be interested in some information only
> available in the template buffer? To me it seems that the much more
> likely case is the one of Rainer -- i.e. the need to access variable
> bindings from the original buffer (buffer name, mode, other local
> variables etc.).


Such a function is allowed to do anything.  It might search around
in the template, change things, whatever.  So I don't think it
should be evaluated in a different buffer.

- Carsten



>
>  Štěpán

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Capture template and elisp expression
  2011-01-08 17:58           ` Carsten Dominik
@ 2011-01-08 18:07             ` Štěpán Němec
  0 siblings, 0 replies; 13+ messages in thread
From: Štěpán Němec @ 2011-01-08 18:07 UTC (permalink / raw)
  To: Carsten Dominik; +Cc: nicholas.dokos, emacs-orgmode, Rainer M Krug

Carsten Dominik <carsten.dominik@gmail.com> writes:

> On Jan 7, 2011, at 4:00 PM, Štěpán Němec wrote:
>
>> Carsten Dominik <carsten.dominik@gmail.com> writes:
>>
>>> On Jan 7, 2011, at 1:08 PM, Štěpán Němec wrote:
>>>> Why aren't the %() expressions simply evaluated in the original buffer
>>>> (if available)? That would solve these issues in a general way. It 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 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.
>>
>> I don't understand this argument. Of course the _result_ of the
>> evaluation is inserted into the template, but why is it useful to
>> evaluate the expression itself in the context of the template buffer? Is
>> it likely that one would be interested in some information only
>> available in the template buffer? To me it seems that the much more
>> likely case is the one of Rainer -- i.e. the need to access variable
>> bindings from the original buffer (buffer name, mode, other local
>> variables etc.).
>
>
> Such a function is allowed to do anything.  It might search around
> in the template, change things, whatever.  So I don't think it
> should be evaluated in a different buffer.

OK, thank you for the explanation. One can always do

  (with-current-buffer (org-capture-get :original-buffer) ...)

should the need arise.

  Štěpán

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2011-01-08 18:10 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-06 12:08 Capture template and elisp expression Rainer M Krug
2011-01-06 22:26 ` Nick Dokos
2011-01-06 22:44   ` Carsten Dominik
2011-01-06 23:41     ` Nick Dokos
2011-01-07  8:22     ` Rainer M Krug
2011-01-07 14:03       ` Nick Dokos
2011-01-07 14:31         ` Rainer M Krug
2011-01-07 12:08     ` Štěpán Němec
2011-01-07 14:14       ` Carsten Dominik
2011-01-07 14:28         ` Rainer M Krug
2011-01-07 15:00         ` Štěpán Němec
2011-01-08 17:58           ` Carsten Dominik
2011-01-08 18:07             ` Štěpán Němec

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).