No Wayman writes: > The attached patch is the first step toward integrating DOCT[1] > syntax into Org mode. > It adds property options to org-capture-templates which make it > easier to run template-specific hooks. > The current approach for running such hooks involves adding to > the > desired global hook variable and filtering by the template's > keys. > e.g. > > #+begin_src emacs-lisp :lexical t > (defun +example-template-hook () > (when (eq (org-capture-get :key t) "e") > (message "hook run"))) > > (add-hook 'org-capture-mode-hook #'+example-template-hook) > > (let ((org-capture-templates '("e" "example" (file "") ""))) > (org-capture nil "e")) > #+end_src > > > The hook has to be maintained separately from the template > declaration. > The criteria to determine the selected template is baked into > the > hook function. > This is fragile (change the binding for the template and you > must > update the hook function), > mixes concerns, and makes templates harder to share. > > Contrast the above with the following syntax enabled by the > attached patch: > > #+begin_src emacs-lisp :lexical t > (let ((org-capture-templates > '(("t" "test" plain (file "/tmp/test.org") > "test %?" > :hook ((lambda () (insert "mode-hook\n"))) > :before-finalize ((lambda () (insert > "before-finalize\n"))) > ;; Only a message because this happens outside the > context > ;; of the capture buffer. > :after-finalize ((lambda () (message > "after-finalize"))) > :prepare-finalize ((lambda () (insert > "prepare-finalize\n"))))))) > (org-capture nil "t")) > #+end_src > > These template-specific hook functions run prior to their global > counterparts. > > Ihor, an implementation note: I have not used `run-hooks' with > these because they have no associated symbol. > The functions are lists stored directly on `org-capture-plist'. > > [1]: https://github.com/progfolio/doct And, of course, the patch...