[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [O] How to use org-capture with "dynamic ID" targets?
From: |
Darlan Cavalcante Moreira |
Subject: |
Re: [O] How to use org-capture with "dynamic ID" targets? |
Date: |
Mon, 28 Jan 2013 15:05:48 -0300 |
User-agent: |
Wanderlust/2.15.9 (Almost Unreal) Emacs/24.3 Mule/6.0 (HANACHIRUSATO) |
At Thu, 24 Jan 2013 20:01:47 +0100,
Bastien wrote:
>
> Hi Darlan,
>
> Darlan Cavalcante Moreira <address@hidden> writes:
>
> > everything works as expected and a table in the headline with ID
> > "someIDstring" is used. However, if I try
> >
> > ("f" "The template description" table-line
> > (id some_variable)
> > "this is the template content"
> > :table-line-pos "II-1"
> > :immediate-finish t)
>
> Can you provide the full (setq org-capture-templates ...)
> s-expression?
Hi Bastien,
First I created an org-mode file with the following content to act as the
target.
--8<---------------cut here---------------start------------->8---
* Test table
:PROPERTIES:
:ID: MyTestID
:END:
| | Nome | Valor |
|---+----------------+-------|
| | something | 12.00 |
| | something else | 23.45 |
|---+----------------+-------|
| # | Total | 35.45 |
#+TBLFM: @4$3=vsum(@address@hidden);%.2f
--8<---------------cut here---------------end--------------->8---
The capture template is something as simple as
--8<---------------cut here---------------start------------->8---
(setq org-capture-templates
'(
("f" "Add a new product and value")
("ff" "Table" table-line
(id "MyTestID")
"|| %^{Product} | %^{Value} |"
:table-line-pos "II-1"
:immediate-finish t)))
--8<---------------cut here---------------end--------------->8---
This works as expected, but for my use case each month the target should be
a different table (which I create with a different ID). Obviously manually
changing the capture template each month is error prone and easy to
forget. Therefore, tried to change the ID to a function providing the new
target or a variable. For instance the code below.
--8<---------------cut here---------------start------------->8---
(setq myIDVar "MyTestID")
(setq org-capture-templates
'(
("f" "Add a new product and value")
("ff" "Table" table-line
(id myIDVar)
"|| %^{Product} | %^{Value} |"
:table-line-pos "II-1"
:immediate-finish t)))
--8<---------------cut here---------------end--------------->8---
When I try to capture with this second template Emacs complains that it
cannot find the target ID "myIDVar". What I expected is that it would
search for the ID "MyTestID" that is the value of myIDVar and not for an ID
"myIDVar"
I have also tried the code below and it does not work either
--8<---------------cut here---------------start------------->8---
(defun some-function-return-the-id ()
"DOCSTRING"
(interactive)
"MyTestID")
(setq org-capture-templates
'(
("f" "Add a new product and value")
("ff" "Table" table-line
(id (some-function-return-the-id))
"|| %^{Product} | %^{Value} |"
:table-line-pos "II-1"
:immediate-finish t)))
--8<---------------cut here---------------end--------------->8---
> Did you tried this?
>
> (setq org-capture-templates
> `(("f" "The template description" table-line
> (id ,some_variable)
> "this is the template content"
> :table-line-pos "II-1"
> :immediate-finish t)))
>
> > then it does not work even if some_variable or (some_function) provides the
> > correct ID value. It seems that
> > (id something)
> > will always interpret "something" as a string (no matter if I put it inside
> > quotes or not).
>
> Yes, it expects a string.
>
> > Is it possible to achieve what I want with the current org-capture
> > implementation?
>
> See above. The problem being, of course, that the capture template
> for "f" will use some_variable *statically* -- if the value of the
> some_variable variable changed after you evaluated the s-expression
> (setq org-capture-templates ...) then the new value will not be
> known.
>
This is something I'll have to keep in mind. However, I don't expect this
to be a problem since I start Emacs everyday. It is enough for me if I can
set the ID to a variable (before setting org-capture-templates) and it uses
the variable value as the ID, instead of trying to interpret the variable
name as the ID. In fact, even if I ever need to change the variable value
after org-capture-templates was set I'm fine by just reevaluating (setq
org-capture-templates ...) again so that it sees the new value.
> > If not, consider this as a feature request.
>
> What feature exactly? To allow a function here that would dynamically
> set the id?
>
Exactly. Simple using the value of whatever list object I put there. Be it
a variable value or a function that provides the. I'm fine if the value
provided by a variable or a function is only read when
org-capture-templates is set.
> > The reason behind this is that each month I want a different target table
> > for this capture template and I already implemented a function that returns
> > the correct ID. If I can somehow make the ID target type use the return
> > value of this function then this capture template will use the correct
> > table each month. If not, I would be forced to manually change the capture
> > template in the beginning of each month (something I will definitely
> > forget).
>
> If you want to use a function ,some_variable will not work, check
> ,@ constructs in the Elisp manual.
>
My lisp knowledge is very limited to what I have seen in my Emacs
initialization (and a lot of trying and error). But I have never seen "@"
used in lisp nor I know what terms to search for it..
Regards,
Darlan
> Thanks,
>
> --
> Bastien