什么是 tree-sitter-cli?
tree-sitter-cli 是用于开发 Tree-sitter 解析器的命令行工具。Tree-sitter 是一个解析器生成器,也是一个增量解析库:它为源文件构建具体语法树,并在文件编辑时以很小的代价更新这棵树,因此 Neovim、Helix、Zed 和 GitHub 都用它来做语法高亮、代码折叠、文本对象和代码导航。语法就是用这个 CLI 做出来的:它能搭建语法仓库,从 grammar.js 生成 C 解析器,把解析器编译成共享库或 WebAssembly,运行语料测试,对文件进行解析、查询、高亮和标签提取,还能启动一个网页版 playground。它是一个单独的 Rust 二进制文件,你要输入的命令是 tree-sitter。
tree-sitter init 生成的 tree-sitter.json 布局,以及 --js-runtime native 背后的内置 QuickJS 运行时,都出现在官方软件源冻结的版本之后。用新版 CLI 生成的语法仓库,要求每位贡献者的机器和 CI 上都有相同或更新的版本。Debian 稳定版的 0.22.6 和 Ubuntu 24.04 的 0.20.8 早于其中大部分变化,而上游自己的 Linux 二进制需要 glibc 2.39,在 Debian 12 或 Ubuntu 22.04 上根本无法启动。
⚡ tree-sitter-cli 的主要特性
🧱 一条命令建好语法仓库
tree-sitter init 问几个问题,就写好 grammar.js、tree-sitter.json 以及绑定和打包文件,语法从第一天起就能发布给 Node.js、Python、Rust、Go、Swift 和 C 使用。
⚙️ 生成解析器
tree-sitter generate 把 grammar.js 转换成 src/ 下不依赖任何库的 C 解析器,并报告冲突。它用 node 运行语法文件,也可以通过 --js-runtime native 使用内置的 QuickJS 运行时。
🔨 原生与 WebAssembly 构建
tree-sitter build 把解析器编译成编辑器可加载的共享库,--wasm 则生成供 web-tree-sitter 和 playground 使用的 .wasm 模块。
🧪 语料测试
tree-sitter test 解析 test/corpus 下的示例,把语法树与预期的 S 表达式对比,同时运行高亮和标签测试。有意修改之后,用 --update 重写预期结果。
🔍 解析、查询、高亮、标签
parse 打印语法树,query 运行 .scm 查询并列出捕获,highlight 输出到终端或 HTML,tags 提取定义与引用。
🛝 网页 Playground
tree-sitter playground 启动一个本地页面:输入代码,边改边看语法树更新,并对它运行查询,这是弄清某条规则为什么没匹配上的最快办法。
apt upgrade 就能让你保持最新。
📦 从 deb.griffo.io 安装
第 1 步:添加仓库
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 updatesudo apt install extrepo
sudo extrepo enable griffo
sudo apt update🆓 有一个永久免费的镜像。 deb-free.griffo.io 永久免费提供软件包 — 无需账号、无需订阅,最多落后上游 2 个月,安全修复立即发布。目前收录 cliamp、Ghostty、lazydocker、Oh My Posh、Uncloud 和 Zed;tree-sitter-cli 不在其中,因此今天只能通过上面的仓库安装 — 提出请求即可将其加入。
🧩 关于 extrepo 选项。 extrepo 是 Debian 官方用于管理第三方仓库的工具:它会替你写好 sources 文件并安装签名密钥,并在使用前先对照签名元数据校验该密钥。本仓库以 griffo 之名登记其中,永久免费镜像则为 griffo-free,因此在 Debian(bookworm、trixie、forky、sid)上,上面的命令就是全部配置。
extrepo 只负责 sources 文件和密钥,订阅凭据仍然要写入 /etc/apt/auth.conf.d/deb.griffo.io.conf。Ubuntu 不在覆盖范围内,因为 extrepo 只发布 Debian 各套件的元数据:在 Ubuntu 上请使用 sudo 或 root 的命令。
第 2 步:安装 tree-sitter-cli
# 安装最新版 tree-sitter-cli
sudo apt install tree-sitter-cli
# 验证安装,命令是 tree-sitter,不是 tree-sitter-cli
tree-sitter --version# 安装最新版 tree-sitter-cli
apt install tree-sitter-cli
# 验证安装,命令是 tree-sitter,不是 tree-sitter-cli
tree-sitter --version第 3 步:创建第一个语法
# 命令是 tree-sitter。构建和测试解析器需要 C 编译器,
# generate 默认用 node 运行 grammar.js,除非你选择内置运行时
sudo apt install build-essential nodejs
# 搭建一个语法仓库,回答几个问题即可
mkdir tree-sitter-mylang && cd tree-sitter-mylang
tree-sitter init
# 生成解析器、编译并运行语料测试
tree-sitter generate
tree-sitter build
tree-sitter test
# bash、zsh、fish 和 nushell 补全都在软件包里
tree-sitter --help# 命令是 tree-sitter。构建和测试解析器需要 C 编译器,
# generate 默认用 node 运行 grammar.js,除非你选择内置运行时
apt install build-essential nodejs
# 搭建一个语法仓库,回答几个问题即可
mkdir tree-sitter-mylang && cd tree-sitter-mylang
tree-sitter init
# 生成解析器、编译并运行语料测试
tree-sitter generate
tree-sitter build
tree-sitter test
# bash、zsh、fish 和 nushell 补全都在软件包里
tree-sitter --help🎯 基本用法示例
编写语法:
# 每次修改 grammar.js 后重新生成,用内置 QuickJS,无需 node
tree-sitter generate --js-runtime native
# 只运行名称匹配的测试,然后把新输出接受为预期结果
tree-sitter test --include 'function'
tree-sitter test --update
# 构建共享库,或为 web-tree-sitter 构建 WebAssembly 模块
tree-sitter build -o mylang.so
tree-sitter build --wasm解析文件:
# 打印一个文件的语法树
tree-sitter parse examples/hello.mylang
# 安静地解析大量文件,并报告成功了多少
tree-sitter parse examples/*.mylang --quiet --stat
# 给一次解析计时,排查语法改动是否拖慢了速度
tree-sitter parse examples/big.mylang --time查询、高亮与标签:
# 对文件运行查询,列出它捕获的内容
tree-sitter query queries/highlights.scm examples/hello.mylang
# 在终端里高亮文件,或者渲染成独立的 HTML 页面
tree-sitter highlight examples/hello.mylang
tree-sitter highlight --html examples/hello.mylang > hello.html
# 用 tags 查询提取定义与引用
tree-sitter tags examples/hello.mylang现有语法与 playground:
# 在现有语法上工作
git clone https://github.com/tree-sitter/tree-sitter-json
cd tree-sitter-json
tree-sitter generate && tree-sitter test
# 写一个配置文件,然后在 parser-directories 中列出你的语法检出目录
tree-sitter init-config
# 编译为 WebAssembly,并在浏览器中打开交互式 playground
tree-sitter build --wasm
tree-sitter playground🔧 工具集成
Tree-sitter CLI 位于语法和加载语法的工具之间:
- Neovim:nvim-treesitter 的 main 分支用
tree-sitterCLI 编译解析器,并要求较新的版本,比 Debian 稳定版或 Ubuntu LTS 自带的更新 - Helix:高亮、缩进和文本对象都是 Tree-sitter 查询;修改
highlights.scm后先用tree-sitter query检查,再用hx --grammar build重新构建语法 - Zed:语言扩展会固定语法仓库和提交,所以在更新固定版本之前,先在本地生成并测试语法
- CI:先
tree-sitter generate再git diff --exit-code src/,已提交解析器过期的 pull request 就会失败 - 包仓库:
tree-sitter init写好的绑定让同一个语法可以发布到 npm、PyPI 和 crates.io
🚀 为什么选择 deb.griffo.io?
- 官方 Debian:收录了 tree-sitter-cli,但 Debian 13 只有 0.22.6,早于当前语法使用的解析器 ABI 和
tree-sitter.json布局,Debian 12 则根本没有这个包 - 上游二进制:是最新的,但上游预编译的 Linux 二进制链接的是 glibc 2.39,在 Debian 12 或 Ubuntu 22.04 上无法启动,而且放在 apt 管理之外的
/usr/local/bin - cargo 或 npm:
cargo install tree-sitter-cli需要 Rust 工具链,每次升级都要完整编译一遍;npm 包下载的是同一个预编译二进制,glibc 要求也一样 - deb.griffo.io:最新版本,自动更新
- ✅ 同一个包,只是更新:与 Debian 自带的
tree-sitter-cli同名,同样安装到/usr/bin/tree-sitter,apt 会把它当作升级,而不是第二份安装 - ✅ 从上游标签构建:在 Ubuntu 22.04 上用 cargo 从上游带标签的源码编译,因为上游预编译的 Linux 二进制需要 glibc 2.39;这个版本在 Bookworm、Jammy 及之后的所有版本上都能运行
- ✅ 自动更新:上游发布后数小时内更新软件包
- ✅ 完整软件包:从上游源码标签构建的
tree-sitter二进制文件,附带 bash、zsh、fish 和 nushell 补全,除libc6和libgcc-s1外没有其他依赖 - ✅ 四种架构:amd64、arm64、armhf 和 i386,树莓派和老式 32 位笔记本都能用上同一个 tree-sitter
- ✅ 多发行版:支持 Bookworm、Trixie、Forky 和 Sid
- ✅ 易于维护:使用标准 apt 命令即可更新
📦 软件包构建仓库
Debian 软件包在这个 GitHub 仓库中自动构建和维护:
- 🌲 tree-sitter-cli-debian - 最新版本构建
🔗 相关软件包
deb.griffo.io 同样提供:
- Neovim - nvim-treesitter 用这个 CLI 构建解析器
- Helix - 高亮和文本对象都基于 Tree-sitter 查询的编辑器
- Zed - 语言扩展自带 Tree-sitter 语法的编辑器
- difftastic - 基于 Tree-sitter 解析器的结构化 diff 工具
