缘起

最近这几天又回到 Emacs 了,之前是用过一段时间的 vscode,因为实在是有些无法替代的功能,另一方面,随着 lsp 的发展,emacs 里面的一些编程体验也跟上来了。试了一下,感觉没有继续使用 vscode 的动力了,正好借这个机会回顾一下使用各种编辑器的一些历程。

拓荒,Linux 年代

因为接触电脑比较晚,当然又因为是学计算机的,所以当时一开始学就开始用 linux,记得找了一本书,从头看到尾看完了各种 linux 的命令,就开始了。于是在这个过程中认识了两个编辑器,一个叫 emacs 一个叫 vim,感觉就是 vim 和终端比较靠拢,而 emacs 比较靠 gui。当时的 emacs 还是 21,还有个 xemacs。不过也是因为比较习惯 windows 那种打开就编辑,所以一直对 vim 不感冒,就开始弄起了 emacs,那个时代,emacs 已经有 23 的 cvs 版本,可以比较方便的支持 xft 字体,不需要各种折腾中文显示了,也可以编译使用了,所以就用了起来。再加上,网上流传很广的王垠的文章和传教,所以就开始入了 emacs 教了。当然那个过程中,也开始了解了很多稀奇古怪的玩意,例如 fvwm,tex 等。linux 发行版也折腾过不少。后来的时候,差不多所有的操作都可以在 linux 下面完成了。也一直用着 emacs。期间用过 gnus 收取各种邮件,erc 来聊天等。

后来认识了 emacs 里面的大杀器 org,那个时候有些时候需要做报告,就直接用 org 写一个文件,然后 C-c C-c 几下,直接生成 beamer 的 pdf 出来,当然,写一些资料都是通过 orgmode 写成文档,然后输出成 latex 的,很长一段时间之类都不直接写 latex 文件,org,想生成啥就是啥。但是 emacs 问题是上面一些编程的支持不好,就比如 c 语言,那体验真是被 vs 拉开好远。要么就是基于各种 TAGS 的一些支持,后来有一些 cscope,xrefactory 什么的,还有雄心勃勃的 semantic/cedet 系列,但是体验都比较差强人意。不过那个时代这个是通病,各种编辑器的智能补全都不怎么行。要做到这个就是 IDE 的范围了。

windows 上的编辑器

后来,主要的工作环境变成了 windows,windows 上面的 emacs 可以比 linux 下面的逊色不少,只能捏着鼻子用着,还出各种各样的问题,我记忆记得好几个版本莫名其妙的就闪退了,所以就在 windows 下面寻找顺手一点的编辑器,当然 notepad 是死开的。那个时候 notepad++ 还不错,各种语言的语法高亮之类的支持的不错。用过一段时间,后来听说好多人一直说 mac 下面有个 textmate 的神编辑软件多好多好,但是一直没有见识过,后来就冒出来一个 sublime text,也设计了插件系统,还是基于 python 的,但是这个编辑器特别诡异,不支持中文,要专门装一个插件,设置一个编码,这也就罢了,然后即使设置了能显示了,好像字节什么的还是有问题。随着时间的发展,windows 上面的 emacs 也不那么烂了,所以也慢慢开始用着了,org 里面的一些 aganda 什么的,通过 droopbox 同步一下,windows 下面也可以好好使用了。其他编程工作就用专门的 ide 了,例如 andorid 开发,就直接使用 android-studio,c 之类的开发,反正 vs 也有社区版本在那,python 之类的脚本开发,用 emacs 也还凑活。

然后大新闻来了,我记得是说 vs 开源了,可以跨平台了,很多人都在那转这个新闻,我去看了下原文,发现不过是出来了一个 vscode,而且当时主要是面向前端的,基于浏览器技术,只对 javascript 之类的有不错的支持。几乎同时,github 那边也说开源了他们编辑器,就是 atom,也是基于浏览器技术的。当时这俩出来的时候我也试了试,因为不写前端,发现没什么用处,还是守着 emacs+各种大型 ide 吧。

vscode 时代

后面突然有一天,又想起来 vscode,看了一下,发现支持的语言竟然挺多了。于是又下来试了试,有意思的是,发现他的配置文件不是各种勾选,而是直接配置成文本的,而且也有一个类似 emacs 的命令窗口,于是绑定了一套 emacs 快捷键,试了试。惊奇的发现,他的 python 语言竟然几乎是开箱就能用,不需要什么配置,而且更加难得的是,流畅性很好,还有一个统一的调试和 debug 框架,用起来非常方便,再也不需要 python 里面 import pdb 那种了。就开始用了起来,期间也考察了一下 atom,启动速度太慢,就放弃了。至于 notepad++,回头一看,这个默认配色实在是丑的不能忍。而且赫然发现 vscode 在其他平台上表现都还不错,而且相关的插件生态也发展起来了,例如相关的 c/c++,配置一下之后也挺好用的。所以就萌发了使用 vscode 来替换 emacs 的想法。

首当其中的两个需求,一个是 org mode,一个是 latex 编辑,org 那个考察了一圈,基本没啥指望了。只能支持最简单的文本高亮。复杂一点的功能都无法实现,更别说 org 最突出的时间管理,各种格式输出和 publish 功能了, 更为逆天的 org-babel 就别想了,所以即使用着 vscode,需要写文档的时候还是需要 emacs 来支持。latex 编辑,vscode 里面有个还凑活用的插件,但是体验和 auctex+cdlatex+preview 这个工具链也差不少,例如 emacs 里面的快捷输入可以做到认当前环境,而不是简单的替换,同样的一个按键,在数学公式环境下和在普通文本下面替换的内容完全不一样,再加上 emacs 里面的 face 的设置,可以把很多东西一目了然的显示出来,vscode 也是无法实现的。至于最神奇的公式预览,以及选中 region 的部分预览而不是全文编译,其他编辑器更加难以望其项背了。

殊途同归

其实 vscode 应该是从 emacs 学到了不少东西的,包括文本化的配置(这个他们最近好像改了),插件生态,以及命令模式等。但是同时,emacs 生态也在改变,例如 lsp,虽然也是微软搞出来的,但是这个对整个轻量级编辑器是革命性的,只要实现了对应的服务端,每个编辑器只要有一个统一的客户端就能够实现各种语言的不全,跳转等工作。emacs 也是跟进很快的。再例如同时出来的 dap-mode,实际上类似 vscode 里面的那个统一的调试框架。实现之后也能获得非常好的体验。还有 emacs 里面的 magit,比其他好多的图形化的 git 客户端高明不少,我一直很害怕这些客户端,不知道他们偷偷干了啥,简单的一般就直接命令行 git 了。而 magit 在命令行和界面之间做了一个非常好的平衡。说到编辑方面,vscode 的那个多行模式(列编辑)简直傻到了一定地步,需要按键加上鼠标去选中,然后选中了会进入一个奇怪的状态,经常操作不小心就会编辑错。

所以,虽然 emacs 还是有学习曲线陡峭的问题,但是在编辑上面确实有些其他编辑器无法替代的功能,一旦习惯了这个功能,在其他编辑器上找不到就会非常难受。与其在那难受用着一些半成品,还不如回到 emacs 来好好享受。