编辑器战争:vim编辑的历史与“编辑哲学”

写这个题目的时候,我是有点慌的。用已故的南京大学历史系教授高华先生的话来说,这个题目太大了,写什么“哲学”,“论劳动”这种又大又空的题目,只能由最大的那个Boss来写,比如,由vim的作者来写。我这种用户,只能写点具体的小题目,比如“关于我小区街道卫生情况的处理请求”。要是搁在以前,某人不顾大Boss,写什么“论劳动”,还脱稿演讲,那是要受批斗的,是非常非常严重的僭越。我今天要讲的这个vim编辑器呢,是我长期以来使用的,用了快20年了,我就讲一点我的使用心得吧,希望各位大Boss不要批斗我。

先来说历史吧,还是短话长说。在很久很久以前,多久呢?久到电脑刚兴起的时候,那时候,没有现在的显示器,那时候的显示设备是电传打字机(teleprinter),我也没用过,也没见过,但是大家可以把它想像成一台打字机,只是这个打字机可以通过电线连接到电脑上,当成你的输入输出设备。输入的时候,你就在这台打字机上打字,电脑会将返回的结果,通过你的打字机一行一行打印在纸上。当年用电脑非常费纸,如果你要编辑一个文件,只能一行一行的编辑,那时候,是不可能有现在的文本编辑器的,你能做的事情,就是在你打的这一行上做文章,比如要删一个单词什么的,只能在这一行上搞,那时候的编辑器,叫行编辑器,line editor。

早期的行编辑器软件有ed,qed等等。ed的意思是editor,qed的意思是quick editor。当我快40岁的那一年,我去医院做了个体检,体检结果上就写着ed,我当时觉得碰到了知音,因为做个体检,竟然有人知道我是程序员,竟然知道编辑器的始祖ed。我就很热情的跟护士打招呼,我说没想到我接触了这么多程序员,都没有一个人知道ed的,竟然有一个护士知道ed,真是太有缘分了,加个微信吧!她说,你都ed了,加微信干啥啊?我说你怎么知道这个编辑器的?她说,啥编辑器啊,ED是Erectile Dysfunction的缩写,啥也不懂,赶紧走。后来,我回家查了一个字典,一直积极治疗到现在,也没好。就跟编辑器一样,由ed,变成了qucik ed….更快的ed…..也不知道这些人起名字的时候,能不能走点心,不能伤害别人的自尊,一会儿叫ed,一会儿叫qed的,受不了!

随着时代的发展,有了显示器,终于可以显示一屏幕的内容了,虽然只能显示25行,但是比显示1行要进步了25倍呢。如果这时候,你还是用行编辑器,是不是有点说不过去啊?于是,基于ed的另一个扩展版本,editor EXtended,简称Ex,这个也是一个行编辑器,作者是Bill Joy,就是后来建立Sun公司的那个家伙。我应该感谢他,因为我走出校门后的的第一份工作就是在Sun给人打下手,用着他做的Sun Spark服务器,我的小领导,给我了一台电脑,让我联上Sun的服务器,然后用Vi写代码,我花了一个小时才搞清楚,如何退出Vim编辑器。这个Vi编辑器,也是是Bill Joy做的,基于刚刚提到的Ex编辑器。

Vi是什么意思?Visual的前两个字母。其来历是,当年的Ex编辑器只能一行一行的来,这时候突然有了一个可以同时编辑25行的显示器,你是不是要把Ex编辑器改进一下,让它能编辑25行呢?Vi并不是重新写的代码,而是将Ex这个行编辑器,修改了代码,加了一个模式叫Visual模式,让Ex可以全屏来修改。当时Bill Joy还是个学生,他花了一点时间修改,没想到在1978年12月的时候,这哥们写代码的机器坏了,那时候也没有备份,把他的代码给搞丢了,只弄回来一部分,他实在是没心情重写,就去旅游了,当年的Vi模式还没有做完,只做了个半成品,就丢下了。那时候Stanford的学生也没改进,就先用这个半成品吧,反正可以编辑整个屏幕的内容了。等到放假回来,Bill Joy惊奇的发现,大家已经习惯了这个半成器,于是他就没再做剩下的那部分,先用着得了。再后来,Unix把vi集成了进去,大家就习惯了,又不是不能用,习惯了以后,反而觉得这样也挺好。

