treesit 已经合并进 master 分支了

今天日常拉取上游,发现拉取了好多数据下来,一看貌似是 treesit 开始使用了?

https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=aaeaa310f0391f5a5193e1a3d6e026986c4f2c0c

有点好奇,不一般是其他分支合并进主分支吗,为什么是主分支合并进了 feature/tree-sitter 分支(非程序员,不太懂这一块

feature 分支也需要跟上主分支的进度,否则渐行渐远,以后合并更麻烦,甚至有可能废掉。

1 个赞

看了master代码是合并了,比如: emacs/treesit.c at master · emacs-mirror/emacs (github.com) emacs/itree.c at master · emacs-mirror/emacs (github.com)

倒不是不理解这种做法,只是以我之前有限的合作经验,都是日常在自己的分支开发,然后拉取主分支合并到自己的分支,自己的分支改好后再合并到主分支,使用主分支的人是察觉不到其他分支的变化的。

这次 tree-sitter 合并的感觉给我像是一种,tree-sitter 作者日常合并主分支修修改改,结果最后误把自己的分支推送上的主分支的感觉,但是看邮件列表也提了一嘴可以合并进 master

https://lists.gnu.org/archive/html/emacs-devel/2022-11/msg01261.html

可能是我总觉得这种重量级 feature,合并时总得有个大动静或者 yuan fu 大佬亲自发个邮件说一下吧

你说的日常应该是短周期的 feature 分支。

对于一个长周期(按月/年计)的 feature 分支,而且主分支又频繁更新,不跟进有可能你写的代码就作废了。

啊,学到了。这种操作还挺有意思的,希望有朝一日自己也能亲身体会下 :rofl:

确实合并了,如果不是误操作的话。

不是很懂gnu再合并代码时的要求。但是feature分支合进主分支的时候不是常常都会先rebase一下,把无关的merge xxx into xxx这样子的记录给弄掉?:rofl::rofl:

分享下 Windows 下怎么用上 tree-sitter 这个新 feature 吧,文档里的 INSTALL.W64 还没有更新。

从没用 Windows 编译过的坛友可以先看下 nt/INSTALL.W64 下的文档,再来看我这个

  1. 系统下安装 tree-sitter 依赖,pacman -S mingw-w64-x86_64-tree-sitter
  2. ./configure 时添加上 --with-tree-sitter 这个参数

然后就可以用了,在 Emacs 里是以 treesit- 为前缀,貌似还要自己装挺多库的(libtree-sitter-xxx),试着打开了了几个不同的文件,发现只有 elisp 默认能用(都需要自己编译相关的 parser,不知道后续会怎么改进)


分享下如何手动给 Emacs29 添加 tree-sitter 模块:

Windows 下编译 tree-sitter 模块,也是要从 msys2 提供的终端入手,以 ts-mode 为例

  1. git clone https://github.com/tree-sitter/tree-sitter-typescript.git

  2. cd tree-sitter-typescript/tsx

  3. gcc -shared -fPIC -O2 -I./src src/scanner.c src/parser.c -o libtree-sitter-tsx.dll

    只支持 libtree-sitter-xxx 这种名字,不知道是不是我没搞对

之后在 Emacs 里配置里添加

(add-to-list 'treesit-extra-load-path "/path/to/dll")

把刚编译出的模块移动过去,打开 ts 文件,完。

查看 treesit 相关的 path 变量,只有 treesit-extra-load-path 这个一个,看文档说在 user-emacs-directory 下会有一个 tree-sitter 文件夹,但我也没见到,所以就用了这个,希望懂的大佬能说一下是咋回事

1 个赞

这个倒是比较常见,常常能看到主分支不时合并 emacs-28 的 commit

近期且少量 commit 的情况下可以 rebase。

适当 rebase 是可以让 commit 树好看一点,但不能滥用,把很久以前的提交 rebase 到当前,会造成时间序错乱。

想象一下把去年的 100 个提交,rebase 到当前最新提交。这中间会有多少提交产生冲突,每个提交就要解决一次。

把 rebase 看成「回放」,commit 看作录制好的「键盘宏」。当你把旧的键盘宏,应用到新的文件,会产生什么结果。这就是 rebase 可能带来的冲突。

2 个赞

你是怎么确定 elisp 能用的。。。

不好意思,说法有误,我发现是我之前编译过 elisp 的 tree-sitter 模块 :joy:

编译了个 tsx 的模块试了下,丝滑无比

Emacs29 真是有太多惊喜了

你这个对象结构是哪个命令输出的呀?

是说下面的那个 buffer 吗?运行 treesit-explorer-mode 后弹出的

modeline 上显示的信息是 treesit-inspect-mode

这俩个 mode 还都是实时的,我感觉好厉害 :joy:

1 个赞

这两个命令是哪个包引入的啊? 我觉得对我写 grammatical-edit 有很大的帮助。

OT:请教这里使用的是什么主题和字体?

Emacs29 内置的,编译时加上 --with-tree-sitter,然后打开 mode 时调用相关的 parser(ps:图上的 major-mode 就是 Emacs29 内置的 ts-mode)

主题就是 Emacs 的默认主题,字体是霞鹜文楷等宽

2 个赞