hsingko


使用 Emacs 两年多后的总结

与 vim 的对比

在程序员圈子里,有一个经久不衰的话题是 Editor War ,究竟谁才是最好用的编辑器?幸运的是,不像语言战争,这个问题是二选一: Emacs or Vim ?

从占用率上看, vi 和它的表亲 vim 拥有绝对的统治力,毕竟所有的 linux 机器上都内置了 vi 。并且 vi 所代表的模式编辑理念及相应的快捷键设置也活跃于其它软件上。Intellij IDEA, VScode 等代码编辑器都提供了模拟 vim 的插件,甚至是浏览器也提供了类似的插件,比如我一直在使用的 Vimium ,通过它我在日常浏览网页时几乎用不到鼠标。所以即便将来 vim 不幸陨落,它的快捷键理念依旧能存活下来。

相比之下, Emacs 则比 vim 小众得多。尽管在终端模拟器的快捷键设置中,有一部分它的影子,但总体来看,它编辑文本时的按键设定几乎是灾难性的。几乎所有的快捷键都需要用到 Ctrl ,并且按键序列也非常复杂,比如打开一个文件需要连续输入: Ctrl x Ctrl f ,保存一个文件则需要输入 Ctrl x Ctrl s 。在不修改键盘按键的情况下, Emacs 绝对是难以使用的,甚至对因频繁使用小拇指按 Ctrl 而导致的疼痛都有一个专有名词来称呼它: Emacs Pinky

但这个缺点也可以通过 Emacs 上丰富的插件来解决。比如最有名的 evil-mode ,提供了 vim+Emacs 的完美整合,但缺点是过重,而且将 vim 的操作方式完全移植到 Emacs 上可能并不是什么好的解决方案。目前我使用的是 meow ,操作方式类似于 vim ,但轻量很多,它提供的 keypad-mode 及 fallback 模式,使得我能很快地适应 SPCleader-key 的快捷键方式。

就我自己的经历来说,在维护生产环境的服务器配置时, vim 是唯一的选择,此后我在个人桌面环境中也断断续续使用过 vim 和后来的 neovim ,但并不精通。光是熟悉它的按键模式就花了好长时间,不过掌握基本的移动和文本对象操作之后的收益也是巨大的。但 vim 从来没有成为过我的主力编辑器,因为我平时的操作的文本可以分为代码与笔记,写代码的体验并不如 IDE+vi 模式 ,而在记笔记的场合 vim 也没有能媲美 Emacs 的 orgmode 以及足够好用的中文输入法,如 Emacs 上的 rime 。

此外,我也从来没搞懂过要怎么定制 vim ,而 Emacs 则只需要熟悉 elisp 的简单语法就能慢慢自己写一些小工具,事实上有很多开发 Emacs 插件的大佬都不是专业的程序员,比如 helm 的开发者主业是登山, denote 的开发者从事的是哲学, nano-theme 则是科学工作者开发的。尽管 neovim 将 lua 引入了 vim 配置大大降低了插件开发门槛,但整体的开发环境是不如 Emacs 的。

因此如今我的主力编辑器是 Emacs 而不是 vim 。并且即便如今出了很多 rust 开发的新时代编辑器,我也没有看到任何有取代 Emacs 潜力的替代品。

我的 Emacs 使用理念

但是 Emacs 是一套相当复杂的编辑器,它甚至可以成为主力的操作系统,随着配置的积累,我不得不在各种使用理念中进行取舍,这里是我的一点心得。

别让它真的成为操作系统

一种常见的安利 Emacs 的广告词是:它是伪装成文本编辑器的操作系统!

我不否认 Emacs 的能力, EAF 甚至 EXWM 确实提供了系统级别的窗口管理能力,但是真的会有人会因为这个理由而被吸引吗?如果它是个成功的系统,却是个不成功的编辑器,那它的吸引力也会大打折扣吧?

Live in Emacs 是很多 Emacs 用户的选择。但对我来说,用它编辑文本就足够了,顶多再用 dired 处理一下文件。听音乐、收邮件、看视频、订阅新闻——这些事情有更适合的软件去做。

Doom Emacs 和 SpacEmacs 等框架是双刃剑

其实在很多年前我就已经尝试过 Emacs ,当时我使用的是当时非常流行的 SpacEmacs 。我尝试了很多次,然而都没有成功。因为 SpacEmacs 实在是太复杂了,我常常怀疑真的有新人能通过 SpacEmacs 来入门吗?它默认使用了基于 evil 的快捷键,还自定义了一整套操作逻辑,在网上搜索 Emacs 的操作时我甚至连 leader key 是哪个也没搞清楚过,更别提自己安装插件了,它所谓的 layer 对于初学者来说真的是一场噩梦。

Doom Emacs 相对来说入门简单很多,但也自带了很多“黑魔法”,比如用 package!, set! 等语法糖。

使用 Doom 时最让我感到痛苦的两点是:更新与排错。由于自有国情在此, github 被间歇性阻断,而一旦更新因为网络问题中断,那么就会常常出现莫名其妙的错误,唯一的解决方法是删了重装。排错更是地狱,对于 Emacs 的初学者来说, Doom 就相当于一个技术黑箱,每次启动的时候你都要祈祷,因为仅仅在配置文件中少一个括号都会是导致启动失败的灾难,而看着那报错日志,你恐怕永远也想不到问题出在哪里。