所以,一直到现在为止,Vi/Vim/neovim都是一个模式编辑器,有好几种模式让你选择。最初,vi只是ex这个行编辑器的一种模式,当然了,现在也可以执行ex的命令。在Normal模式下输入冒号,就可以进入ex模式了,现在叫命令行模式。其实在最初的时候,命令行模式是祖宗。

到后来,很多的人对Vi进行了改进,其中一个集大成者是Vim,Vi IMproved,作者的名字叫Bram Moolenaar。这个人现在应该在Google工作,他在YouTube上有教人使用Vim,直接搜他的名字就是了,那个可以称之为“Vim的哲学”,但是他自己起的名字叫《7 Habits For Effective Text Editing 2.0》,翻译成中文叫《高效编辑的七个习惯》。我只是一个用了几年的SB,就起个题目叫《Vim编辑的哲学》,真是有点不知道天高地厚。太僭赿了!

接下来,我就来讲Vim使用的哲学了,哈哈。

抛开具体操作不谈,我觉得只要你熟悉的编辑器如果能很顺畅的进行如下操作,根本就不用去尝试Vim。我先声明一下,我对除Vim以外的编辑器都不太了解,可能对微软自带的那个文本编辑器了解的第二多。我知道Emacs那个编辑器也可以做和Vim一样的操作,只是实现的方法不同,至于Visual Studio Code,我很希望大家能告诉我是不是很容易实现这些操作。

文本编辑器,就是用来编辑文本的。假设我们是领导,一般会这样说:小李,把这段话给我删了。我们有几种方法来做这件事,最简单的方法就是,用鼠标选定这一段,然后删掉。还有有一种最笨的方法是按住删除键,一直等到删完为止。在Vim中,可以只按两三个键就能完成删除一段,删除一个单词……对Vim来说,文本是被当作对象的,删除一段文字,删除一段代码等等,大部分常用的操作都是只需要3个键以内。而且vim还可以定制按键,只要超过3个按键的操作,我就自己绑定一个快捷键,你可以会问,如果你忘了怎么办?不会的,Vim有非常多的插件,安装一个叫whichkey的插件,就帮助你记忆了。

其实用久了,这种快捷键根本不用记,会很自然的打出来。如果你不用vim,但是你用五笔的话,应该能有感觉,像我是用五笔输入法的,但是仅限于在键盘上使用五笔,如果你让我分解一个字,我得想半天,但是我就是会在电脑上打字。在手机上,我用拼音输入法,因为我根本记不住五笔的词根,这一点对不会五笔的人来说可能有点意外,如果会五笔的人,应该知道我没有说谎。我看过不少人说什么打五笔要会写写字才能打,这纯粹也是YY的,比如尴尬这个词,我不会写,我仅仅是知道在键盘上敲dndn,他就会出来这两个字,纯粹的肌肉记忆,不经过大脑的。Vim也是如此,我相信其它的编辑器也是如此。用来用去的,也就那几个常用操作,只有切换到另外一个编译器上,你才知道原来是这么不顺手啊。

我用vim主要是用来写软件,我并不是所有的文字编辑都是用vim来处理,比如,中文就非常的难以用vim来处理。我来讲一下原因,上两期电台里,如果你是在喜马拉雅的听众,可能会觉得,哪有上两期啊?是的,已经被删了,现在是先审后上架,以前是先上架再说,言论自由,任重道远呢。上两期讲的是香农,香农有个理论恰好可以用在这里,香农认为,英文有27个字母,空格也算是一个字母。很可惜的是,中文没有空格,因此,很难对词进行像英语那样的操作。比如,我输入的中文是“二十四口交换机”,如果在英语中,很难有歧意。翻译成英语可能是“Twenty-four port switch”,如果我要删掉的话,按个dw,然后再按两下点号就删掉了。但是由于中文的特殊性,只能一个字一个字的删,因为在英语中,有空格可以分割词语,在中文中,词语没法分割,或者说分割的非常不完美,像这个“二十四口交换机”,如果有种方法可以完美的识别出是一个词来,那就好了,但是现实是做不到,我试过好几种方法,都非常不完美,有的将其分割成 二十四,有的把二十当成一个词,有的把口交当成一个词,而实际情况是这个交是交换机,二十四口交换机,所以,我不建议大家使用vim来处理中文,很难搞的。

