From mboxrd@z Thu Jan 1 00:00:00 1970 From: Darlan Cavalcante Moreira Subject: Re: How to use org-capture with "dynamic ID" targets? Date: Mon, 28 Jan 2013 15:05:48 -0300 Message-ID: <5106be00.0c5e650a.1535.fffff1fa@mx.google.com> References: <50f72bf5.669dec0a.7b79.ffffdcb0@mx.google.com> <87pq0u1k2s.fsf@bzg.ath.cx> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Return-path: Received: from eggs.gnu.org ([208.118.235.92]:53313) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U01eA-00085x-68 for emacs-orgmode@gnu.org; Mon, 28 Jan 2013 22:14:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U01e7-00081J-Tu for emacs-orgmode@gnu.org; Mon, 28 Jan 2013 22:14:06 -0500 Received: from mail-yh0-f42.google.com ([209.85.213.42]:50129) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tzt5e-0000HC-5b for emacs-orgmode@gnu.org; Mon, 28 Jan 2013 13:05:54 -0500 Received: by mail-yh0-f42.google.com with SMTP id w49so447363yhw.29 for ; Mon, 28 Jan 2013 10:05:53 -0800 (PST) In-Reply-To: <87pq0u1k2s.fsf@bzg.ath.cx> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Bastien Cc: emacs-orgmode@gnu.org At Thu, 24 Jan 2013 20:01:47 +0100, Bastien wrote: > > Hi Darlan, > > Darlan Cavalcante Moreira 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(@2..@-1);%.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