是的,估计在分支测试一段时间下一步就可以合并到 master分支了。
Emacs Tree-sitter · GitHub 是通过动态模块实现的。
非常期待,感觉又有的折腾了
合并主分支太棒了, 以后写语法分析代码不用写一大堆正则表达式了。
tree-sitter 还是有一些深层次的 bug 的, 最大的问题就是有时候 AST 不平衡的时候会挂掉,需要重新打开。
内置的应该也会,其实我上面也有提到,用一段时间后会出现解析错乱的问题,我也一直没有找到复现的步骤,看了懒猫的话,我估计就是挂掉了。
我目前的使用方式就是给使用了 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 目前对高亮这块已经提升很多了。慢慢来吧