Was ist tree-sitter-cli?
tree-sitter-cli ist das Kommandozeilenwerkzeug zur Entwicklung von Tree-sitter-Parsern. Tree-sitter ist ein Parser-Generator und eine inkrementelle Parsing-Bibliothek: Es baut für eine Quelldatei einen konkreten Syntaxbaum und aktualisiert ihn beim Editieren mit wenig Aufwand — deshalb setzen Neovim, Helix, Zed und GitHub es für Hervorhebung, Faltung, Textobjekte und Code-Navigation ein. Mit der CLI entstehen die Grammatiken: Sie legt ein Grammatik-Repository an, erzeugt aus grammar.js einen C-Parser, kompiliert ihn zu einer Shared Library oder zu WebAssembly, führt Korpus-Tests aus, parst, befragt, hebt hervor und taggt Dateien und startet einen Web-Playground. Es ist ein einzelnes Rust-Binary, und der Befehl, den du tippst, heißt tree-sitter.
tree-sitter.json-Layout, das tree-sitter init schreibt, und die eingebaute QuickJS-Laufzeit hinter --js-runtime native kamen alle nach den Versionen, die in den Archiven eingefroren sind. Ein mit einer aktuellen CLI erzeugtes Grammatik-Repository erwartet dieselbe oder eine neuere auf jedem Entwicklerrechner und in der CI. Debian stable mit 0.22.6 und Ubuntu 24.04 mit 0.20.8 sind älter als das meiste davon, und die Linux-Binaries von Upstream brauchen glibc 2.39 — unter Debian 12 oder Ubuntu 22.04 starten sie gar nicht.
⚡ Wichtige Funktionen von tree-sitter-cli
🧱 Grammatik-Repository mit einem Befehl
tree-sitter init stellt ein paar Fragen und schreibt grammar.js, tree-sitter.json sowie Binding- und Paketdateien — die Grammatik lässt sich vom ersten Tag an für Node.js, Python, Rust, Go, Swift und C veröffentlichen.
⚙️ Parser-Erzeugung
tree-sitter generate macht aus grammar.js einen abhängigkeitsfreien C-Parser in src/ und meldet Konflikte. Die Grammatik läuft dabei unter node oder, mit --js-runtime native, unter der eingebauten QuickJS-Laufzeit.
🔨 Native und WebAssembly-Builds
tree-sitter build kompiliert den Parser zu einer Shared Library, die Editoren laden, und --wasm erzeugt ein .wasm-Modul für web-tree-sitter und den Playground.
🧪 Korpus-Tests
tree-sitter test parst die Beispiele unter test/corpus, vergleicht die Bäume mit den erwarteten S-Expressions und führt auch Highlight- und Tag-Tests aus. --update schreibt die Erwartungen nach einer gewollten Änderung neu.
🔍 Parsen, abfragen, hervorheben, taggen
parse gibt den Syntaxbaum aus, query führt eine .scm-Abfrage aus und listet ihre Captures, highlight rendert ins Terminal oder nach HTML, und tags extrahiert Definitionen und Referenzen.
🛝 Web-Playground
tree-sitter playground startet eine lokale Seite: Code eintippen, den Baum beim Editieren mitwachsen sehen und Abfragen darauf ausführen — der schnellste Weg herauszufinden, warum eine Regel nicht greift.
apt upgrade hält dich auf der neuesten Version.
📦 Installation aus deb.griffo.io
Schritt 1: Repository hinzufügen
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt update🆓 Es gibt einen für immer kostenlosen Spiegel. deb-free.griffo.io liefert Pakete für immer kostenlos — ohne Konto, ohne Abo, höchstens 2 Monate hinter Upstream, Sicherheitsfixes sofort. Derzeit enthält er cliamp, Ghostty, lazydocker, Oh My Posh, Uncloud und Zed; tree-sitter-cli ist nicht dabei, deshalb führt heute nur das Repository oben dorthin — auf Anfrage kann es aufgenommen werden.
Schritt 2: tree-sitter-cli installieren
# Neuestes tree-sitter-cli installieren
sudo apt install tree-sitter-cli
# Installation prüfen, der Befehl heißt tree-sitter und nicht tree-sitter-cli
tree-sitter --version# Neuestes tree-sitter-cli installieren
apt install tree-sitter-cli
# Installation prüfen, der Befehl heißt tree-sitter und nicht tree-sitter-cli
tree-sitter --versionSchritt 3: Die erste Grammatik anlegen
# Der Befehl heißt tree-sitter. Parser bauen und testen braucht einen C-Compiler,
# und generate führt grammar.js mit node aus, außer du wählst die eingebaute Laufzeit
sudo apt install build-essential nodejs
# Ein Grammatik-Repository anlegen und ein paar Fragen beantworten
mkdir tree-sitter-mylang && cd tree-sitter-mylang
tree-sitter init
# Parser erzeugen, kompilieren und die Korpus-Tests laufen lassen
tree-sitter generate
tree-sitter build
tree-sitter test
# Die Vervollständigungen für bash, zsh, fish und nushell sind im Paket
tree-sitter --help# Der Befehl heißt tree-sitter. Parser bauen und testen braucht einen C-Compiler,
# und generate führt grammar.js mit node aus, außer du wählst die eingebaute Laufzeit
apt install build-essential nodejs
# Ein Grammatik-Repository anlegen und ein paar Fragen beantworten
mkdir tree-sitter-mylang && cd tree-sitter-mylang
tree-sitter init
# Parser erzeugen, kompilieren und die Korpus-Tests laufen lassen
tree-sitter generate
tree-sitter build
tree-sitter test
# Die Vervollständigungen für bash, zsh, fish und nushell sind im Paket
tree-sitter --help🎯 Grundlegende Verwendungsbeispiele
An einer Grammatik arbeiten:
# Nach jeder Änderung an grammar.js neu erzeugen, ohne node, mit dem eingebauten QuickJS
tree-sitter generate --js-runtime native
# Nur die Tests mit passendem Namen ausführen, dann die neue Ausgabe als Erwartung übernehmen
tree-sitter test --include 'function'
tree-sitter test --update
# Eine Shared Library bauen, oder ein WebAssembly-Modul für web-tree-sitter
tree-sitter build -o mylang.so
tree-sitter build --wasmDateien parsen:
# Den Syntaxbaum einer Datei ausgeben
tree-sitter parse examples/hello.mylang
# Viele Dateien still parsen und melden, wie viele gelungen sind
tree-sitter parse examples/*.mylang --quiet --stat
# Einen Parse-Lauf stoppen, praktisch, wenn eine Grammatikänderung bremst
tree-sitter parse examples/big.mylang --timeAbfragen, Hervorhebung und Tags:
# Eine Abfrage auf eine Datei anwenden und die Captures auflisten
tree-sitter query queries/highlights.scm examples/hello.mylang
# Eine Datei im Terminal hervorheben oder als eigenständige HTML-Seite rendern
tree-sitter highlight examples/hello.mylang
tree-sitter highlight --html examples/hello.mylang > hello.html
# Definitionen und Referenzen mit der Tags-Abfrage extrahieren
tree-sitter tags examples/hello.mylangBestehende Grammatiken und der Playground:
# An einer bestehenden Grammatik arbeiten
git clone https://github.com/tree-sitter/tree-sitter-json
cd tree-sitter-json
tree-sitter generate && tree-sitter test
# Eine Konfigurationsdatei schreiben und die Grammatik-Checkouts unter parser-directories eintragen
tree-sitter init-config
# Nach WebAssembly bauen und den interaktiven Playground im Browser öffnen
tree-sitter build --wasm
tree-sitter playground🔧 Tool-Integrationen
Die Tree-sitter-CLI sitzt zwischen einer Grammatik und den Werkzeugen, die sie laden:
- Neovim: der main-Zweig von nvim-treesitter kompiliert Parser mit der
tree-sitter-CLI und verlangt ein aktuelles Release, neuer als das, was Debian stable oder Ubuntu LTS mitbringen - Helix: Hervorhebung, Einrückung und Textobjekte sind Tree-sitter-Abfragen; eine Änderung an
highlights.scmprüfst du mittree-sitter query, bevor du die Grammatiken mithx --grammar buildneu baust - Zed: Spracherweiterungen pinnen ein Grammatik-Repository und einen Commit — die Grammatik also lokal erzeugen und testen, bevor der Pin angehoben wird
- CI:
tree-sitter generategefolgt vongit diff --exit-code src/lässt einen Pull Request scheitern, dessen eingecheckter Parser veraltet ist - Paket-Registries: mit den Bindings, die
tree-sitter initschreibt, geht dieselbe Grammatik zu npm, PyPI und crates.io
🚀 Warum deb.griffo.io?
- Offizielles Ubuntu: liefert tree-sitter-cli in universe, aber 24.04 LTS hat 0.20.8, 26.04 liegt schon hinter Upstream, und 22.04 hat gar kein Paket
- Upstream-Binary: aktuell, aber die vorkompilierten Linux-Binaries von Upstream sind gegen glibc 2.39 gelinkt, starten also nicht unter Debian 12 oder Ubuntu 22.04, und sie liegen an apt vorbei in
/usr/local/bin - cargo oder npm:
cargo install tree-sitter-clibraucht eine Rust-Toolchain und bei jedem Upgrade einen kompletten Build, und das npm-Paket lädt dasselbe vorkompilierte Binary mit derselben glibc-Anforderung - deb.griffo.io: neueste Version mit automatischen Updates
- ✅ Dasselbe Paket, neuere Version: gleicher Name wie Ubuntus eigenes
tree-sitter-cliund derselbe Pfad/usr/bin/tree-sitter— apt behandelt es als Upgrade, nicht als zweite Installation - ✅ Aus dem Upstream-Tag gebaut: mit cargo aus dem getaggten Upstream-Quellcode unter Ubuntu 22.04 kompiliert, weil die vorkompilierten Linux-Binaries von Upstream glibc 2.39 verlangen; dieses Binary läuft auf jeder Suite ab Bookworm und Jammy
- ✅ Automatische Updates: Pakete werden innerhalb von Stunden nach Upstream-Releases aktualisiert
- ✅ Vollständiges Paket: das aus dem Upstream-Quelltag gebaute
tree-sitter-Binary, Vervollständigungen für bash, zsh, fish und nushell und keine Abhängigkeiten außerlibc6undlibgcc-s1 - ✅ Vier Architekturen: amd64, arm64, armhf und i386 — Raspberry Pi und altes 32-Bit-Notebook bekommen dasselbe tree-sitter
- ✅ Multi-Distribution: läuft auf Ubuntu 22.04, 24.04, 25.10 und 26.04
- ✅ Einfache Wartung: Updates mit den üblichen apt-Befehlen
📦 Paket-Build-Repository
Die Ubuntu-Pakete werden in diesem GitHub-Repository automatisch gebaut und gepflegt:
- 🌲 tree-sitter-cli-debian - Builds der neuesten Releases
🔗 Verwandte Pakete
Ebenfalls verfügbar über deb.griffo.io:
- Neovim - nvim-treesitter baut seine Parser mit dieser CLI
- Helix - Editor, dessen Hervorhebung und Textobjekte Tree-sitter-Abfragen sind
- Zed - Editor, dessen Spracherweiterungen Tree-sitter-Grammatiken mitbringen
- difftastic - Strukturelles Diff auf Basis von Tree-sitter-Parsern
