Hi, I don’t know how to look at the patch. Can you send me a link?
Also, on the orgmode.org <http://orgmode.org/> home page, there is a button labeled “source code”. It doesn’t work for me. I found https://https.git.savannah.nongnu.org/git/org-mode.git/ but I don’t see something for patches. Thank you, Perry > On Jul 23, 2026, at 07:50, Derek Chen-Becker <[email protected]> wrote: > > I created a proper patch with a commit message. Perry, would you mind looking > over this and make sure you're OK with the commit message? > > Thanks, > > Derek > > On Wed, Jul 22, 2026 at 9:27 AM Derek Chen-Becker <[email protected] > <mailto:[email protected]>> wrote: >> The patch looks good, all tests pass locally for me. Ihor, I don't see Perry >> in the FSF contributor list and this seems to be more than a TINYCHANGE. >> What do you think? >> >> Thanks, >> >> Derek >> >> On Tue, Jul 7, 2026 at 10:53 AM Perry Smith <[email protected] >> <mailto:[email protected]>> wrote: >>> >>> >>>> On Jul 6, 2026, at 21:20, Derek Chen-Becker <[email protected] >>>> <mailto:[email protected]>> wrote: >>>> >>>> Hi Perry, thanks for the patch. In the docstring for the >>>> `org-export-after-includes-function' you have a typo with "Bable". Also, >>>> would it be possible to add a unit test? >>> >>> diff --git a/doc/org-manual.org <http://org-manual.org/> >>> b/doc/org-manual.org <http://org-manual.org/> >>> index bda84c49c..5706380b1 100644 >>> --- a/doc/org-manual.org <http://org-manual.org/> >>> +++ b/doc/org-manual.org <http://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/lisp/org-table.el b/lisp/org-table.el >>> index 9aeb53822..1f180bf53 100644 >>> --- a/lisp/org-table.el >>> +++ b/lisp/org-table.el >>> @@ -5867,6 +5867,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..9fe88b617 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,14 @@ 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.") >>> + >>> (defvar org-export-before-parsing-functions nil >>> "Abnormal hook run before parsing an export buffer. >>> >>> @@ -3104,6 +3113,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 >>> <http://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 | >> +---------------------------------------------------------------+ >> > > > > -- > +---------------------------------------------------------------+ > | 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 | > +---------------------------------------------------------------+ > > <0001-Add-new-after-includes-hook-for-org-export.patch>
