about summary refs log tree commit diff
path: root/overlays
diff options
context:
space:
mode:
authorYilin Wei <yilin@kebab-ca.se>2022-10-11 15:24:58 +0100
committerYilin Wei <yilin@kebab-ca.se>2022-10-12 19:11:33 +0100
commit2142ce3789d2ac230a225eb078d3bf2f85046532 (patch)
tree1f25cef296cf0c1b85d2cb0d09bc00125c051bd4 /overlays
parentd04558957e2bef64780144486becbdc1c731fe7f (diff)
downloadnixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.gz
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.bz2
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.lz
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.xz
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.tar.zst
nixlib-2142ce3789d2ac230a225eb078d3bf2f85046532.zip
Add `feature/tree-sitter` derivation to emacs overlay
Adds the branch `feature/tree-sitter` to allow testing of tree-sitter
integration and exposes it as `emacsGitTreeSitter` in the `emacs`
overlay.

Introduces `withTreeSitter` and `withTreeSitterPlugins`.
Diffstat (limited to 'overlays')
-rw-r--r--overlays/emacs.nix38
1 files changed, 34 insertions, 4 deletions
diff --git a/overlays/emacs.nix b/overlays/emacs.nix
index 1b93d4473ec0..4e2a6aaed6c1 100644
--- a/overlays/emacs.nix
+++ b/overlays/emacs.nix
@@ -14,9 +14,9 @@ let
     builtins.foldl'
       (drv: fn: fn drv)
       super.emacs
-      [
+      ([
 
-        (drv: drv.override ({ srcRepo = true; } // args))
+        (drv: drv.override ({ srcRepo = true; } // builtins.removeAttrs args [ "withTreeSitterPlugins" "withTreeSitter" ]))
 
         (
           drv: drv.overrideAttrs (
@@ -68,7 +68,26 @@ let
           in
           result
         )
-      ];
+      ]
+      ++ (super.lib.optional (args ? "withTreeSitter") (
+        drv: drv.overrideAttrs (old:
+          let
+            libName = drv: super.lib.removeSuffix "-grammar" drv.pname;
+            lib = drv: ''lib${libName drv}.so'';
+            linkCmd = drv: "ln -s ${drv}/parser $out/lib/${lib drv}";
+            linkerFlag = drv: "-l" + libName drv;
+            plugins = args.withTreeSitterPlugins super.pkgs.tree-sitter-grammars;
+            tree-sitter-grammars = super.runCommand "tree-sitter-grammars" {
+            } (super.lib.concatStringsSep "\n" (["mkdir -p $out/lib"] ++ (map linkCmd plugins)));
+          in {
+            buildInputs = old.buildInputs ++ [ super.pkgs.tree-sitter tree-sitter-grammars ];
+            # before building the `.el` files, we need to allow the `tree-sitter` libraries
+            # bundled in emacs to be dynamically loaded.
+            TREE_SITTER_LIBS = super.lib.concatStringsSep " " ([ "-ltree-sitter" ] ++ (map linkerFlag plugins)); 
+          }
+        )
+      )));
+
 
   mkPgtkEmacs = namePrefix: jsonFile: { ... }@args: (mkGitEmacs namePrefix jsonFile args).overrideAttrs (
     old: {
@@ -86,13 +105,22 @@ let
     withWebP = true;
     nativeComp = true;
   };
-
+  
   emacsPgtk = mkPgtkEmacs "emacs-pgtk" ../repos/emacs/emacs-master.json { withSQLite3 = true; withGTK3 = true; };
 
   emacsPgtkNativeComp = mkPgtkEmacs "emacs-pgtk-native-comp" ../repos/emacs/emacs-master.json { nativeComp = true; withSQLite3 = true; withGTK3 = true; };
 
   emacsUnstable = (mkGitEmacs "emacs-unstable" ../repos/emacs/emacs-unstable.json { });
 
+  emacsGitTreeSitter = mkGitEmacs "emacs-git-tree-sitter" ../repos/emacs/emacs-feature_tree-sitter.json {
+    withTreeSitter = true;
+    withTreeSitterPlugins = (plugins: with plugins; [
+      tree-sitter-python
+      tree-sitter-javascript
+      tree-sitter-json
+    ]);
+  };
+
 in
 {
   inherit emacsGit emacsUnstable;
@@ -133,6 +161,8 @@ in
     )
   );
 
+  inherit emacsGitTreeSitter;
+
   emacsWithPackagesFromUsePackage = import ../elisp.nix { pkgs = self; };
 
   emacsWithPackagesFromPackageRequires = import ../packreq.nix { pkgs = self; };