Re: [O] Define capture template with dynamic id target
Hi Darlan, On Fri, Jun 10, 2011 at 21:20, Darlan Cavalcante Moreira wrote: > Thanks David, > > I tried to follow your suggestion, but I found two problems (maybe because > I know little about lisp). > > For instance, suppose I have a test.org file with the follow content > --8<---cut here---start->8--- > * 2011 > Every headline has an ID, but I have omitted here for brevity > *** May > * Sub-headline > bla bla bla > *** June > * Sub-headline > bla bla bla > --8<---cut here---end--->8--- > > I want the capture process to add an entry to the Sub-headline of June. If > I just use the file+headline and specify "Sub-headline" then it will add to > the Sub-headline in May. That's why I tried using IDs in the first > place. Also, every month I create a new month headline with the > Sub-headline and the capture process should add an entry to that > instead. That is the reason I wanted to get the ID from a function, instead > of just writing it in the capture template. > > > As far as I understand if I use the file+function target then the function > must return the headline name, but how can I say that I want the > Sub-headline of June and not of May? [first problem] > > I found an org-id-find function that returns something like > "(filename . characterPosition)". Therefore, If there is a way to specify a > position where org should start looking for the headline then I could use > that to go to the correct Sub-headline. > > > Also, the file+headline target will add the entry as a child of the > specified headline, but file+function seems to add the entry as a sibling > of the headline returned by the function. [second problem] Is this intended > behaviour or is it a bug? > [snip] Looking at the code, the function doesn’t need to return anything; it just needs to place point where you want the new headline to appear. Therefore, you can use ‘org-find-olp’ to locate the entry: ,[ C-h f org-find-olp RET ] | org-find-olp is a compiled Lisp function in `org.el'. | | (org-find-olp PATH &optional THIS-BUFFER) | | Return a marker pointing to the entry at outline path OLP. | If anything goes wrong, throw an error. | You can wrap this call to catch the error like this: | | (condition-case msg | (org-mobile-locate-entry (match-string 4)) | (error (nth 1 msg))) | | The return value will then be either a string with the error message, | or a marker if everything is OK. | | If THIS-BUFFER is set, the outline path does not contain a file, | only headings. ` So the code would look something like this: , | (org-find-olp '("2011" "May" "Sub-headline") t) ` Aankhen
Re: [O] Define capture template with dynamic id target
Thanks David, I tried to follow your suggestion, but I found two problems (maybe because I know little about lisp). For instance, suppose I have a test.org file with the follow content --8<---cut here---start->8--- * 2011 Every headline has an ID, but I have omitted here for brevity *** May * Sub-headline bla bla bla *** June * Sub-headline bla bla bla --8<---cut here---end--->8--- I want the capture process to add an entry to the Sub-headline of June. If I just use the file+headline and specify "Sub-headline" then it will add to the Sub-headline in May. That's why I tried using IDs in the first place. Also, every month I create a new month headline with the Sub-headline and the capture process should add an entry to that instead. That is the reason I wanted to get the ID from a function, instead of just writing it in the capture template. As far as I understand if I use the file+function target then the function must return the headline name, but how can I say that I want the Sub-headline of June and not of May? [first problem] I found an org-id-find function that returns something like "(filename . characterPosition)". Therefore, If there is a way to specify a position where org should start looking for the headline then I could use that to go to the correct Sub-headline. Also, the file+headline target will add the entry as a child of the specified headline, but file+function seems to add the entry as a sibling of the headline returned by the function. [second problem] Is this intended behaviour or is it a bug? -- Thanks again, Darlan At Fri, 10 Jun 2011 07:31:43 +0200, David Maus wrote: > > [1 ] > At Thu, 09 Jun 2011 15:18:00 -0300, > Darlan Cavalcante Moreira wrote: > > > > > > Hello List, > > > > I'm trying to create a few templates for org capture and I have found a > > weird behavior with the ID target type. It works OK if I use the ID > > directly like below > > #+begin_src emacs-lisp > > (id "Junho2011Contas") > > #+end_src > > but it does not find the ID if I try to get it from a function, such as > > #+begin_src emacs-lisp > > (id (get-me-an-org-id-for-the-month "Contas")) > > #+end_src > > Org capture does not support executing a function in the ID target spec. > > C-h v org-capture-templates RET > > target Specification of where the captured item should be placed. > In Org-mode files, targets usually define a node. Entries will > become children of this node, other types will be added to the > table or list in the body of this node. > > Most target specifications contain a file name. If that file > name is the empty string, it defaults to > `org-default-notes-file'. > A file can also be given as a variable, function, or Emacs Lisp > form. > > Valid values are: > > (file "path/to/file") > Text will be placed at the beginning or end of that file > > (id "id of existing org entry") > File as child of this entry, or in the body of the entry > > ... > > You might use the `function' target spec > > (function function-finding-location) > Most general way, write your own function to find both > file and location > > HTH, > -- David > -- > OpenPGP... 0x99ADB83B5A4478E6 > Jabber dmj...@jabber.org > Email. dm...@ictsoc.de > [2 ] >
Re: [O] Define capture template with dynamic id target
At Thu, 09 Jun 2011 15:18:00 -0300, Darlan Cavalcante Moreira wrote: > > > Hello List, > > I'm trying to create a few templates for org capture and I have found a > weird behavior with the ID target type. It works OK if I use the ID > directly like below > #+begin_src emacs-lisp > (id "Junho2011Contas") > #+end_src > but it does not find the ID if I try to get it from a function, such as > #+begin_src emacs-lisp > (id (get-me-an-org-id-for-the-month "Contas")) > #+end_src Org capture does not support executing a function in the ID target spec. C-h v org-capture-templates RET target Specification of where the captured item should be placed. In Org-mode files, targets usually define a node. Entries will become children of this node, other types will be added to the table or list in the body of this node. Most target specifications contain a file name. If that file name is the empty string, it defaults to `org-default-notes-file'. A file can also be given as a variable, function, or Emacs Lisp form. Valid values are: (file "path/to/file") Text will be placed at the beginning or end of that file (id "id of existing org entry") File as child of this entry, or in the body of the entry ... You might use the `function' target spec (function function-finding-location) Most general way, write your own function to find both file and location HTH, -- David -- OpenPGP... 0x99ADB83B5A4478E6 Jabber dmj...@jabber.org Email. dm...@ictsoc.de pgpYcbpVXoTDw.pgp Description: PGP signature
[O] Define capture template with dynamic id target
Hello List, I'm trying to create a few templates for org capture and I have found a weird behavior with the ID target type. It works OK if I use the ID directly like below #+begin_src emacs-lisp (id "Junho2011Contas") #+end_src but it does not find the ID if I try to get it from a function, such as #+begin_src emacs-lisp (id (get-me-an-org-id-for-the-month "Contas")) #+end_src All the get-me-an-org-id-for-the-month function does is returning "MonthnameYearArgument", in this case it returns "Junho2011Contas". The definition is given below #+begin_src emacs-lisp (defun get-me-an-org-id-for-the-month (categoryName) "Used only in my template for the expenses of the month. It return a suitable ID for the month sub-headline." (interactive) (concat (get-current-month) (get-current-year) categoryName) ) #+end_src -- Darlan