我所认识的一些编辑器
缘起
最近这几天又回到 emacs 了,之前是用过一段时间的 vscode ,因为确实有些无法替代的功能。另一方面,随着 lsp 的发展, emacs 中的编程体验也跟上来了。试了一下,感觉没有继续使用 vscode 的动力了,正好借这个机会回顾一下我使用各种编辑器的历程。
拓荒,Linux 年代
因为接触电脑比较晚,也因为是学计算机的,所以当时一开始学就开始用 linux 。记得那时从图书馆找到一本书,从头看到尾看完了各种 linux 的命令,就开始使用了。也是赶上了好时代,南非首富开发了 ubuntu 这个发行版,并且在世界范围内免费送光盘,每发布一个新版本,就可以申请一批,而 ubuntu 当时不论是在安装升级,或者桌面软件领域都是比较活跃的。在这个过程中认识了两个编辑器,一个叫 emacs 一个叫 vim ,感觉上 vim 比较靠拢终端,而 emacs 则比较靠 gui 。当时的 emacs 还是 21 ,对中文支持并不是很好,还有个 xemacs 。不过也因为比较习惯 windows 那种打开就能编辑的方式,所以一直对 vim 这种需要各种模式和命令来操作的方式不感兴趣,就开始用起了 emacs 。那时, emacs 已经有 23 的 cvs 版本,可以比较方便的支持 xft 字体,不需要各种折腾中文字体就能方便的显示。虽然需要自己从源码编译,使用起来也不复杂,所以就用了起来。网上流传很广的王垠的文章的传教,所以就开始入了 emacs 教了。当然那个过程中,受到王垠文章的影响,也开始了解了很多稀奇古怪的玩意,例如 fvwm , tex 等。 linux 发行版也折腾过不少,包括 redhat, fedora, mandriva,suse 甚至还有 gentoo ,当然用的最多的还是 ubuntu 。后来随着越来越熟练,差不多可以一直在 linux 下完成日常需求了。就一直边折腾边使用着 emacs ,期间用过 gnus 看 nntp 邮件组,收取各种邮件, erc 来聊天等等比较猎奇的功能。
后来认识了 emacs 中的大杀器 org ,了解了他的 publish 系统,有时需要做报告,就直接用 org 写一个文件,然后 C-c C-c 几下,结合 tex ,直接生成基于 beamer 的 pdf 。写一些其他的文档,也都是通过 orgmode 写成文档,然后输出成 latex 。但是 emacs 问题是对一些编程语言支持不好,就比如 c 语言,那体验真是被 vs 拉开好远。只有一些基于各种 TAGS 的一些跳转和导航支持,包括后来的 cscope , xrefactory ,以及雄心勃勃的 semantic/cedet 系列,体验都比较差强人意。不过对于各种编辑器,这个是共同的毛病,智能补全都不怎么在行,做得好点的就是集成各种编译器的 IDE 。
windows 上的编辑器
后来,主要的工作环境变成了 windows , windows 上的 emacs 表现比 linux 下面的逊色不少。虽然强忍着使用,也经常出各种各样的问题。我记得好几个版本莫名其妙的就闪退了,所以就在 windows 下面寻找顺手一点的编辑器。那时发现 notepad++ 还不错,首先对各种语言的语法高亮之类的支持还行。用过一段时间,后来听说好多人一直说 mac 下面有个 textmate 的神编辑软件非常好,但是一直没有见识过。后来就冒出来一个 sublime text ,据说和 textmate 神似,特别是他的插件和 snippet 系统,这个插件系统是基于 python 语言。但是这个编辑器特别诡异,不支持中文,需要专门装一个插件,设置编码后才能显示。这也就罢了,即使设置后能显示了,字节之类的还是有问题,一个退格删除经常会删除半个文字,变成一个乱码,是在不堪一用。随着时间的发展, windows 上的 emacs 也不那么烂了,又慢慢开始使用了,结合 org-mode 的时间管理系统,整理 aganda 并通过 dropbox 在多端同步,也可以正常使用了。做其他编程工作是就用专门的 ide ,例如做 andorid 开发,直接使用 android-studio , c 语言之类的开发,直接安装 vs 的社区版本在那, python 之类的脚本开发,配合 rope , elpy 等插件,用 emacs 体验已经不错了。
然后听到一个大新闻,说 vs 开源了,可以跨平台,很多个人和媒体都在那转这个新闻。我觉得有些诡异,去看了下原文,发现不过是推出了一个 vscode ,而且主要是面向前端的,基于浏览器技术,只对 javascript 之类的语言有不错的支持。几乎同时, github 那边也开源了他们编辑器,就是 atom ,同样基于浏览器技术的。当时这俩出来的时候我都试了试,因为不写前端,发现没什么优点,于是没怎么使用。
vscode 时代
后来突然的一天,又想起来 vscode ,浏览了一下官网,发现支持的语言挺丰富了。于是又下来试了试,发现他的配置文件并不是各种勾选,而是一个直白的 json 文件,而且也有一个类似 emacs 的命令接口,于是绑定了一套 emacs 快捷键,开始使用了起来。惊奇的发现, python 语言竟然几乎是开箱就能用,不需要什么配置,而且更加难得的是,流畅性很好,还有一个统一的调试框架,用起来非常方便,再也不需要 python 里通过 import pdb 来 debug 了。就开始用了起来,期间也考察了一下 atom ,启动速度太慢,就放弃了。至于 notepad++ ,回头一看,这个默认配色实在是丑的不能忍。同时发现 vscode 具有较好的跨平台特性,在其他平台上表现都还不错,相关的插件生态也发展起来了,例如 c/c++ 开发,配置之后也挺好用的。所以就萌发了使用 vscode 来替换 emacs 的想法。
首当其冲的两个需求,一个是 org mode ,一个是 latex 编辑。考察了一圈, org 基本没啥指望了,只能支持最简单的文本高亮,复杂一点的功能都无法实现,更别说时间管理,格式输出和 publish 功能了,更为逆天的 org-babel 更是连影子都没有。所以即使用着 vscode ,需要写文档的时候还需要 emacs 来支持。 latex 编辑, vscode 里有个还凑活用的插件,但是体验和 auctex+cdlatex+preview 这个工具链也差不少,例如 emacs 里面的快捷输入可以做到根据当前环境实现不同的功能,同样的一个按键,在数学公式环境下和在普通文本下面替换的内容完全不一样。再结合 emacs 里面的 face 的设置,可以把很多特性一目了然的显示出来, vscode 完全无法实现。至于更加神奇的公式预览,以及选中 region 实现部分预览而不是全文编译,则是任何其他编辑器都无法实现的功能。
殊途同归
其实 vscode 应该是从 emacs 学到了不少东西的,包括文本化的配置(这个他们最近好像改了),插件生态,以及命令模式等。同时, emacs 生态也在改变,例如 lsp ,虽然是微软搞出来的,但是对整个轻量级编辑器是革命性的增强,各种语言会打包实现服务端,每个编辑器只需要一个统一的客户端就能够实现各种语言的代码补全,跳转等工作。 emacs 由于自由的特性,跟进非常快。再比如同时出来的 dap-mode ,实际上类似 vscode 中的那个统一的调试框架,其背后也是一套 dap 协议。 emacs 里的 magit ,比其他好多的图形化的 git 客户端高明不少。我一直很害怕这些客户端,不知道他们偷偷干了啥,简单的一般就直接命令行 git 了。而 magit 在命令行和界面之间做了一个非常好的平衡。说到编辑, vscode 的那个多行模式(列编辑)简直傻到了一定地步,需要按键加上鼠标去选中,然后选中了会进入一个奇怪的状态,经常操作不小心就会编辑错。
所以,虽然 emacs 依然有学习曲线陡峭的问题,但是在编辑上面确实有些其他编辑器无法替代的功能,一旦习惯了对应功能,在其他编辑器上找不到就会非常难受。与其在那难受用着一些半成品,还不如回到 emacs 来好好享受。同时因为开放和自由的特性,任何其他编辑器中好的功能都可以方便的搬到 emacs 中,所以 emacs 确实无愧“神之编辑器”的称号。