有人也许会说,他在使用visual studio code的时候,使用一个模拟vim的插件。我也用过,但是我觉得,既然你都要模拟vim了,为什么不直接用vim么?vim比起visual studio code以及emacs来,速度要快很多。我不是引起战争,我用visual studio code比较少,但是我没吃过猪肉,也是见过猪跑的,有不少同事抱怨visual studio code只要插件一装,那速度就会越来越慢,这种情况在vim下,基本上是不存在的。这就是我所说的与其在visual studio code下用模拟vim的插件,不如在vim下配置成visual studio code上你离不开的功能。vim的插件也是超级多,当然不用自己动手了,有好几个插件管理器。开源就这个样子,你都可以给插件管理器再写个插件管理器了。

vim还有个优点是,万年不变,只要你习惯了你那套配置,你管它怎么更新呢,反正我就是不变。目前我在使用的是vim的新时代版,叫neovim,用的插件管理器叫packer。

因为我年龄比较大了,编辑器战争中,只有vim和emacs一直在,至于想挑战这两个的,在我的记忆中有ultraedit,当年ultraedit非常非常的火,经常问的一个问题是,ultraedit能不能替代vim,或者ultraedit能不能替代emacs。后来elcipse横空出世,然后eclipse能不能替代vim或emacs的帖子天天占据以前中文程序员网站现在都不知道算不算程序员网站的CSND的首页,一打开就是eclipse如何如何NB。

后来eclipse的下场大家也知道了,不但没有取代vim和emacs,反而被JetBrains家的那些IDE给锤了。再后来,eclipse当年的核心开发团队被微软搞了去,开发了visual studio code,现在,大家开始讨论的重点是visual studio code能不能取代vim或emacs。说实在的,有竞争是好的,但是visual studio code团队当年开发eclipse的时候也是这样,有一个简单明了的开始,后来越来越臃肿,插件的质量越来越拉,最后就不行了。

我可以解释一下为什么会这样。虽然有很多人彩虹屁吹vim和emacs这两个软件,说什么功能强大,我觉得这些都是次要的,这两个软件并没有什么特别出彩的强大功能是别的软件做不了的。核心很简单:这两个软件是程序员写给程序员用的。不是公司写给程序员的,是程序员不拿报酬,自己写给自己的。其它的软件,可能背后有像IBM,Microsoft这样的金主,但是归根到底,这是公司写给程序员用的。可能大家觉得这有什么关系,不都是免费的么?我觉得关系很大,当年IBM给钱做eclipse,原因是想统一Java编程的市场,给程序员做一个IDE出来,是其手段。所以到后来eclipse不行了,大家就放弃了它,没有核心来做这个东西。这个IDE是以IBM为核心做起来的,IBM的钱不到位了,也就散了。

后来这个团队被微软整体搞过来开发Visual Studio Code。搞这个VSC的人是非常出名的,大家应该知道有本书叫《设计模式》,这本书的作者有四个,第一作者叫Erich Gamma,就是他。他搞了Eclipse这个曾经长期排名第一的IDE,现在应该不大行了,我很少见有人还用这个IDE,当年真是第一啊。

