diff options
author | adisbladis <adisbladis@gmail.com> | 2019-08-19 10:58:26 +0100 |
---|---|---|
committer | adisbladis <adisbladis@gmail.com> | 2019-08-19 11:15:54 +0100 |
commit | f84321f435fe83eadec7e4df84b6a18964e06e85 (patch) | |
tree | fe746711914496c3f69dd7773ab005db9143a6d5 /elisp.nix | |
parent | eb82a1c14913f6d0c588134be84304019b808b6b (diff) | |
download | nixlib-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.nix | 44 |
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) |