tree-sitter 支持 Elisp 本身吗?

复制 intervals 可以不简单,会重新平衡 interval tree,text property 多的 buffer 可以消耗几秒钟的时间。 关于 coding system,是我错了,从 Emacs 内部换 unicode 之后就没有单独解码了。

这个是上面 make_buffer_string_both 里面 if (props) 运行的內容,我找了个 tree-sitter 的 emacs 绑定实现看了下,实际上调用的是 buffer-substring-no-propertiesprops 会设为 0,不会对 text property 相关的內容进行操作。

https://github.com/karlotness/tree-sitter.el

不过 tree-sitter 本身有 bug 不能实现整合是另一回事了。


我这里没啥感觉,用的下面的。估计配置差異。

(add-hook 'post-command-hook
	  (lambda () (buffer-substring-no-properties (point-max) (point-min))))

而且 after-change-functions 就行了,post-command-hook 有点过了。

即使使用 `buffer-substring-no-properties’,也会创建新 string,复制一次,次数多了也会导致 GC

我在 post-command-hook 中加上了 `buffer-substring-no-properties’,然后就开始不停的 GC,无法接受

说白了,不管 memcpy 速度如何,通过复制 buffer 内容来实现 incremental parsing 就不是正确的实现方式,正确的实现方式是在 Emacs 内置 tree-sitter,而 Emacs 这边的工作已经做的差不多了,只剩下等 tree-sitter 开发者修 bug

5 个赞

我有个小问题,内置 tree-sitter 是指以 C 代码形式加到 Emacs 吗?这样是不是让 Emacs C 代码部分变大了?以及这种变大会有坏处吗?问题纯属好奇。

没有,就是和别的库一样变成编译时可选依赖。

tree sitter要改allocator必须从源码编译,估计得加入emacs源码树

期待 tree-sitter 能够加入 Emacs master 分支,之前看到 @casouri 大佬在准备。 https://www.reddit.com/r/emacs/comments/pxpq8d/rfc_emacs_treesitter_integration/

不知道在哪里可以看到进度? 预计什么时候可以用上?

照你这么说,gcc emacs merge 以后得把 gcc 也整进 emacs 代码里了, 因为 libgccjit 也要改 gcc 编译参数(

项目地址

casouri 主页里 tree-sitter 的一些相关介绍

邮件列表上的讨论

单集成而言,某种意义上应该算得上是已经完成了,剩余的部分更多的我觉得应该归类到对 tree-sitter 的运用?可能就像另一个贴子里 oldosfan 说的那样或许是在等待 tree-sitter 的开发者解决一些关于 malloc 的问题?

1 个赞

tree-sitter 改 allocator 是通过 preprocessor 覆盖

比如这样

#define ts_malloc my_custom_malloc

#include  lib.c

不像 gmp, 是通过 mp_set_memories_function 改 allocator 。当然了这样做的代价是,当另外一个库也引用了 gmp 并且通过这个函数修改 allocator,你自己的 allocator 就被覆盖了

https://gmplib.org/manual/Custom-Allocation

不改应该也有办法,这是讨论了改的情况

libgccjit,记得几个为了 gccemacs 改的补丁都是直接被上游合并了

2 个赞