about summary refs log tree commit diff
path: root/elisp.nix
diff options
context:
space:
mode:
authoradisbladis <adisbladis@gmail.com>2020-07-31 22:56:49 +0200
committeradisbladis <adisbladis@gmail.com>2020-07-31 22:59:00 +0200
commitc9e1c8cb77bb9bde350be271616bbbbce8e14bd6 (patch)
tree3e2f355f2b3b0b1c05b6fa9284f4eb429b6c99c7 /elisp.nix
parent0f290c5509a6876104bec374246c88942358babf (diff)
downloadnixlib-c9e1c8cb77bb9bde350be271616bbbbce8e14bd6.tar
nixlib-c9e1c8cb77bb9bde350be271616bbbbce8e14bd6.tar.gz
nixlib-c9e1c8cb77bb9bde350be271616bbbbce8e14bd6.tar.bz2
nixlib-c9e1c8cb77bb9bde350be271616bbbbce8e14bd6.tar.lz
nixlib-c9e1c8cb77bb9bde350be271616bbbbce8e14bd6.tar.xz
nixlib-c9e1c8cb77bb9bde350be271616bbbbce8e14bd6.tar.zst
nixlib-c9e1c8cb77bb9bde350be271616bbbbce8e14bd6.zip
parsePackagesFromUsePackage: Allow passing config as a path & auto-tangle org configs
Diffstat (limited to 'elisp.nix')
-rw-r--r--elisp.nix96
1 files changed, 62 insertions, 34 deletions
diff --git a/elisp.nix b/elisp.nix
index 70a60b902239..70b1726b1f3e 100644
--- a/elisp.nix
+++ b/elisp.nix
@@ -4,41 +4,69 @@ use-package declarations.
 */
 
 { pkgs }:
-
 let
-  parse = pkgs.callPackage ./parse.nix {};
-in {
-  config,
-  alwaysEnsure ? false, # emulate `use-package-always-ensure` behavior
-  extraEmacsPackages ? epkgs: [],
-  package ? pkgs.emacs,
-  override ? (epkgs: epkgs)
+  parse = pkgs.callPackage ./parse.nix { };
+  inherit (pkgs) lib;
+
+
+
+in
+{ config
+, alwaysEnsure ? false
+, # emulate `use-package-always-ensure` behavior
+  extraEmacsPackages ? epkgs: [ ]
+, package ? pkgs.emacs
+, override ? (epkgs: epkgs)
 }:
+let
+  ensureNotice = ''
+    Emacs-overlay API breakage notice:
+
+    Previously emacsWithPackagesFromUsePackage always added every use-package definition to the closure.
+    Now we will only add packages with `:ensure t`.
+
+    You can get back the old behaviour by passing `alwaysEnsure = true`.
+    For a more in-depth usage example see https://github.com/nix-community/emacs-overlay#extra-library-functionality
+  '';
+  showNotice = value: if alwaysEnsure then value else builtins.trace ensureNotice value;
+
+  # Note that using .org configurations will result in IFD
+  orgBabelTangeledConfig = pkgs.runCommand "emacs-config.el"
+    { } ''
+    cp ${config} emacs-config.org
+    ${package}/bin/emacs --batch ./emacs-config.org -f org-babel-tangle
+    mv emacs-config.el $out
+  '';
+
+  config' =
+    let
+      ext = lib.last (builtins.split "\\." (builtins.toString config));
+      t = builtins.typeOf config;
+    in
+    (
+      if t == "string" then config
+      else if t == "path" then (
+        builtins.readFile (
+          if ext == "org" then orgBabelTangeledConfig
+          else config
+        )
+      )
+      else throw "Unsupported type for config: \"${t}\""
+    );
+
+  packages = showNotice (parse.parsePackagesFromUsePackage config' alwaysEnsure);
+  emacsPackages = pkgs.emacsPackagesGen package;
+  emacsWithPackages = emacsPackages.emacsWithPackages;
+  mkPackageError = name:
+    let
+      errorFun = if alwaysEnsure then builtins.trace else throw;
+    in
+    errorFun "Emacs package ${name}, declared wanted with use-package, not found." null;
+in
+emacsWithPackages (epkgs:
   let
-    ensureNotice = ''
-      Emacs-overlay API breakage notice:
-
-      Previously emacsWithPackagesFromUsePackage always added every use-package definition to the closure.
-      Now we will only add packages with `:ensure t`.
-
-      You can get back the old behaviour by passing `alwaysEnsure = true`.
-      For a more in-depth usage example see https://github.com/nix-community/emacs-overlay#extra-library-functionality
-    '';
-    showNotice = value: if alwaysEnsure then value else builtins.trace ensureNotice value;
-
-    packages = showNotice (parse.parsePackagesFromUsePackage config alwaysEnsure);
-    emacsPackages = pkgs.emacsPackagesGen package;
-    emacsWithPackages = emacsPackages.emacsWithPackages;
-    mkPackageError = name:
-      let
-        errorFun = if alwaysEnsure then builtins.trace else throw;
-      in
-        errorFun "Emacs package ${name}, declared wanted with use-package, not found." null;
+    overridden = override epkgs;
+    usePkgs = map (name: overridden.${name} or (mkPackageError name)) packages;
+    extraPkgs = extraEmacsPackages overridden;
   in
-    emacsWithPackages (epkgs:
-      let
-        overridden = override epkgs;
-        usePkgs = map (name: overridden.${name} or (mkPackageError name)) packages;
-        extraPkgs = extraEmacsPackages overridden;
-      in
-        [ overridden.use-package ] ++ usePkgs ++ extraPkgs)
+  [ overridden.use-package ] ++ usePkgs ++ extraPkgs)