emacs-orgmode
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]