diff --git a/README.org b/README.org index 676dc0e16..5dd16e0ab 100644 --- a/README.org +++ b/README.org @@ -91,6 +91,17 @@ required in a user's config via =use-package= or =leaf=. # config = ./emacs.org; config = ./emacs.el; + # Whether to include your config as a default init file. + # If being bool, the value of config is used. + # Its value can also be a derivation like this if you want to do some + # substitution: + # defaultInitFile = pkgs.substituteAll { + # name = "default.el"; + # src = ./emacs.el; + # inherit (config.xdg) configHome dataHome; + # }; + defaultInitFile = true; + # Package is optional, defaults to pkgs.emacs package = pkgs.emacsGit; diff --git a/elisp.nix b/elisp.nix index 1cc24f653..3308a8bc9 100644 --- a/elisp.nix +++ b/elisp.nix @@ -12,6 +12,8 @@ let in { config +# bool to use the value of config or a derivation whose name is default.el +, defaultInitFile ? false # emulate `use-package-always-ensure` behavior (defaulting to false) , alwaysEnsure ? null # emulate `#+PROPERTY: header-args:emacs-lisp :tangle yes` @@ -64,5 +66,27 @@ emacsWithPackages (epkgs: overridden = override epkgs; usePkgs = map (name: overridden.${name} or (mkPackageError name)) packages; extraPkgs = extraEmacsPackages overridden; + defaultInitFilePkg = + if !((builtins.isBool defaultInitFile) || (lib.isDerivation defaultInitFile)) + then throw "defaultInitFile must be bool or derivation" + else + if defaultInitFile == false + then null + else + let + # name of the default init file must be default.el according to elisp manual + defaultInitFileName = "default.el"; + in + epkgs.trivialBuild { + pname = "default-init-file"; + src = + if defaultInitFile == true + then pkgs.writeText defaultInitFileName configText + else + if defaultInitFile.name == defaultInitFileName + then defaultInitFile + else throw "name of defaultInitFile must be ${defaultInitFileName}"; + packageRequires = usePkgs; + }; in - usePkgs ++ extraPkgs) + usePkgs ++ extraPkgs ++ [ defaultInitFilePkg ])