Emacs 29 这么厉害,还差什么关键功能?

用 Doom Emacs 一年多了,好像有点审美疲劳了,常用的是 vterm,用来写一些脚本,偶尔小规模的写 js, java, go,虽然有 lsp 了,但是 emacs 有时候不知道什么鬼,会卡一下无法操作,非常恼火,所以重度编码的话,还是会上 netbeans, vscode,虽然我的 .emacs.d-doom有几个G,但感觉没发挥 Emacs 的强大,也许是我不写 elisp 的缘故,不过还是很喜欢 Emacs 那种”可编程编辑器的感觉”,可以方便的看到命令、函数怎么实现的,文档也很齐备。

看 Emacs 29 发布了,新功能很炸裂,于是灌水一篇: 如果给你个 Emacs 29原装版,没有任何插件,你有什么是难以忍受,需要通过什么插件弥补,或者希望 Emacs 后续版本改进的?

LSP卡顿换 lsp-bridge 吧, 保证一点都不卡顿。

1 个赞

其实我不知道是什么原因卡顿,也没报错,我都怀疑是不是 macOS 的问题。并不是频繁出现,但出现一次就会特别特别恶心,Windows 那种假死的感觉回来了。

Emacs 的卡主要是几种原因:

  1. 没有多线程: 像 LSP 这种, 不一定会在一个周期 (40ms) 之内完成结果, 就不能等 LSP 服务器计算, lsp-bridge 可以解决

  2. 大数据的GC: 比如 rg 实时搜索结果或者 LSP 返回大量数据, 数据太多需要实时处理, 容易触发GC, GC一启动就会导致卡住 (ivy 和 helm 搜索 HOME 或者 root 目录可以体验卡顿一下), 搜索方面 blink-search 解决了这个问题

  3. 低质量的 hook 和 advice: 当插件质量比较低但是又勾住很多 hook (比如 post-command-hook), 就会导致卡顿, 这方面要通过二分注释法去耐心排查

4 个赞

间歇性卡可能是 GC 设置不太合适的缘故

我觉得 28.2 就比较满意了。meow + rg + lsp-mode + cider + magit + pass 个人工作的话,一定需要的大概就是这几个插件。其它的插件对我都不是刚需。如果升级到 29, 那么可以少一个 lsp-mode。

3 个赞

Emacs 有没有啥开关可以持续打日志,告诉我什么操作什么函数花了多久,方便我定位问题?

pass 指这个吧?看着有点意思,我的密码用 vim -x 做了个加密笔记管理的。

用 doom 肯定不会是 gc设置不太合适的原因了。doom在这方面肯定都配置好了。 间歇性卡顿更可能的原因确实还是懒猫说的,插件出了问题,或者是emacs天生存在的弊端。

看了下下面的回帖,确实应该是插件问题,GC 不会卡到几秒十几秒。

profiler-start 和 profiler-report

但是卡死还是要用二分注释法去排查,profiler 这时候用不了。

一直在黑苹果上编译最新的master分支,目前30.0.50,默认编译选项,不开native-comp,速度正常,没感觉到卡慢。

几个G?这里面都装了啥东西?

spacemacs 我的目录200M。我用的另一个简单的配置61M。我平时只用emacs写代码,其他功能基本不用。

我org-mode用得比较多, 超长行卡顿 的问题能解决就好了

1 个赞

超长行卡顿确实是痛点, 打开文件之前都不知道有超长行, 打开后卡死就很烦。

这样设置一下呢?

我忘了从哪里抄来的了,据说会改善打开长行文件的性能,但没机会测试。

(global-so-long-mode 1) ;; optimize opening one line/long line files

随便找一个 npm 的包, 把 npm build 的包打开就好了, 因为 npm 会把所有 js 内容都压缩成一行。

一般都是直接卡死。

找到了个 137 KB 的,打开 so-long-mode,开始时有点卡,但是没崩溃。

不过确实表现不如 Vim 和 VSCode :rofl: 虽然它俩表现也不怎么样。

超长行可以用 Python 进程在外部进行文件切片, 然后像 blink-search 那样做一个 offset + range 的可视区域处理就行了。

这样Emacs就探测到超长行的条件就转发给外部进程, 外部进程解析部分内容再返回给Emacs做语法渲染, 当然这种切断上下文的语法渲染给Emacs做也很难, 可以在Python端做完全文渲染后, 把语法高亮的范围列表也同可视区域一并返回。

这样应该可以解决超长行的性能问题, 又可以用Emacs的文字编辑功能, 仅提供想法, 还没有实践。

2 个赞

这种技术也可以用 PyQt 来实现一些二进制逆向工具给Emacs用。