1
0

default.nix 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. { lib, runCommand, fetchFromGitHub, tree-sitter }:
  2. let
  3. grammars = builtins.fromJSON (builtins.readFile ./grammars.json);
  4. buildTreesitterPlugin = name: spec:
  5. let
  6. nameParts = builtins.split "/" (spec.repo or "tree-sitter/tree-sitter-${name}");
  7. owner = builtins.head nameParts;
  8. repo = builtins.elemAt nameParts 2;
  9. filetypes = spec.filetypes or [name];
  10. grammar = tree-sitter.buildGrammar ({
  11. language = name;
  12. version = "0.0.0+rev=${spec.rev}";
  13. src = fetchFromGitHub {
  14. inherit owner repo;
  15. inherit (spec) rev sha256;
  16. };
  17. } // lib.optionalAttrs (builtins.hasAttr "path" spec) {
  18. location = spec.path;
  19. });
  20. initLua = ''
  21. vim.treesitter.language.register('${name}', { ${lib.concatMapStringsSep ", " (filetype: "'${filetype}'") filetypes} })
  22. '';
  23. in
  24. runCommand "tree-sitter-${name}" {
  25. passthru = {
  26. inherit grammar;
  27. };
  28. inherit initLua;
  29. passAsFile = [ "initLua" ];
  30. } ''
  31. mkdir -p $out/parser
  32. ln -s ${grammar}/parser $out/parser/${name}.so
  33. ${lib.optionalString (builtins.hasAttr "branch" spec) ''
  34. if [ -d ${grammar}/queries ]; then
  35. ln -s ${grammar}/queries $out/queries
  36. fi
  37. ''}
  38. mkdir -p $out/plugin
  39. cp "$initLuaPath" $out/plugin/init.lua
  40. mkdir -p $out/after/ftplugin
  41. ${lib.concatMapStringsSep "\n" (filetype: ''
  42. echo 'vim.treesitter.start()' > $out/after/ftplugin/${filetype}.lua
  43. '') filetypes}
  44. '';
  45. in
  46. builtins.mapAttrs buildTreesitterPlugin grammars