font-lock的性能有问题吗,编辑C++文件卡得不行

这个不用加,只要你系统中安装了 tree-sitter,就会自动开的。 看官方文档,别看那些过时的 Blog 了。 https://git.savannah.gnu.org/cgit/emacs.git/tree/admin/notes/tree-sitter/starter-guide?h=emacs-29

1 个赞

看不懂这个脚本该什么时候用,在什么文件夹下用。

我用 Homebrew 安装的 tree-sitter,但是我没有~/.tree-sitter 这个文件夹 :rofl:

  1. 用系统的包安装工具(brew 或者 macports 都行)安装好 tree-sitter
  2. 安装 Emacs 29,确保开启了 tree-sitter 支持,自己编译的话是默认开启。
  3. 确保 Emacs 在你的 PATH 中, emacs --version 能看到正确的 Emacs 版本
  4. 在 Emacs 的源码目录(比如我的是 ~/src/emacs)下的 admin/notes/tree-sitter/build-module 中执行 ./batch.sh 就会自动编译 language grammar。
cd ~/src/emacs/admin/notes/tree-sitter/build-module
./batch.sh
  1. 自己把 dist文件夹下的 dylib 文件拷贝到 ~/.emacs.d/tree-sitter 下,没有就自己建立一个。

大概是这样,具体就看文档吧。

https://git.savannah.gnu.org/cgit/emacs.git/tree/admin/notes/tree-sitter/starter-guide?h=emacs-29

1 个赞

我好像有点明白了,tree-sitter 是骨架,language grammar 是单独买来的砖块。

这个是烧砖的砖窑,而且自动把烧好的砖垒进 Emacs 里了。 原来需要自己搬砖。

:rofl:

1 个赞

我觉得可以把treesit模块的编译和腾挪写进 emacs-build-macos, 一步到位。

还是复制进去一份比较好,每次都烧砖有点费时间啊 :rofl:

macOS 的文件系统好像有个功能是复制一份相同的文件不会占用第二份磁盘空间。

感谢大佬指点,同时感谢 @zqso

我来交作业啦

克隆这个仓库

在 build.sh 里添加

    "elisp")
        org="Wilfred"
        ;;
chmod u+x build.sh
chmod u+x batch.sh
./batch.sh

build 完成后把 dist/下面的动态库移动到配置文件夹下的 tree-sitter/文件夹下

Emacs 配置里写上 (require 'treesit)

然后就可以在 M-x 里开启 xxx-ts-mode 了。

2 个赞

不确定elisp的好不好用,等你出报告 :grin:

更新:我自己加上试了一下,没法生成.dylib。应该要等treesit支持?

熬夜了,现在脑子不太好使,稍晚些我清醒过来再写写体会。 :joy:

treesit 在 mac 上好像要把 dylib 后缀手动改为 so 才能加载

macOS 的 dylib 好像就是 Linux 上 so 的对应。

我只试了下 json-ts-mode,是可以用的。

tree
.
├── libtree-sitter-bash.dylib
├── libtree-sitter-c-sharp.dylib
├── libtree-sitter-c.dylib
├── libtree-sitter-cmake.dylib
├── libtree-sitter-cpp.dylib
├── libtree-sitter-css.dylib
├── libtree-sitter-dockerfile.dylib
├── libtree-sitter-elisp.dylib
├── libtree-sitter-elixir.dylib
├── libtree-sitter-glsl.dylib
├── libtree-sitter-go.dylib
├── libtree-sitter-heex.dylib
├── libtree-sitter-html.dylib
├── libtree-sitter-java.dylib
├── libtree-sitter-javascript.dylib
├── libtree-sitter-json.dylib
├── libtree-sitter-julia.dylib
├── libtree-sitter-make.dylib
├── libtree-sitter-markdown.dylib
├── libtree-sitter-org.dylib
├── libtree-sitter-perl.dylib
├── libtree-sitter-proto.dylib
├── libtree-sitter-python.dylib
├── libtree-sitter-ruby.dylib
├── libtree-sitter-rust.dylib
├── libtree-sitter-sql.dylib
├── libtree-sitter-toml.dylib
├── libtree-sitter-tsx.dylib
├── libtree-sitter-typescript.dylib
├── libtree-sitter-verilog.dylib
├── libtree-sitter-vhdl.dylib
├── libtree-sitter-wgsl.dylib
└── libtree-sitter-yaml.dylib

好奇你这儿libtree-sitter-elisp能用么?我刚才build了一下,没生成这个。

我目前treesit能用,不需要手动改成.so, 不过不知道你是不是特指上面这条elisp相关的treesit?

我现在俩眼皮开始打架了,就不测试了(其实我不知道 ts 有啥用,就是跟风

你可以从这里下载我这里生成的动态库,macOS 13.1 M1 MBA。

多谢,已经搞定了,我忘了把"elisp“加入到batch.sh里。加上了,编译好了。 :smile_cat: 因为上游和Wilfred都没有写相关的elisp-ts-mode, 所以现在应该不能直接使用,只能在终端里使用。所以其实elisp相关模块就是装着玩玩。

知道它比普通font-lock快就好了。他是基于paser语法树高亮,而不是传统的regexp搜寻。所以编辑带有font-lock的几千上万行的文件的时候,速度提升太明显了。而平时这种情况只能切到text-mode和fundamental-mode下才能好好编辑。

我的错,我是写进 build.sh 之后直接运行的 ./build.sh elisp 之前忘了说 :rofl:

确定 elisp 能用 treesitter 了?我看 emacs-lisp-mode 代码里面没有使用 ts 的地方啊。。

能,看图,M-x treesit-explore-mode

每个语言的 xxx-ts-mode 都是单独的主模式,elisp为啥没有自己的 elisp-ts-mode 我也不知道,但猫大的 grammatical-edit 支持 elisp tree-sitter。

1 个赞

猫大那个是直接用的 ts 的接口来获取的各种 node , 所以只要 treesit 有对应的库就可以。

emacs-lisp-mode 的话,目前应该是虽然可以使用 treesit-explore-mode 来查看语法信息,但是语法高亮还是用的原始的正则来实现的。

如果我没理解错的话。

1 个赞

lisp 不需要 treesit.

  • Lisp 语法很简单, Emacs parse 起来很快, 不需要用 treesit parse
  • Lisp 有很多现成的结构化编辑工具, 如 smartparens, paredit, lispy
  • Lisp 通常是用 REPL 配合编程, 高亮信息可以直接用 REPL 获取, 不需要 treesit
4 个赞

哈哈哈,感觉 elisp 本来就是一棵树,只是重新用 tree-sitter 的树给描述了一下。我太菜了,基本语法都没掌握,还没体会到有啥增益。

tree-sitter-elisp 的作者说 Emacs Lisp 是 lisp-2 所以 tree-sitter 分析不了套了太多层(施加某种魔法 :face_with_spiral_eyes:)的 elisp(非程序员的个人理解,轻喷)。