Why use and why not use Emacs?
这大概又是一篇非常主观的博客,就图一乐。
我与 Emacs: - 大概 18 年的时候,我尝试了一阵 Emacs,后来选择了 Atom(却怎料 Atom 凉得更快)。 - 大概 22 年的时候,我想重拾 Emacs,结果发现最大的阻力是 Copilot 不支持 Emacs。于是我抽出了不少时间开发了 copilot.el,这让我和 Emacs 的社区更加紧密了,随后也为 lsp-bridge 做了一些微小的贡献,认识了一些热爱着 Emacs 的同好们。 - 大概 23 年的时候(也是我开始第一份全职工作的时候),因为 Emacs 无法适应我的需求而放弃了。再之后插件 copilot.el 也交给社区维护了。 - 大概 24 年的时候,写了这篇博客,以纪念我不再使用的 Emacs。
注:本文不细分编辑器 editor 和集成开发环境 IDE。
为什么选择 Emacs?
Emacs 是一个用户离编辑器本身以及插件开发者很近的编辑器,所以在使用习惯上会和其它编辑器有所不同。比如格式化选中的代码区域是一个常见操作,对于通常的编辑器而言你知道有这么一个菜单项,而且有一个快捷键(当然快捷键也可以自己重新映射)。而对于 Emacs,你知道这个格式化操作的名字(被称为 command,比如 format/region
,可以通过搜索来执行),更重要的是这个名字还是这个操作对应的函数名,用户可以很方便地跳转到定义了这个函数的文件位置查看其实现,这样的好处在于用户很容易根据已有的功能而创造出新的功能。
Emacs 拥有 Emacs Lisp 作为脚本语言(正如 Vim 拥有 Vimscript),一切的配置都是以 Elisp 代码的形式存在,而其它编辑器则可能是用图形界面或者 json/xml 这类 markup language 配置。区别在于如果我想有条件地配置一些东西,比如在公司电脑上不启动一些插件,或者根据屏幕分辨率调节字体大小,用代码配置就方便且直接。作为一门为编辑器而生的 lisp 方言,有很多小功能让 Emacs 更加容易 hack,比如可以用 add-advice
修改已有函数的行为,用 add-hook
来修改编辑器的行为。除此之外,Elisp 是一门非常优美的语言(相信 lisp 的各种方言也通常如此),也是动态且强大的函数式语言(但是充满了副作用),写起来让人身心愉悦(在没踩到坑的情况下)。
根据自己的喜好一点一点攒配置,最终让 Emacs 成为完美契合自己使用的编辑器,整个过程非常有成就感。更进一步的话,可以把 Emacs 变成类似于操作系统的存在,所有日常的使用(包括浏览网页,看视频)都可以放到 Emacs 里。
此外还会有一些没用过 Emacs 的人想象不出的选择 Emacs 的理由,比如为了好用的内置标记语言 org-mode
或者 git 插件 magit
.
为什么放弃 Emacs?
肯定可以让 Emacs 变得非常接近我心目中的完美 IDE,但是代价也是巨大的。考虑到工作节奏比较快,没有时间折腾这些,最后我还是选择了开箱即用且足够好用的 JetBrains 家的 IDE。
一些插件开发相关的问题:
- Emacs 的 overlay (可以理解为在不改变文本的情况下显示一些内容,可以用于显示补全菜单或者类型提示的场景)充满了玄学问题,很难让它如预期般工作。
- Emacs 本身并不是真正多线程的,或者说 Emacs 的多线程是带有全局锁而且是协作式调度的。所以很容易因为 Emacs/Elisp 本身触及到性能瓶颈,一个典型的症状就是觉得卡。
- Emacs 插件之间的兼容性很难保证,当然这也是给插件开发者极高自由度所需要支付的代价。
一些在别的 IDE 里稀松平常的事情在 Emacs 里可能就异常复杂,以下是一些例子:
- 自动保存
- 标签页
- Debug
- 语义高亮 (Semantic Highlighting)
- CMake Target 管理
- 远程开发
结语
编辑器之争和编程语言之争一样,算得上圣战了(笑)。
Emacs 是一个足够酷的编辑器,所以喜欢它的人会一直喜欢下去,但也可能因为种种原因而放弃自己喜欢的事物(比如我)。Emacs 大概很难焕发第二春了,但我希望能看到新的编辑器接过 Emacs 的使命,让一些人为之着迷,成为新的宗教流派。