emacs: work around upstream Emacs bug#81105[1] for Emacs 31

Emacs 31 changes[3] the behavior of extending info path for installed
elisp pkgs at startup.  Previously, it called function
`info-initialize' and extended `Info-directory-list'.  Now, it does
not call function `info-initialize' and instead extends
`Info-default-directory-list' in most cases.

The new behavior does not work if Emacs is started with an environment
variable INFOPATH without a trailing ":".  This is tracked in upstream
Emacs bug#81105[1].

Also note that Emacs 31 changes the order of startup operations[2] to
this:

1. load site-start.el
2. load early-init.el
3. active packages
4. load init.el
5. load default.el
6. handle CLI args such as --eval

This patch works around bug#81105[1] by adding a trailing ":" to
INFOPATH when needed in site-start.el.  An alternative workaround is
to call function `info-initialize' in site-start.el, which
basically (not 100%, due to the startup order changes) keeps the old
behavior of Emacs 30.

Both workarounds invalidate part of `Info-directory-list' docstring.
The workaround used in this patch makes users unable to ignore
default info path items[4] like `Info-default-directory-list' when
initializing `Info-directory-list'.  The alternative one basically
always ignores `Info-default-directory-list' when initializing
`Info-directory-list' because `info-initialize` is called too early
and `Info-default-directory-list' has no value yet.  Note that the
alternative workaround does allow users to decide if they want other
default info path items[4] such as `configure-info-directory'.

In addition, the workaround used in this patch should be faster than
the alternative one.

Both workarounds can be undone by users.  To undo the one used in this
patch, users can removed the added ":" of INFOPATH in early-init.el.
For the alternative workaround, users need to re-initialize info path
after package activation like this:
(progn (setq Info-directory-list nil) (info-initialize)).

[1]: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=81105
[2]: see the `command-line' function in startup.el
[3]: 7c22a7d312c7a3f3b6b511df5e6334ad8b2795b1
[4]: see the `Info-default-dirs' function in info.el
This commit is contained in:
Lin Jian
2026-06-11 03:33:30 +08:00
parent 6fd6bfb28d
commit 553af601e9
@@ -72,6 +72,14 @@ least specific (the system profile)"
(nix--profile-paths))
woman-manpath)))
;;; Make info manuals of installed elisp pkgs available (work around Emacs bug#81105)
(when-let* ((path (getenv "INFOPATH")))
;; Normally, Emacs 31 extends `Info-default-directory-list' when activating elisp pkgs.
;; We add a trailing path-separator ":" to INFOPATH when needed
;; to ensure `Info-default-directory-list' is used to initialize `Info-directory-list'.
(unless (string-suffix-p path-separator path)
(setenv "INFOPATH" (concat path path-separator))))
;;; Make tramp work for remote NixOS machines
(defvar tramp-remote-path)
(eval-after-load 'tramp