about summary refs log tree commit diff
path: root/overlays/patches/emacs/overlay/elisp.nix
diff options
context:
space:
mode:
Diffstat (limited to 'overlays/patches/emacs/overlay/elisp.nix')
-rw-r--r--overlays/patches/emacs/overlay/elisp.nix50
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 ])