README

February 26, 2026 ยท View on GitHub

This is an unofficial script that builds tree-sitter grammars that can be used by Emacs 29 and above.

Tree-sitter language grammars are just dynamic library object files. You need git and a C/C++ compiler to build them.

To build the language grammar for a particular language, run

./build.sh <language>

e.g.,

./build.sh html

The dynamic library will be in directory /dist.

To build all modules at once, run

./batch.sh

This gives you C, JSON, Go, HTML, Javascript, CSS, Python, Typescript (tsx), C# (csharp), C++ (cpp), Rust, etc, etc. The complete list is in batch.sh. If you don't see your favoriate language in the list, submit a PR.

You can enable parallel build with the JOBS variable, like this:

JOBS=8 ./batch.sh

NEW

I vibe-coded a convenient CLI for building and installing grammars and managing versions. The CLI still uses build.sh and batch.sh to do most of the work.

./langman.py --help usage: langman.py [-h] {build,install,version} ...

Tree-sitter grammar builder and installer

positional arguments: {build,install,version} build Build grammar(s) install Build and install grammar(s) version Show installed version

optional arguments: -h, --help show this help message and exit

Examples: langman.py build python langman.py build --version v0.23.2 python langman.py build # Build all languages langman.py install python langman.py install # Install all languages langman.py version python

Environment: INSTALL_DIR Override default install directory (~/.emacs.d/tree-sitter)

Caching: Versioned builds (--version) are cached and reused on subsequent builds. HEAD builds (no --version) always rebuild from the latest commit.

Note: On mac and linux, version is stored in the grammar file using xattr, on windows, the version is stored in a separate version file alongside the grammar file.