I should be there. I contributed lisp/progmodes/ruby-ts-mode.el to Emacs.
> On Jul 22, 2026, at 10:27, Derek Chen-Becker <[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 |
> +---------------------------------------------------------------+
>