{ lib, runCommand, fetchFromGitHub, tree-sitter }: let grammars = builtins.fromJSON (builtins.readFile ./grammars.json); buildTreesitterPlugin = name: spec: let nameParts = builtins.split "/" (spec.repo or "tree-sitter/tree-sitter-${name}"); owner = builtins.head nameParts; repo = builtins.elemAt nameParts 2; filetypes = spec.filetypes or [name]; grammar = tree-sitter.buildGrammar ({ language = name; version = "0.0.0+rev=${spec.rev}"; src = fetchFromGitHub { inherit owner repo; inherit (spec) rev sha256; }; } // lib.optionalAttrs (builtins.hasAttr "path" spec) { location = spec.path; }); initLua = '' vim.treesitter.language.register('${name}', { ${lib.concatMapStringsSep ", " (filetype: "'${filetype}'") filetypes} }) ''; in runCommand "tree-sitter-${name}" { passthru = { inherit grammar; }; inherit initLua; passAsFile = [ "initLua" ]; } '' mkdir -p $out/parser ln -s ${grammar}/parser $out/parser/${name}.so ${lib.optionalString (builtins.hasAttr "branch" spec) '' if [ -d ${grammar}/queries ]; then ln -s ${grammar}/queries $out/queries fi ''} mkdir -p $out/plugin cp "$initLuaPath" $out/plugin/init.lua mkdir -p $out/after/ftplugin ${lib.concatMapStringsSep "\n" (filetype: '' echo 'vim.treesitter.start()' > $out/after/ftplugin/${filetype}.lua '') filetypes} ''; in builtins.mapAttrs buildTreesitterPlugin grammars