Hi, I'm writing a custom function for use with a capture template, as described in the section Template elements (sec 9.1.3.1) of the info manual. My function does what I expect in that it finds the correct heading (in my use case "Log") and returns point. However, if the Log heading has no children, the capture template is filed as a sibling, and not a child. I have spent some time now on this seemingly simple problem, but being a newbie on elisp I must admit I'm stuck.
Here's an example outline: * Projects ** Prj 1 *** Log *** Tasks **** Clocked entry So, the capture template should end up as a child to Log. From what I could tell by reading the documentation, the capture template is placed at a given level by the org-paste-subtree function, which in term is derived from the *visible* headings. If the Log entry already has a child, capture indeed places the template at the desired level, but how do I acquire this behaviour if there are no children? My function currently looks up the clocked entry, ascends to level 2 and looks for Log among the children: (defun peru/org-capture-project-log nil (org-clock-goto) (while (> (funcall outline-level) 2) (org-up-heading-safe)) (org-goto-first-child) (while (not (string= (nth 4 (org-heading-components)) "Log")) (org-goto-sibling) ) (if (not (string= (nth 4 (org-heading-components)) "Log")) (error "No Log entry under current project; please add")) ;; From org-paste-subtree: ;; if cursor is at beginning of headline, same level used (goto-char (point-at-bol)) ;; Alternatively put at eol; level derived from visible headings ;; (goto-char (point-at-eol)) ) I have thought of an alternative tag-based way of grouping my log entries, but I would still like to understand what I'm missing here. Cheers, Per