tree-sitter:编辑器语法树的未来?

tree-sitter是一个速度很快的语法parser,支持incremental parsing, error recovery等等很有用的功能。功能比基于正则的工具强很多。上面的链接是emacs-lisp的binding,大佬们是不是可以玩起来了?

我想到的可以加强Emacs的地方: 高亮,更精确的expand-region,语法结构跳转,语法结构编辑(通用paredit)等等

虽然定义跳转,文档等功能还需要LSP,但是通过tree-sitter,许多高级编辑功能可以编辑器自带了。

5 个赞

语法高亮用外挂的方式效率太低了, 之前c++用过, 卡得不行. 这东西跟垃圾回收挺像, 一次不能卡太久, 需要很长时间的积累

incremental parsing

这个我觉得还好,首先它本身很快,其次它是以module的方式挂载的

cc-mode也是增量分析, 开发了那么久, 现在有不少情况下还容易卡, 与iedit配合就是个例子, 敲一个字符等一两秒

cc-mode是用elisp分析,这个是用rust分析,一个天上一个地下。

核心库是c吧,不是rust。即使这样,跟emacs27带的原生json库一样,可能会有其他开销,比如buffer内容拷贝等,编码转换等,导致最终效果一般。当然只是可能。

除了buffer内容拷贝之外,比如cc-mode的解析结果可以放在buffer内容的text property里,外部解析就很难这样,可能需要自己缓存。

你們嘴上都说要编辑器,身体都很诚实地要 IDE 啊

10 个赞

小孩子才做选择,成年人全都要。

话说语法树不是lsp能给出么,为什么还要搞这个?

你这政治取向不对,这叫做emacs特色的编辑器。。。。

3 个赞

一般直接调用 compiler 的,比如 lsp,需要完整合法的代码,每次檢查的开銷很大,做不到 incremental parsing 的 all at typing time。而且一遇到錯误就停止了,不能一次性列出所有问題。

你可以直接在这体驗一下。

https://tree-sitter.github.io/tree-sitter/playground

3 个赞

vim可以有 vscode可以有 哪有神魔特色

不好意思,Vim 和 VSC 的 buffer 实現 (rope 和 piece table) 都说明了它们不能有。

https://python.ctolib.com/georgewfraser-vscode-tree-sitter.html

求buffer实现的简明介绍或资料(或者说它们这些实现为什么不能有)

我觉得 tree-sitter的作者应该懂得 不能依赖某种buffer的实现

因为这些实現不能支持 emacs 用的那啥,marker。用來实現第三方 parse 的话 marker 挺重要的。

marker间移动是远远快于char pos间跳转么