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

emacs -q 后在C++文件内输入不卡,但是在orgmode的C++代码块内输入还是有一点点延迟

谢谢大家,重启后,现在在C++文件内输入很流畅了,主要是在orgmode的C++代码块中输入很卡,使用emacs -q后也会有一点点的延迟。

modern-cpp-font-lock 你是使用这个变得卡的吗?

这个

看了下我那边的profiler,没有condition-case到save-current-buffer那块的逻辑。

font-lock 有时候是会出些莫名奇妙的问题,比如:

万万想不到几个前导空格就让 font-lock 翻船了。

1 个赞

我也遇到这个问题了,编辑比较大的代码文件输入会很卡,快速键入时回显很慢,有时候输 入的字符还是顺序错乱的,需要设置一下 jit-lock:

;; jit-lock
(use-package jit-lock
  :ensure nil
  :custom
  (jit-lock-defer-time 0.25)
  (jit-lock-stealth-time 16))

参考 EmacsWiki: Font Lock Speed

这样改了以后有极少数地方(如:completion buffer)代码着色会感觉到延迟,但是敲代码时总算是找回了跟手的感觉。

3 个赞

学习了。

另外,使用 c++-ts-mode (parser-based font lock) 的高亮应该会比传统 font lock 快很多?前天测试了一份一千多行的 clojure-ts-mode, 速度相比传统font lock 有点儿秒杀那味儿了。又用json-ts-mode测试了2万多行的json文件,虽然还是有点儿跟手,但轻量编辑起来舒服多了。

请问怎么才能编译出来 json 的 language grammar 啊?谢谢 :pray:

Warning (treesit): Cannot activate tree-sitter, because language grammar for json is unavailable (not-found): (libtree-sitter-json.so libtree-sitter-json.dylib) No such file or directory

用官方仓库的脚本就可以了,自动的。

https://git.savannah.gnu.org/cgit/emacs.git/tree/admin/notes/tree-sitter/build-module/batch.sh?h=emacs-29

1 个赞

刚才看别的帖子里说要 build 的时候 --with-tree-sitter 我已经在重新 build 了 :rofl:

这个不用加,只要你系统中安装了 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: