tree-sitter 好像基本完成了?

是的,估计在分支测试一段时间下一步就可以合并到 master分支了。

Emacs Tree-sitter · GitHub 是通过动态模块实现的。

1 个赞

非常期待,感觉又有的折腾了

合并主分支太棒了, 以后写语法分析代码不用写一大堆正则表达式了。

tree-sitter 还是有一些深层次的 bug 的, 最大的问题就是有时候 AST 不平衡的时候会挂掉,需要重新打开。

也许内置的 tree-siitter 没这样的问题。期待猫哥的 grammatical-edit 能用上内置的 tree-sitter

1 个赞

内置的应该也会,其实我上面也有提到,用一段时间后会出现解析错乱的问题,我也一直没有找到复现的步骤,看了懒猫的话,我估计就是挂掉了。

我目前的使用方式就是给使用了 tree-sitter 相关函数的函数一个可选参数,用来方便手动重启。

1 个赞

这样的话,体验就大打折扣了。到时可以反馈给上游修复一下。

1 个赞

我写 grammatical-edit 的过程中经常挂,细节还不行,90% tree-sitter代码还要搭配10%的正则才行。

3 个赞

真不错,很期待。

刚刚更新了一下,说几点注意事项:

  1. 前面有说,语言定义放置在 /usr/lib/x86_64-linux-gnu 目录下或者设置 LD_LIBRARY_PATH,现在也可以通过设置 treesit-extra-load-path 变量将语言定义放置在自己喜欢的目录下。

  2. 正如 1 中所看到的,tree-sitter 改名成 treesit 了,如果你有参考我的教程的话,注意下这个前缀的更改。

  3. 语言定义的引用由 tree-sitter-c 变成了 c

  4. treesit-node-attreesit-node-on 代替,即你可能需要将你之前使用 treesit-node-at 的地方用 treesit-node-on 代替,treesit-node-at 依旧存在,只是语法略有不同,可以使用 C-h f 来查看具体函数介绍。

举个例子,前文中的

(tree-sitter-get-parser-create 'tree-sitter-elisp)

应该修改为:

(treesit-get-parser-create 'elisp)
5 个赞

大佬,我问个问题,怎么使用 tree-sitter 来区分 函数定义和函数调用的?

不是什么大佬,其实可以读一下 tree-sitter 的文档。

拿 C 语言来举例的话,定义 C 的 js 文件把函数定义命名为 function_definition,函数声明叫作 declaration,函数调用叫作 call_expression(实际上使用 treesit 可以自己直接试出来)。

判断的话直接调用 treesit-node-type 就行了,如果该 node 是函数定义就返回 function_definition, 函数声明就返回 declaration,函数调用返回 call_expression

byzanz_record

一个粗糙的参考实现(问题很大,随手写来测试的,就不改了,只做参考,不建议拿来使用):

(treesit-node-type
 (treesit-parent-until
  (treesit-node-at (point))
  (lambda (parent)
    (member (treesit-node-type parent) '("call_expression" "declaration" "function_definition")))))
1 个赞

大佬,我想问下,目前这个 tree sitter 的高亮支持 language-injection 么? https://tree-sitter.github.io/tree-sitter/syntax-highlighting#language-injection

emacs-tree-sitter/elisp-tree-sitter 是不支持的,我非常期待能有这个功能。能有这个的话我立刻切到这个分支来用😄

不清楚唉,高亮方面的我没有了解过,只对 tree-sitter 的一些 API 有所了解。就我对这些 API 的了解而言,tree-sitter 是支持单文件多语言的,所以应该没有问题,但作者的语法高亮那部分实现我暂时没看。

真不是什么大佬,我只是不久前粗略的翻了下 tree-sitter 的文档(现在也忘的差不多了), @casouri 这位才是真大佬。

1 个赞

neovim早早就用上treesitter了,以前确实不太稳定,高亮总是乱掉。现在好多了,至少我c++现在一直渲染的挺好。

tree sitter 能正确处理使用宏的代码吗?

不能,有bug。Qt的宏,好像高亮都没事。但是那种dll符号导出的宏不行,拿不到节点信息。

这就很难受了,这算是c/c++的问题吗?

不清楚,可以看看这里

我装了tree-sittertree-sitter-langs两个包,然后下面这段c++代码

int main(int argc, char* argv[])

通过describe-face查看,其中*的face是operator,而argv没有任何tree-sitter覆盖的face。实际上,*不应该是operator,argv应该是variable/parameer的face。感觉对C/C++的支持不太完整?

如果是char *p类型的变量,或者char p[]都能正确识别,但是char *pp[]或者char **p就出错了。 无标题

有点瑕疵就算了,tree-sitter 目前对高亮这块已经提升很多了。慢慢来吧