diff options
Diffstat (limited to 'overlays/patches/emacs/overlay/elisp.nix')
-rw-r--r-- | overlays/patches/emacs/overlay/elisp.nix | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/overlays/patches/emacs/overlay/elisp.nix b/overlays/patches/emacs/overlay/elisp.nix index 1cc24f653f1d..aff0b484023a 100644 --- a/overlays/patches/emacs/overlay/elisp.nix +++ b/overlays/patches/emacs/overlay/elisp.nix @@ -12,13 +12,15 @@ 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` , alwaysTangle ? false , extraEmacsPackages ? epkgs: [ ] , package ? pkgs.emacs -, override ? (epkgs: epkgs) +, override ? (self: super: { }) }: let ensureNotice = '' @@ -42,16 +44,27 @@ let configText = let type = builtins.typeOf config; - in - if type == "string" then config + in # configText can be sourced from either: + # - A string with context { config = "${hello}/config.el"; } + if type == "string" && builtins.hasContext config && lib.hasPrefix builtins.storeDir config then builtins.readFile config + # - A config literal { config = "(use-package foo)"; } + else if type == "string" then config + # - A config path { config = ./config.el; } else if type == "path" then builtins.readFile config + # - A derivation { config = pkgs.writeText "config.el" "(use-package foo)"; } + else if lib.isDerivation config then builtins.readFile "${config}" else throw "Unsupported type for config: \"${type}\""; packages = parse.parsePackagesFromUsePackage { inherit configText isOrgModeFile alwaysTangle; alwaysEnsure = doEnsure; }; - emacsPackages = pkgs.emacsPackagesFor package; + emacsPackages = (pkgs.emacsPackagesFor package).overrideScope' (self: super: + # for backward compatibility: override was a function with one parameter + if builtins.isFunction (override super) + then override self super + else override super + ); emacsWithPackages = emacsPackages.emacsWithPackages; mkPackageError = name: let @@ -61,8 +74,29 @@ let in emacsWithPackages (epkgs: let - overridden = override epkgs; - usePkgs = map (name: overridden.${name} or (mkPackageError name)) packages; - extraPkgs = extraEmacsPackages overridden; + usePkgs = map (name: epkgs.${name} or (mkPackageError name)) packages; + extraPkgs = extraEmacsPackages epkgs; + 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 ]) |