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

C++ mode裸配置,编辑时仍然卡得没法使用,用profiler后发现是font-lock的问题。关掉font-lock就很流畅,但是没有代码高亮,请问怎么解决?

我没有试过 只是感觉可行

他能够parser一部分的代码 这样就可以只高亮你看的部分了吧

emacs -q下c++ mode的关键词高亮也会很卡么,如果不是,你得查查是具体是哪个插件的高亮导致的了。

是指按住光标移动的时候卡吗

就是输入的时候卡,好几秒才显示字符

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 个赞