If you're using git, the simplest way for this would be to apply my patch against main using "git am <my patch file>" and then you can amend the commit with the ORG-NEWS change. Then to create the patch you do "git format-patch <hash or range>". If you're not familiar with git or don't have it readily available I can apply your patch on my side.
Cheers, Derek On Tue, Jul 28, 2026 at 11:14 AM Perry Smith <[email protected]> wrote: > > > On Jul 25, 2026, at 11:08, Ihor Radchenko <[email protected]> wrote: > > > > Derek Chen-Becker <[email protected]> writes: > > > >> Subject: [PATCH] Add new after-includes hook for org export > > > > The commit message is a bit off. We usually do something like > > > > org-export: Add new org-export-after-includes-functions hook > > > >> Provide a new hook that runs after include keywords, but before macros > and > >> Babel code. > >> > >> * doc/org-manual.org: Update the org-export hooks section to describe > the > >> new hook in relation to the other existing hooks. > > > > ORG-NEWS should be updated as well. > > > >> * lisp/org-table.el (orgtbl-to-generic): Disable the new hook during > table > >> export just as we do with other hooks. > > > > This leads to compiler warning that should be suppressed. > > > >> +(defvar org-export-after-includes-functions nil > >> + "Abnormal hook run after includes but before macros. > >> + > >> +This is run after include keywords but before macros have been > >> +expanded and Babel code blocks executed, on a copy of the original > >> +buffer being exported. Visibility and narrowing are preserved. Point > >> +is at the beginning of the buffer.") > > > > The docstring should explain the arguments passed to the abnormal hook. > > I took a crack at the ORG-NEWS update and fix the two issues. I don’t > know how to > do a pull request or the commit message. > > > diff --git a/doc/org-manual.org b/doc/org-manual.org > > index bda84c49c..5706380b1 100644 > > --- a/doc/org-manual.org > > +++ b/doc/org-manual.org > > @@ -16964,12 +16964,15 @@ for usage and configuration details. > > > > #+vindex: org-export-before-processing-hook > > #+vindex: org-export-before-processing-functions > > +#+vindex: org-export-after-includes-functions > > #+vindex: org-export-before-parsing-hook > > #+vindex: org-export-before-parsing-functions > > -The export process executes two hooks before the actual exporting > > +The export process executes three hooks before the actual exporting > > begins. The first hook, ~org-export-before-processing-functions~, > > runs before any expansions of macros, Babel code, and include keywords > > in the buffer. The second hook, > > +~org-export-after-includes-functions~, runs after the include keywords > > +but before the macros and Babel code. The last hook, > > ~org-export-before-parsing-functions~, runs before the buffer is > > parsed. > > > > @@ -17109,10 +17112,12 @@ export keywords, does not contribute to the > export output.]: > > 3. Remove commented subtrees in the whole buffer (see [[*Comment > > Lines]]); > > > > -4. Replace macros in the whole buffer (see [[*Macro Replacement]]), > > +4. Execute ~org-export-after-includes-functions~ (see [[*Export > hooks]]); > > + > > +5. Replace macros in the whole buffer (see [[*Macro Replacement]]), > > unless ~org-export-replace-macros~ is nil; > > > > -5. When ~org-export-use-babel~ is non-nil (default), process code > > +6. When ~org-export-use-babel~ is non-nil (default), process code > > blocks: > > > > - Leave code blocks inside archived subtrees (see [[*Internal > > diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS > > index 5f5168e33..7d4875e6b 100644 > > --- a/etc/ORG-NEWS > > +++ b/etc/ORG-NEWS > > @@ -319,6 +319,13 @@ entry, or displays it in another window if filtered > out. > > # require user action for most Org mode users. > > # Sorted from most important to least important. > > > > +*** Abnormal hook added: org-export-after-includes-functions > > + > > +This is run after include keywords but before macros have been > > +expanded and Babel code blocks executed, on a copy of the original > > +buffer being exported. Visibility and narrowing are preserved. Point > > +is at the beginning of the buffer. > > + > > *** You may need to update =org-protocol= bookmarklets for browsers > > > > In Firefox 133 and Firefox 128.5 ESR, the previously suggested > > diff --git a/lisp/org-table.el b/lisp/org-table.el > > index 9aeb53822..3920b573e 100644 > > --- a/lisp/org-table.el > > +++ b/lisp/org-table.el > > @@ -5853,6 +5853,7 @@ This may be either a string or a function of two > arguments: > > (princ "\n"))))) > > (let ((org-inhibit-startup t)) (org-mode)) > > (defvar org-export-before-processing-functions) ; ox.el > > + (defvar org-export-after-includes-functions) ; ox.el > > (defvar org-export-process-citations) ; ox.el > > (defvar org-export-expand-links) ; ox.el > > (defvar org-export-filter-parse-tree-functions) ; ox.el > > @@ -5867,6 +5868,7 @@ This may be either a string or a function of two > arguments: > > ;; We _do not_ disable `org-export-filter-parse-tree-functions' > > ;; (historically). > > (let ((org-export-before-processing-functions nil) > > + (org-export-after-includes-functions nil) > > (org-export-replace-macros nil) > > (org-export-use-babel nil) > > (org-export-before-parsing-functions nil) > > diff --git a/lisp/ox.el b/lisp/ox.el > > index 90c853d76..c3993ec9b 100644 > > --- a/lisp/ox.el > > +++ b/lisp/ox.el > > @@ -2175,10 +2175,11 @@ keywords before output." > > ;; Filters properties are installed in communication channel with > > ;; `org-export-install-filters' function. > > ;; > > -;; Eventually, two hooks (`org-export-before-processing-functions' and > > -;; `org-export-before-parsing-functions') are run at the beginning of > the > > -;; export process and just before parsing to allow for heavy structure > > -;; modifications. > > +;; Eventually, three hooks (`org-export-before-processing-functions', > > +;; `org-export-after-includes-functions' and > > +;; `org-export-before-parsing-functions') are run at the beginning of > > +;; the export process and just before parsing to allow for heavy > > +;; structure modifications. > > > > > > ;;;; Hooks > > @@ -2194,6 +2195,17 @@ is at the beginning of the buffer. > > Every function in this hook will be called with one argument: the > > backend currently used, as a symbol.") > > > > +(defvar org-export-after-includes-functions nil > > + "Abnormal hook run after includes but before macros. > > + > > +This is run after include keywords but before macros have been > > +expanded and Babel code blocks executed, on a copy of the original > > +buffer being exported. Visibility and narrowing are preserved. Point > > +is at the beginning of the buffer. > > + > > +Every function in this hook will be called with one argument: the > > +backend currently used, as a symbol.") > > + > > (defvar org-export-before-parsing-functions nil > > "Abnormal hook run before parsing an export buffer. > > > > @@ -3104,6 +3116,10 @@ still inferior to file-local settings." > > (org-export-backend-name backend)) > > (org-export-expand-include-keyword nil nil nil nil (plist-get info > :expand-links)) > > (org-export--delete-comment-trees) > > + (save-excursion > > + (goto-char (point-min)) > > + (run-hook-with-args 'org-export-after-includes-functions > > + (org-export-backend-name backend))) > > (when org-export-replace-macros > > (org-macro-initialize-templates org-export-global-macros) > > (org-macro-replace-all org-macro-templates parsed-keywords)) > > diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el > > index 79365ad29..e58c776e9 100644 > > --- a/testing/lisp/test-ox.el > > +++ b/testing/lisp/test-ox.el > > @@ -1879,6 +1879,24 @@ Footnotes[fn:2], foot[fn:test] and > [fn:inline:inline footnote] > > (org-element-property :end object))))))))) > > (org-export-as (org-test-default-backend))))))) > > > > +(ert-deftest test-org-export/after-includes-hook () > > + "Test `org-export-after-includes-functions'." > > + (should > > + (equal "success\n" > > + (org-test-with-temp-text > > + (format "#+INCLUDE: \"%s/examples/macro-templates.org\"\n" > org-test-dir) > > + (let* ((org-export-after-includes-functions > > + '((lambda (backend) > > + (goto-char (point-min)) > > + ;; will fail if hook done before the include > > + (if (search-forward "Macro templates") > > + (progn > > + (goto-char (point-max)) > > + ;; will not expand if hook executes after > macros > > + (insert "{{{included-macro}}}")))))) > > + (output (org-export-as (org-test-default-backend)))) > > + (substring output (string-match ".*\n\\'" output))))))) > > + > > (ert-deftest test-org-export/before-parsing-functions () > > "Test `org-export-before-parsing-functions'." > > (should > > > > -- +---------------------------------------------------------------+ | Derek Chen-Becker | | GPG Key available at https://keybase.io/dchenbecker and | | https://pgp.mit.edu/pks/lookup?search=derek%40chen-becker.org | | Fngrprnt: EB8A 6480 F0A3 C8EB C1E7 7F42 AFC5 AFEE 96E4 6ACC | +---------------------------------------------------------------+
