搓了个 wgsl-ts-mode

三个月前试着写了一下 WGSL(WebGPU Shader Language)的 tree-sitter parser generator. 今天有点时间写了下 emacs 的 major-mode 支持:

include-yy/tree-sitter-wgsl: WGSL grammar for tree-sitter

这个 repo 里面主要是 parser 的实现,另外也有一个简单的 wgsl-ts-mode.el 提供对应的 major-mode 基本功能。在编译后将 DLL 放置于 .emacs.d 的对应位置后,如果 Emacs 支持 tree-sitter 在加载 wgsl-ts-mode .el 后应该能正常使用 wgsl-ts-mode 高亮 WGSL 文件了:

当然,我参考了已有的实现: acowley/wgsl-ts-mode: WGSL tree-sitter support for emacs,作者还在 reddit 上发过帖子: wgsl-ts-mode r/planetemacs ,但没人鸟他。

虽然写完一看 elisp 有 200 多行,但是里面的代码非常公式化,参考 Emacs 内置的一些 ts-mode 就能很快写出来,写起来并没有想象的那么麻烦。如果你能看完 tree-sitter 的文档,然后照着想要写 major-mode 的语言的 grammar.js 写就行了。

WGSL 的 tree-sitter parser 实现 star 比较多的是 szebniok/tree-sitter-wgsl,但也有很久没有更新了。WGSL 标准现在变动的还挺快,估计我写的很快会过时。

有时间再改进代码了之后写个总结。

4 个赞

另:我使用的 tree-sitter-cli 和 tree-sitter 库版本是 21.0,请注意 0.22.4 出现了 ABI 不兼容:

*** stack smashing detected ***: terminated Fatal error 6: Aborted · Issue #3296

Dynamic libraries are fine, distros just need to ensure that the package that has tree-sitter as a shared lib dep uses the exact same version that the distro provides, but going forward we will try to be more mindful about abi breakage