是的,估计在分支测试一段时间下一步就可以合并到 master分支了。
Emacs Tree-sitter · GitHub 是通过动态模块实现的。
是的,估计在分支测试一段时间下一步就可以合并到 master分支了。
Emacs Tree-sitter · GitHub 是通过动态模块实现的。
非常期待,感觉又有的折腾了
合并主分支太棒了, 以后写语法分析代码不用写一大堆正则表达式了。
tree-sitter 还是有一些深层次的 bug 的, 最大的问题就是有时候 AST 不平衡的时候会挂掉,需要重新打开。
也许内置的 tree-siitter 没这样的问题。期待猫哥的 grammatical-edit 能用上内置的 tree-sitter
内置的应该也会,其实我上面也有提到,用一段时间后会出现解析错乱的问题,我也一直没有找到复现的步骤,看了懒猫的话,我估计就是挂掉了。
我目前的使用方式就是给使用了 tree-sitter 相关函数的函数一个可选参数,用来方便手动重启。
这样的话,体验就大打折扣了。到时可以反馈给上游修复一下。
我写 grammatical-edit 的过程中经常挂,细节还不行,90% tree-sitter代码还要搭配10%的正则才行。
真不错,很期待。
刚刚更新了一下,说几点注意事项:
前面有说,语言定义放置在 /usr/lib/x86_64-linux-gnu 目录下或者设置 LD_LIBRARY_PATH,现在也可以通过设置 treesit-extra-load-path 变量将语言定义放置在自己喜欢的目录下。
正如 1 中所看到的,tree-sitter 改名成 treesit 了,如果你有参考我的教程的话,注意下这个前缀的更改。
语言定义的引用由 tree-sitter-c 变成了 c。
treesit-node-at 由 treesit-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)
大佬,我问个问题,怎么使用 tree-sitter 来区分 函数定义和函数调用的?
不是什么大佬,其实可以读一下 tree-sitter 的文档。
拿 C 语言来举例的话,定义 C 的 js 文件把函数定义命名为 function_definition,函数声明叫作 declaration,函数调用叫作 call_expression(实际上使用 treesit 可以自己直接试出来)。
判断的话直接调用 treesit-node-type 就行了,如果该 node 是函数定义就返回 function_definition, 函数声明就返回 declaration,函数调用返回 call_expression

一个粗糙的参考实现(问题很大,随手写来测试的,就不改了,只做参考,不建议拿来使用):
(treesit-node-type
(treesit-parent-until
(treesit-node-at (point))
(lambda (parent)
(member (treesit-node-type parent) '("call_expression" "declaration" "function_definition")))))
大佬,我想问下,目前这个 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 这位才是真大佬。
neovim早早就用上treesitter了,以前确实不太稳定,高亮总是乱掉。现在好多了,至少我c++现在一直渲染的挺好。
tree sitter 能正确处理使用宏的代码吗?
不能,有bug。Qt的宏,好像高亮都没事。但是那种dll符号导出的宏不行,拿不到节点信息。
这就很难受了,这算是c/c++的问题吗?
不清楚,可以看看这里
我装了tree-sitter和tree-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 目前对高亮这块已经提升很多了。慢慢来吧