emacs: load the early-default library after early-init.el (#536492)

This commit is contained in:
LIN, Jian 2026-06-30 12:03:53 +00:00 committed by GitHub
commit 33e6d0bf86
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 150 additions and 1 deletions

View file

@ -24,7 +24,7 @@ The Emacs package comes with some extra helpers to make it easier to configure.
} }
``` ```
You can install it like any other package via `nix-env -iA myEmacs`. However, this will only install those packages. It will not `configure` them for us. To do this, we need to provide a configuration file. Luckily, it is possible to do this from within Nix! By modifying the above example, we can make Emacs load a custom config file. The key is to create a package that provides a `default.el` file in `/share/emacs/site-start/`. Emacs knows to load this file automatically when it starts. You can install it like any other package via `nix-env -iA myEmacs`. However, this will only install those packages. It will not `configure` them for us. To do this, we need to provide a configuration file. Luckily, it is possible to do this from within Nix! By modifying the above example, we can make Emacs load a custom config file. The key is to create a package that provides a `default.el` file in `/share/emacs/site-start/`. Emacs knows to load this file automatically when it starts. Similarly, for `early-init.el`, you can create a package that provides an `early-default.el` file in `/share/emacs/site-start/`.
```nix ```nix
{ {

View file

@ -83,6 +83,12 @@
Maintainers of derivations using the adapted fetchers should rely on the `drv.src.meta.identifiers.v1.purl` default identifier and can enhance their `drv.meta.identifiers.v1.purls` list once they would like to have additional identifiers. Maintainers of derivations using the adapted fetchers should rely on the `drv.src.meta.identifiers.v1.purl` default identifier and can enhance their `drv.meta.identifiers.v1.purls` list once they would like to have additional identifiers.
Maintainers using `fetchurl` for `drv.src` are urged to adapt their `drv.meta.identifiers.purlParts` for proper identification. Maintainers using `fetchurl` for `drv.src` are urged to adapt their `drv.meta.identifiers.purlParts` for proper identification.
- Emacs loads the `early-default` library after `early-init.el`.
Users can add `early-init.el` via `emacs.pkgs.withPackages`
by packaging `early-init.el` into a library named `early-default`.
To prevent loading the `early-default` library,
set `inhibit-early-default-init` in `early-init.el`.
- `services.ceph` enabled the generation of Ceph log files at `/var/log/ceph/`. - `services.ceph` enabled the generation of Ceph log files at `/var/log/ceph/`.
They were missing before because Ceph omitted logs when this directory was missing. They were missing before because Ceph omitted logs when this directory was missing.
Ceph logs can grow large, so you may want to configure rotation of these logs. Ceph logs can grow large, so you may want to configure rotation of these logs.

View file

@ -0,0 +1,140 @@
From: Lin Jian <me@linj.tech>
Subject: Load the early-default library after early-init.el
emacs.pkgs.withPackages from Nixpkgs can be used to configure Emacs.
Its main functionality is to add extra Emacs lisp libraries.
By (ab)using a library named default, user configuration (init.el) can
also be added by it.
A natural extension[1] is to add early-init.el via
emacs.pkgs.withPackages. With this patch, early-init.el can be added by
packaging it as a library named early-default.
The early-default library is similar to the default library except that
it is loaded right after early-init.el and is controlled by
inhibit-early-default-init.
[1]: https://github.com/nix-community/emacs-overlay/issues/532
--- a/doc/emacs/cmdargs.texi
+++ b/doc/emacs/cmdargs.texi
@@ -338,9 +338,10 @@ meant for regular (or interactive) use, since it makes commands like
@opindex -q
@itemx --no-init-file
@opindex --no-init-file
-@cindex bypassing init and @file{default.el} file
+@cindex bypassing init, @file{early-default.el} and @file{default.el} file
@cindex init file, not loading
@cindex @file{default.el} file, not loading
+@cindex @file{early-default.el} file, not loading
Do not load any initialization file (@pxref{Init File}). When Emacs
is invoked with this option, the Customize facility does not allow
options to be saved (@pxref{Easy Customization}). This option does
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -2601,6 +2601,13 @@ But your init file, if any, is loaded first; if it sets
@code{inhibit-default-init} non-@code{nil}, then @file{default} is not
loaded.
+@cindex @file{early-default.el}, the early default init file
+ There can also be an @dfn{early default init file}, which is the library
+named @file{early-default.el}. It is similar to the default init file
+except that it is loaded after the early init file (@pxref{Early Init File})
+and is controlled by @code{inhibit-early-default-init}. This behavior is
+Nixpkgs-specific.
+
@cindex site init file
@cindex @file{site-start.el}, the site startup file
Your site may also have a @dfn{site startup file}; this is named
@@ -2614,7 +2621,8 @@ better to put them in @file{default.el}, so that users can more easily
override them.
@cindex @file{site-lisp} directories
- You can place @file{default.el} and @file{site-start.el} in any of
+ You can place @file{early-default.el}, @file{default.el} and
+@file{site-start.el} in any of
the directories which Emacs searches for Lisp libraries. The variable
@code{load-path} (@pxref{Lisp Libraries}) specifies these directories.
Many sites put these files in a subdirectory named @file{site-lisp} in
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -107,6 +107,13 @@ GNU Emacs Manual}). This is not done if the options @samp{-q},
was specified, Emacs looks for the init file in that user's home
directory instead.
+@item
+It loads the library @file{early-default}, if it exists. This is not done
+if @code{inhibit-early-default-init} is non-@code{nil}, nor if the options
+@samp{-q}, @samp{-Q}, or @samp{--batch} were specified. This behavior is
+Nixpkgs-specific.
+@cindex @file{early-default.el}
+
@item
It calls the function @code{package-activate-all} to activate any
optional Emacs Lisp package that has been installed. @xref{Packaging
@@ -358,7 +365,8 @@ Do not initialize any display; just start a server.
@item --no-init-file
@itemx -q
-Do not load either the init file, or the @file{default} library.
+Do not load either the init file, or the @file{default} and
+@file{early-default} libraries.
@item --no-site-file
Do not load the @file{site-start} library.
@@ -428,6 +436,13 @@ to a non-@code{nil} value, then Emacs does not subsequently load the
(or @samp{-Q}), Emacs loads neither your personal init file nor
the default init file.
+@cindex early default init file
+ An Emacs installation may also have an @dfn{early default init file},
+which is a Lisp library named @file{early-default.el}. It is similar to
+the default init file except that it is loaded after the early init file
+and is controlled by @code{inhibit-early-default-init}. This behavior
+is Nixpkgs-specific.
+
Another file for site-customization is @file{site-start.el}. Emacs
loads this @emph{before} the user's init file. You can inhibit the
loading of this file with the option @samp{--no-site-file}.
@@ -449,6 +464,12 @@ If this variable is non-@code{nil}, it prevents Emacs from loading the
default initialization library file. The default value is @code{nil}.
@end defopt
+@defopt inhibit-early-default-init
+If this variable is non-@code{nil}, it prevents Emacs from loading the
+early default initialization library file. The default value is @code{nil}.
+This is Nixpkgs-specific.
+@end defopt
+
@defvar before-init-hook
This normal hook is run, once, just before loading all the init files
(@file{site-start.el}, your init file, and @file{default.el}).
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -101,6 +101,12 @@ startup message unless he personally acts to inhibit it."
:type '(choice (const :tag "Don't inhibit")
(string :tag "Enter your user name, to inhibit")))
+(defcustom inhibit-early-default-init nil
+ "Non-nil inhibits loading the `early-default' library.
+
+This behavior is Nixpkgs-specific."
+ :type 'boolean)
+
(defcustom inhibit-default-init nil
"Non-nil inhibits loading the `default' library."
:type 'boolean)
@@ -1540,6 +1546,10 @@ please check its value")
startup-init-directory)))
(setq early-init-file user-init-file)
+ (when (and init-file-user
+ (not inhibit-early-default-init))
+ (load "early-default" 'noerror 'nomessage))
+
;; Amend `native-comp-eln-load-path', since the early-init file may
;; have altered `user-emacs-directory' and/or changed the eln-cache
;; directory.
--
2.53.0

View file

@ -162,6 +162,9 @@ stdenv.mkDerivation (finalAttrs: {
patches = patches =
patches fetchpatch patches fetchpatch
++ [
./load-the-early-default-library-after-early-init.el.patch
]
++ lib.optionals withNativeCompilation [ ++ lib.optionals withNativeCompilation [
(replaceVars ./native-comp-driver-options-30.patch { (replaceVars ./native-comp-driver-options-30.patch {
backendPath = ( backendPath = (