今天日常拉取上游,发现拉取了好多数据下来,一看貌似是 treesit 开始使用了?
https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=aaeaa310f0391f5a5193e1a3d6e026986c4f2c0c
有点好奇,不一般是其他分支合并进主分支吗,为什么是主分支合并进了 feature/tree-sitter 分支(非程序员,不太懂这一块
今天日常拉取上游,发现拉取了好多数据下来,一看貌似是 treesit 开始使用了?
https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=aaeaa310f0391f5a5193e1a3d6e026986c4f2c0c
有点好奇,不一般是其他分支合并进主分支吗,为什么是主分支合并进了 feature/tree-sitter 分支(非程序员,不太懂这一块
feature 分支也需要跟上主分支的进度,否则渐行渐远,以后合并更麻烦,甚至有可能废掉。
看了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 分支,而且主分支又频繁更新,不跟进有可能你写的代码就作废了。
啊,学到了。这种操作还挺有意思的,希望有朝一日自己也能亲身体会下
不是很懂gnu再合并代码时的要求。但是feature分支合进主分支的时候不是常常都会先rebase一下,把无关的merge xxx into xxx这样子的记录给弄掉?
分享下 Windows 下怎么用上 tree-sitter 这个新 feature 吧,文档里的 INSTALL.W64 还没有更新。
从没用 Windows 编译过的坛友可以先看下 nt/INSTALL.W64
下的文档,再来看我这个
pacman -S mingw-w64-x86_64-tree-sitter
./configure
时添加上 --with-tree-sitter
这个参数然后就可以用了,在 Emacs 里是以 treesit-
为前缀,貌似还要自己装挺多库的(libtree-sitter-xxx),试着打开了了几个不同的文件,发现只有 elisp 默认能用(都需要自己编译相关的 parser,不知道后续会怎么改进)
分享下如何手动给 Emacs29 添加 tree-sitter 模块:
Windows 下编译 tree-sitter 模块,也是要从 msys2 提供的终端入手,以 ts-mode 为例
git clone https://github.com/tree-sitter/tree-sitter-typescript.git
cd tree-sitter-typescript/tsx
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
文件夹,但我也没见到,所以就用了这个,希望懂的大佬能说一下是咋回事
这个倒是比较常见,常常能看到主分支不时合并 emacs-28 的 commit
近期且少量 commit 的情况下可以 rebase。
适当 rebase 是可以让 commit 树好看一点,但不能滥用,把很久以前的提交 rebase 到当前,会造成时间序错乱。
想象一下把去年的 100 个提交,rebase 到当前最新提交。这中间会有多少提交产生冲突,每个提交就要解决一次。
把 rebase 看成「回放」,commit 看作录制好的「键盘宏」。当你把旧的键盘宏,应用到新的文件,会产生什么结果。这就是 rebase 可能带来的冲突。
你是怎么确定 elisp 能用的。。。
不好意思,说法有误,我发现是我之前编译过 elisp 的 tree-sitter 模块
你这个对象结构是哪个命令输出的呀?
是说下面的那个 buffer 吗?运行 treesit-explorer-mode
后弹出的
modeline 上显示的信息是 treesit-inspect-mode
这俩个 mode 还都是实时的,我感觉好厉害
这两个命令是哪个包引入的啊? 我觉得对我写 grammatical-edit 有很大的帮助。
OT:请教这里使用的是什么主题和字体?
Emacs29 内置的,编译时加上 --with-tree-sitter
,然后打开 mode 时调用相关的 parser(ps:图上的 major-mode 就是 Emacs29 内置的 ts-mode)