Procházet zdrojové kódy

Allow capture template to come from a file or from a function call

* lisp/org-capture.el (org-capture-templates): Allow the template
to come from a file or function call.
(org-capture-place-entry): Get the template from file or function.
Carsten Dominik před 14 roky
rodič
revize
75192f263e
1 změnil soubory, kde provedl 29 přidání a 2 odebrání
  1. 29 2
      lisp/org-capture.el

+ 29 - 2
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)))