diff options
author | Alyssa Ross <hi@alyssa.is> | 2023-06-16 09:13:56 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2023-08-05 09:19:22 +0000 |
commit | 7517820d73ff3edcc8da721931aeeaf206929650 (patch) | |
tree | 32ddc2dd9ecba9f377b914bb84a719e560a4ee6e /overlays/patches/emacs/overlay/elisp.nix | |
parent | 99fcaeccb89621dd492203ce1f2d551c06f228ed (diff) | |
parent | f95c33d692cc174df41e40330aec4abf2a94b673 (diff) | |
download | nixlib-7517820d73ff3edcc8da721931aeeaf206929650.tar nixlib-7517820d73ff3edcc8da721931aeeaf206929650.tar.gz nixlib-7517820d73ff3edcc8da721931aeeaf206929650.tar.bz2 nixlib-7517820d73ff3edcc8da721931aeeaf206929650.tar.lz nixlib-7517820d73ff3edcc8da721931aeeaf206929650.tar.xz nixlib-7517820d73ff3edcc8da721931aeeaf206929650.tar.zst nixlib-7517820d73ff3edcc8da721931aeeaf206929650.zip |
Merge https://github.com/nix-community/emacs-overlay
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 ]) |