diff --git a/lisp/org-capture.el b/lisp/org-capture.el index f6e89ef94..b3db087a0 100644 --- a/lisp/org-capture.el +++ b/lisp/org-capture.el @@ -145,7 +145,13 @@ target Specification of where the captured item should be placed. template The template for creating the capture item. If you leave this empty, an appropriate default template will be used. See below - for more details. + for more details. Instead of a string, this may also be one of + + (file \"/path/to/template-file\") + (function function-returning-the-template) + + in order to get a template from a file, or dynamically + from a function. The rest of the entry is a property list of additional options. Recognized properties are: @@ -274,7 +280,14 @@ calendar | %:type %:date" (list :tag "Function" (const :format "" function) (sexp :tag " Function"))) - (string :tag "Template (opt) ") + (choice :tag "Template" + (string) + (list :tag "File" + (const :format "" file-contents) + (file :tag "Template file")) + (list :tag "Function" + (const :format "" function) + (file :tag "Template function"))) (plist :inline t ;; Give the most common options as checkboxes :options (((const :format "%v " :prepend) (const t)) @@ -647,6 +660,20 @@ already gone." (reversed (org-capture-get :prepend)) (target-entry-p (org-capture-get :target-entry-p)) level beg end) + + ;; Get the full template + (cond + ((and (listp txt) (eq (car txt) 'file)) + (if (file-exists-p (nth 1 txt)) + (setq txt (org-file-contents (nth 1 txt))) + (setq txt (format "Template file %s not found" (nth 1 txt))))) + ((and (listp txt) (eq (car txt) 'function)) + (if (fboundp (nth 1 txt)) + (setq txt (funcall (nth 1 txt))) + (setq txt (format "Template function %s not found" (nth 1 txt))))) + ((not txt) (setq txt "")) + (t (setq txt "Invalid capture template"))) + (cond ((org-capture-get :exact-position) (goto-char (org-capture-get :exact-position)))