因为我第一份正式工作是在SUN公司里给人倒水,扫地,按摩,所以,我用的是SUN公司出的NetBeans,当年NetBeans也还可以,但是比起这个Eclipse那是真不行。Eclipse的设计思想是:一切皆插件。这个思想跟现在的VSC是一样的,核心很少,其它所有的东西都是插件,其错误也几乎是一样的,当你安装了一个技术水平不怎么样的插件的时候,那就会变的很慢,当然了,VSC比Eclipse要强,VSC只是变得很慢,至少不会崩,以前Eclipse的设计有缺陷,插件能把Eclipse给搞崩溃。

Erich Gamma老师从Eclipse离开后,Eclipse实在是烂尾了,用东汉名士徐孺的一句来说:大树将颠,非一绳所维。大树将要倒了,再绑一根绳子,那是拉不住的。这个徐孺就是《滕王阁序》里那句““物华天宝,龙光射牛斗之墟;人杰地灵,徐孺下陈蕃之榻。”Erich Gamma老师的团队有十来个人,他们搞了一个Eclipse 2.0,当然了,名字要换一下,叫monaco-editor,从Eclipse跌倒,就从monaco-editor那里爬起来,继续自己的事业。

这不是我瞎编的,他在YouTube上有介绍,大家可以自己去看,名字叫《The journey of visual studio code: Building an App Using JS/TypeScript, Node, Electron & 100 OSS Components》,介绍他如何在VSC上取得 巨大成功的。

最初,并没有什么人用这个玩意,直到微软决定要强推Desktop IDE,Erich Gamma将最初的基于Broswer的IDE转变为Desktop的IDE。说句题外话,微软收购了github之后,github现在又推出了基于Broswer的IDE,真是不知道将来会怎么样。但是我觉得吧,VSC要做出自己的改变,否则,金主要是注意力变了,程序员的风向一变,Eclipse的前车之鉴,历历在目啊。

现在github已经在推基于浏览器的IDE了,这样,程序员总是有新的东西学习,以前的投入又要推倒重来一遍。如果你是学vim或者emacs的老古董的话,你想用本地也行,想远程用也没问题,总之,他就是能用,你也不用担心在你的职业生涯里这两个编辑器会被淘汰,不但不会被淘汰,现在新功能加的还挺快的。

真的推荐大家用下这种程序员给程序员写的软件,而不是公司雇一批程序员,为了市场做出的软件。挖个坑,下一期我再讲讲vim和其它一些软件的功能。比如什么语法高亮啊,代码补全啊,其实呢,这都不是编辑器的功劳,而是特定语言服务器的功能。以Java为例,不管你是用eclipse,还是vsc,还是emacs,还是vim,用的其实是一个东西,这些编辑器都是实现了LSP协议。像语法高亮什么的,都是调用TreeSitter,这些很多人口中特别NB的功能,压根就是一个独立的开源项目。你只要配置好了,背后的原理是一样的。包括要交钱的很多功能,在vim中都有插件给你用。只是vim要自己动手配置一下而已。

VSC的用户,绝大部分是捣鼓别人写的插件,VIM的用户,用久了都是自己写配置文件,自己用着还是挺顺手的。现在neovim已经支持用lua来写插件了,比较简单。

这个下一期再说。

5 1 投票
文章评分
订阅评论
提醒

7 评论
最旧
最新 最多投票
内联反馈
查看所有评论
看戏
9 天 前

Esc的默认绑定是ctrl + c吧

姜川
7 天 前

CSDN写成CSND了

Zs
6 天 前

希望栋哥出个《Vim从入门到放弃》视频

一乐
2 天 前

栋哥说的我们要永远支持!!!哈哈哈。我就是用的那个JetBrains PyCharm ,栋哥能不能给我这种业余特别喜欢鼓捣的人一些建议,学学什么语言?目前会一点python,用django写个博客。

一乐
回复给  一乐
2 天 前

发现我问的问题有点太傻了。。。哈哈哈。。。栋哥不用回了。。。我自己都不知道想干嘛。。。过后抽空继续深入学习python吧 哈哈

懒懒龙
1 天 前

栋哥是真喜欢研究历史啊,又涨知识了

乌冬乌冬
10 小时 前

期待下期vim内容!
很喜欢!

7
0
希望看到您的想法,请您发表评论x