这类框架或许对与初学者就好比陈列在橱窗中的展览品,好看,一开始的时候也好用,但是当你真的深入体验之后,就会发现各种不如意的地方。

并且它们复杂的技术细节也会妨碍你对 Emacs 的真正认知。当你遇到问题于是跑到 Emacs-China 上求助,有人问你:用 Emacs -Q 测试了吗?我很怀疑,对于 Doom 和 SpacEmacs 的使用者来说,这样的最小化配置启动是可能的吗?

单纯写代码有更好用的工具

我永远不会推荐一个刚开始学编程的人去学习 Emacs 。

对于各种编程语言来说,都有更适合的工具。比如前端可以用 VSCode ,后端用 IDEA ,各系统的 GUI 应用开发则有各自专门的开发软件,仅就编程来说, Emacs 适用面其实非常窄,除非你想用 Emacs 学习 SICP ,或者干脆就是想开发 Emacs 插件,对于其它用户来说, Emacs 并不是一个非常有性价比的选择。

随着 LSP, treesitter 的流行,Emacs 拥有了越来越接近 IDE 的能力,但花大量的时间学习它仅仅为了编程,我觉得是不理性的。非要折腾的话,我觉得 neovim 比 Emacs 合适得多。

Emacs 最适合的是广义上的文字工作者

Emacs 有相当一部分的使用者并非程序员,而是科研工作者、笔记爱好者,以及更广义的文字工作者。

比如用 orgmode 可以进行日程规划、论文写作;denote, org-roam 等笔记软件则在 orgmode 基础上实现了流畅的笔记体验;还可以使用 abbrev 配置常用缩略语,让写作变得更加高效;对于需要中英文混合输入的用户来说 Emacs-rime/SIS 的断言机制提供了独一无二的写作体验……

然而 Emacs 的尴尬之处在于没有编程经验的人上手需要付出高昂的学习成本,尤其对于中文用户来说需要克服更多的障碍,如中文的输入、字体的配置等等。

我所使用的包

Emacs 的扩展性让每个人的编辑环境都有各自的风格,而这风格很大程度上又由他们所使用的包决定。

目前我只安装了 38 个包,其中值得一提的罗列如下。

模式编辑:Meow

如果没有弹钢琴的天赋,用 Emacs 的原生按键是非常痛苦的。如前所述, Meow 是非常轻量级的模式编辑,给苦于 evil 模式的人一个非常好的选择。以后我会写一篇关于它的使用总结,这里就不做展开了。

中文相关

在文本编辑中,中文处理起来比其它基于字母的语言麻烦很多,因此需要很多配置。

  • Emacs-rime ,中文输入
  • cns 分词。提供基于结巴分词的词语移动、删除功能
  • ace-pinyin 。用两个中文的拼音首字母来进行可见区域内的光标跳跃
  • unicad 。自动识别文件的编码,默认情况下, Emacs 打开 GBK 等格式时文件可能会乱码

笔记管理

我使用了三种笔记管理软件:

  • denote 。管理卢曼笔记
  • xeft 。管理一般意义上的笔记,其往往没有复用的价值,只提供后续查阅。比如软件使用方法的记录等, xeft 提供了非常高效的全文检索功能
  • org-journal 。管理日记,我可以用它来方便地对日记进行加密,以及基于日期范围的检索

检索

检索是个很大的话题, Emacs 中有非常丰富的插件来应对各种各样的场景,这里只做简单说明。

  • consult+orderless+vertico 三件套。 consult 已经足够覆盖大部分使用情形了,比如搜索文件夹、搜索 buffer ,对当前文件按行检索等等
  • rg/color-rg 。基于 ripgrep 的多文件搜索、替换,在批量处理文本时非常好用

Dired 文件管理

我此前在 ranger 和 dired 两者中徘徊了很久。它们都是非常好用高效的文件管理工具。 ranger 的优点是能进行多媒体文件的预览,而 dired 的优点则是 Emacs 。最后我选择了 dired ,因为 ranger 的预览功能限制于特定的 term 和 linux DM ,并且 preview 功能其实并不那么常用。

在 dired 中我可以方便地对文件进行批量操作,甚至借助于 wdired 我也可以像是编辑普通文本一样编辑文件目录,我还没有看到有其它软件能做到这种事情的。

Dired 已有的功能已经足够好用,唯一欠缺的是过滤功能,这一点可以通过 Dired-narrow 来实现。通过它,我可以很方便地根据关键词来过滤显示我想要的文件。

同样在以后我会专门写一篇文章来介绍 Dired 的各种常用操作及相应的使用场景。

结语

Emacs 上手真的非常难,但如果清楚自己的需求,并有目的性地去学习,那么将它作为日常使用的主力软件也并没有想象中的那么困难。对于我来说,写作是一种持续一生的活动,那么花点时间来学习一套可以终生使用的编辑环境是很划算的选择。很多商业编辑器来了又走,还没熟悉它们的操作,更酷炫的编辑器又会吸引你去尝试,被牵着鼻子走的结果是从来没有彻底熟悉过一种写作环境。更何况很多编辑器并没有那么深的内涵可供挖掘,而很多使用 Emacs 数十年的“老玩家”却仍能学会新的花招。

I love Emacs.