emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] Capture template for datetree under existing headline


From: Myles English
Subject: Re: [O] Capture template for datetree under existing headline
Date: Sun, 25 Sep 2016 15:32:58 +0100
User-agent: mu4e 0.9.15; emacs 25.1.1

Hi Peter,

Peter Sterner writes:

> I want to have a capture template that generates a datetree under an
> existing headline in an org file with existing headlines. I tried this:
>
> ("j" "Journal" entry (file+datetree "~/workspace/org/notes.org" "Journal")
> "* %?\n Added %U\n %i\n%a")
>
> I tried creating the Journal headline before capturing. But org-mode
> generates a 2016 headline not placed under Journal.

This seems to work, by making a new capture target called
'file+headline+datetree'.

Capture template:

("j" "Journal" entry (file+headline+datetree "~/workspace/org/notes.org" 
"Journal")

Patch:

diff --git a/lisp/org-capture.el b/lisp/org-capture.el
index a89d171..1826d3e 100644
--- a/lisp/org-capture.el
+++ b/lisp/org-capture.el
@@ -923,6 +923,40 @@ Store them in the capture property list."
              (setq target-entry-p (and (derived-mode-p 'org-mode) 
(org-at-heading-p))))
          (error "No match for target regexp in file %s" (nth 1 target))))
 
+       ((eq (car target) 'file+headline+datetree)
+       ;; copied from sexp for file+headline
+       (set-buffer (org-capture-target-buffer (nth 1 target)))
+       (org-capture-put-target-region-and-position)
+       (widen)
+       (let ((hd (nth 2 target)))
+         (goto-char (point-min))
+         (unless (derived-mode-p 'org-mode)
+           (error
+            "Target buffer \"%s\" for file+headline+datetree should be in Org 
mode"
+            (current-buffer)))
+         (if (re-search-forward
+              (format org-complex-heading-regexp-format (regexp-quote hd))
+              nil t)
+             (goto-char (point-at-bol))
+           (goto-char (point-max))
+           (or (bolp) (insert "\n"))
+           (insert "* " hd "\n")
+           (beginning-of-line 0)))
+       (org-narrow-to-subtree)
+       (org-show-subtree)
+       ;; copied from the sexp for file+datetree
+       (funcall
+        #'org-datetree-find-date-create
+        (calendar-gregorian-from-absolute
+         (cond
+          (org-overriding-default-time
+           ;; use the overriding default time
+           (time-to-days org-overriding-default-time))
+          (t
+           ;; current date, possibly corrected for late night workers
+           (org-today))))
+        'restrict))
+
        ((memq (car target) '(file+datetree file+datetree+prompt file+weektree 
file+weektree+prompt))
        (require 'org-datetree)
        (set-buffer (org-capture-target-buffer (nth 1 target)))

This results in:

* Journal
* 2016

unless the following property is set:

* Journal
  :PROPERTIES:
  :DATE_TREE:
  :END:
** 2016

An improvement might be to prompt for the headline to put the datetree
under.  It might have been possible to do this as a 'function' target.

Myles



reply via email to

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