about summary refs log tree commit diff
path: root/elisp.nix
diff options
context:
space:
mode:
authoradisbladis <adisbladis@gmail.com>2019-08-19 10:58:26 +0100
committeradisbladis <adisbladis@gmail.com>2019-08-19 11:15:54 +0100
commitf84321f435fe83eadec7e4df84b6a18964e06e85 (patch)
treefe746711914496c3f69dd7773ab005db9143a6d5 /elisp.nix
parenteb82a1c14913f6d0c588134be84304019b808b6b (diff)
downloadnixlib-f84321f435fe83eadec7e4df84b6a18964e06e85.tar
nixlib-f84321f435fe83eadec7e4df84b6a18964e06e85.tar.gz
nixlib-f84321f435fe83eadec7e4df84b6a18964e06e85.tar.bz2
nixlib-f84321f435fe83eadec7e4df84b6a18964e06e85.tar.lz
nixlib-f84321f435fe83eadec7e4df84b6a18964e06e85.tar.xz
nixlib-f84321f435fe83eadec7e4df84b6a18964e06e85.tar.zst
nixlib-f84321f435fe83eadec7e4df84b6a18964e06e85.zip
Add a method to make Emacs closures from use-package declarations
Diffstat (limited to 'elisp.nix')
-rw-r--r--elisp.nix44
1 files changed, 44 insertions, 0 deletions
diff --git a/elisp.nix b/elisp.nix
new file mode 100644
index 000000000000..aff72b7dc25e
--- /dev/null
+++ b/elisp.nix
@@ -0,0 +1,44 @@
+/*
+Parse an emacs lisp configuration file to derive packages from
+use-package declarations.
+*/
+
+{ pkgs }:
+
+let
+  isStrEmpty = s: (builtins.replaceStrings [" "] [""] s) == "";
+
+  splitString = _sep: _s: builtins.filter
+    (x: builtins.typeOf x == "string")
+    (builtins.split _sep _s);
+
+  stripComments = dotEmacs: let
+    lines = splitString "\n" dotEmacs;
+    stripped = builtins.map (l:
+      builtins.elemAt (splitString ";;" l) 0) lines;
+  in builtins.concatStringsSep " " stripped;
+
+  parsePackages = dotEmacs: let
+    strippedComments = stripComments dotEmacs;
+    tokens = builtins.filter (t: !(isStrEmpty t)) (builtins.map
+      (t: if builtins.typeOf t == "list" then builtins.elemAt t 0 else t)
+      (builtins.split "([\(\)])" strippedComments));
+    matches = builtins.map (t:
+      builtins.match "^use-package[[:space:]]+([A-Za-z0-9_-]+).*" t) tokens;
+  in builtins.map (m: builtins.elemAt m 0)
+      (builtins.filter (m: m != null) matches);
+
+in {
+  config,
+  extraEmacsPackages ? epkgs: [],
+  package ? pkgs.emacs,
+  override ? (epkgs: epkgs)
+}: let
+  packages = parsePackages config;
+  emacsPackages = pkgs.emacsPackagesNgGen package;
+  emacsWithPackages = emacsPackages.emacsWithPackages;
+in emacsWithPackages (epkgs: let
+  overriden = override epkgs;
+  usePkgs = builtins.map (name: overriden.${name}) packages;
+  extraPkgs = extraEmacsPackages overriden;
+in [ overriden.use-package ] ++ usePkgs ++ extraPkgs)