Emacs的小小说

一切故事都从写码开始。

编程的上古年代,真正的码工把计算机指令以穿孔的方式打在纸带上,然后喂给机器,等着它吐出结果。后来,IBM发明了高级一点的方法,用类似打字机的机械(keypunch)把人和机器懂得的代码同时打在一张张卡片上,一坨卡片集合起来放在盒子里也就成了一个程序。修改程序时就直接移动替换卡片。这个时候,编程处于操作物理介质的阶段,不仅是脑力活,那着实也是体力活。

六十年代,PDP系列的机器开始流行于世,从PDP-1开始便有一个编辑器TECO(Tape Editor and COrrector)。初期的TECO其实更像是一个纯粹的语法解释器,用户并不能用它直接编辑打有代码的纸带,而是要先把修改的过程用它特有的一套语言写成另外一个修正纸带,再同原始纸带一起喂给TECO,它解析修正纸带上的命令然后依次执行在原始纸带上,最后便吐出来一个正确的纸带。TECO提供的这套语言(或者说命令),从编辑的角度设计,看起来有点诡异,但却很实用,类似 b表示开始,c加参数表示移动,i表示插入等等之类,编辑在这里也就成了批量执行类似打patch的过程。这个时候,编程这个动作本身也是编程,这是多么纯的年代!

六十年代中期,代码的存储介质逐渐脱离了卡带,TECO也逐渐变成Text Editor and COrrector。 随着PDP-6发行的TECO-6,可以将文件的内容直接展示在终端上,语言的语法也变成了一个个真正的命令。编辑文件时,输入一个命令,然后按两下ESC,TECO将命令解析执行,刷新屏幕重新显示内容,修改的结果就实时展现了。这时,TECO终于有了点WYSIWYG(What You See Is What You Get)的模样,程序猿也总算可以在屏幕前坐下来,安静的敲敲打打了。

转世

哦呼呼,TECO走过了六零年代,进入了七零年代。在MIT的AI Lab里,用的机器已经是PDP-6,PDP-10,机器上跑的是ITS(Incompatible Timesharing System,叫这个名字完全是个hack传统,只因为它前面有个Compatible Timesharing System), 一群天才hacker,天高气爽时便写码消遣消遣。这个时候用的TECO其实更有点像Vi的样子,操作分为展示(display)和编辑(edit)两种模式,比如,5l就是向下移动5行,按下i之后直到ESC之间的输入认为是插入的内容,输入一行字符然后按两下ESC,输入就被当作命令依次执行(相当于Vi冒号之后执行命令)。这其实是把一些字符的特殊含义和ESC结合起来,根据当前的模式为输入找到对应的映射处理。当然,这种不同的处理方式让有些hacker觉得不爽,其中的一位,Carl Mikkelsen,便统一display和edit模式,为TECO增加了整合之后的real-time模式(也叫control-R模式),同时,Rici Liknaitski也初步实现了把一坨命令组装成在一起,然后绑定到一个键上。这时,control-R进入real-time模式之后,输入都解析成命令。普通字符表示输入它本身(self-inserting),control meta这些控制键则表示移动修改之类的操作(这也是他们第一次被用来编辑文件)。当real-time模式流行之后,人们自然有点乐不思蜀了。这个时候,我们的老大Richard Stallman终于出现了,他来到AI Lab后,优化了real-time模式并把它变成TECO的内置模式,在Rici Liknaitski的基础上为TECO增加了用户可以完全自定义的宏(也就是一坨命令)功能,同时可以绑定到任意键上。此时,天下终得一统,在TECO的眼里,一切输入皆是宏。

这个版本的TECO大受欢迎,能自定义更是正中那一群hacker的下怀,他们根据自己的需要和喜好实现一些自定义的宏,名字都以’MAC’或者’MACS’结尾来标识。可问题也来了,每个人都有自己的一套宏实现或键绑定,一时又天下大乱,一个人基本用不了另一个人的TECO,因为根本就不知道该按什么键。当时身为Lisp机器(Lisp  machine)维护员的Guy Steele(这是个真正通晓多国语言的程序猿,FP界的元老)因为要经常帮人们处理问题更是深受其害。于是,他准备要来收拾这个混乱局面。Steele游说四方,说服人们同意合并统一扩展的各种版本。其实很难一致的是某个功能要默认绑定到哪个键上,幸亏他是个程序猿不是打字员,选择了有记忆提示信息的绑定原则,让键位存在皆有理由。这样,我们在要转换大小写时才能立马想到Meta-l(lowercase)和Meta-u(uppercase)。Steele和Stallman老大一起规范统一了各种宏的版本,定义好一套默认的键位绑定,添加文档说明,然后,他们决定自立门户,一个叫EMACS的编辑器诞生了。

关于EMACS这个名字,简单粗暴的自然是Editing MACroS。Stallman老大也说过MACS前面用E是因为他想让EMACS可以有一个字符的简称,而E是当时ITS系统上还没有被用到的。当然,也可以和AI Lab附近的冰淇淋店Emack & Bolio’s搞点暧昧,其他的诸如Escape-Meta-Alt-Control-Shift这样的诡异版本,这里也有一坨。Emacs诞生之初,也就显现了它延续至今的设计原则:The Extensible, Customizable, Self-Documenting Display Editor。底层功能的细化设计为上层扩展提供了最大便利和可能,小到字符移动,大到文档渲染,Emacs都提供了丰富的扩展接口;配置的灵活性让扩展自由但不至于失控,其实扩展本身就是一种配置。这两个灵活性也让Emacs不再仅仅是一个文本编辑器(text editor),而是功能强大的文档处理器(word processer);为了让扩展得以香火继传,自描述的风格让代码即是文档。Emacs里的所有变量,命令,键位相关的帮助文档都是可以直接得到的,而这些其实都是直接从代码里抽取出来的(这跟Knuth老大的Literate programming倒是有相通之处)。

当世

起初,EMACS的底层是用PDP-10的汇编语言实现的,用户编写自定义宏所使用的仍然是TECO最开始的那套语言。为了提供更大的灵活性,Statllman老大为这套号称世界上最变态的语言添加了许多复杂功能。但这个语言从最开始就只是面向编辑器设计,而不是面向程序设计的。添加的功能越多,它就显的越诡异无比。当这个“as ugly as possible“的语言让老大崩溃掉的时候,他认识到继续使用它将是一条错误的道路,必须找到一个真正的程序设计语言作为EMACS扩展的开发选择。这个时候,已经有了一些变种的实现。Dan Weinreb 在Lisp机器上实现一个EINE(EINE is Not Emacs), Bernard Greenberg也实现了MacLisp的版本。这两个版本都是完全使用Lisp语言实现底层和宏的命令扩展,这给了Stallman老大重新设计EMACS一些启发。Lisp当时已经有了gc机制,通用实现已经不成问题,但除了在专用的Lisp机器上外,性能仍然是Lisp摆脱不了的软肋,而当时c在Unix上的优异表现吸引了老大的注意。于是,权衡三思,Stallman老大采取了折中策略,定下了新版EMACS的设计:c实现底层,Lisp实现扩展。此时已经是八十年代初,MIT AI Lab里的hack狂欢早已结束,为了自由理想,单枪匹马与商业的Symbolics苦撑了两年之后,Stallman老大也认识到补旧不如立新,着手开始他名垂后代的GNU项目,而新版的EMACS成了GNU项目的发轫之作。

其实,James Gosling于1981年已经在Unix上实现了Gosling Emacs,它的底层自然是Unix上天生的c语言,命令扩展使用的是一个语法类Lisp的MockLisp实现。Stallman老大参考了一些Gosling Emacs实现,但不纯正的Lisp实现还是相当不入老大的法眼,反正当时的Lisp也没有标准规范,一坨坨的方言漫天飞。老大按照严格的Lisp语义,完全重写了一个full-feature的Lisp版本,这也就是沿用至今的Elisp(Emacs Lisp)。起初Gosling Emacs也是作为自由软件自由免费地传播,当时Stallman老大也正在推行Emacs和谐(Emacs commune)运动,宣扬他的自由软件版权理想,二者之间开始还是很有默契的。但随着Gosling Emacs使用范围的扩大,1984年,Gosling声明自己已经没有能力继续维护下去,将其卖给了当时的商业软件公司Unipress。这个行为本是无可厚非,无非是代码版权的归属和发行方式的改变,但在Stallman老大眼里,软件代码是自由理想的载体,流传发行的方式有一层人类社会生存的哲学含义。Gosling所做相比过去的行为无异于叛徒犹大,完全是对信仰的亵渎。老大严辞藐视Gosling为懦夫,必将钉在历史耻辱柱上之类种种。但老大的行为总是是悲壮的,Gosling Emacs还是成为了一个商业软件,James Gosling后来也去了Sun,成就了他传世的Java伟业。

1985年,新版本的Emacs终于作为GNU Emacs第一次公开发行,版本号定为13。至于版本1到12是从来没有发行过的,因为当时开发版本一直使用1.xx的格式, 但在1.12之后,他认为GNU Emacs主版本号1是永远不会变的,随之便把它去掉了。后来的发行版本也就从13开始延续下来,一直到现在。Vesion 15的GNU Emacs已经可以完美的在Unix系列上运行,它完全的Lisp功能实现与自由免费的传播使用,自然比商业的Goling Emacs(Unipress Emacs)更有吸引力。但这时麻烦也来了,GNU Emacs在显示部分使用的一些Gosling Emacs代码,现在引来了商业版权上面的冲突。这让Stallman老大很恼火,他首先声明,使用的代码是通过Fen Labalme(当时和James Goling一起开发Gosling Emacs,有Gosling授给的代码使用权),完全是合法的。后来,事情当然不会如现在此类事情那样无边的纠缠下去,处理类似扯皮问题,老一辈们有着一贯简单直接的处理方法:你说代码是你的,我不用就好了。Stallman老大直接声明I have decided to replace the Gosling code in GNU Emacs, even though I still believe Fen and I have permission to distribute that code 。。。I expect to have the job done by the weekend。。。”。一个星期之后,老大重写了有争议的代码实现,Version 16以后的GNU Emacs成了真正的Gosling-free版本。但这件事让Stallman老大确实很受伤,认识到GNU软件必须要有一个自己的版权来保护。向来不走寻常路的老大也就想到了浓重hack气味的“copyleft”,GNU Emacs的“the GNU Emacs copying permission notice”也成了它第一次实验性的实现。发展到后来一段时间,每个GNU的软件都有自己的一个版权,类似Emacs General Public LicenseNethack General Public License。1989年1月,终于演化出了第一个统一的版权:the General Pulic License version 1(GPL V1)。

1991年,GNU Emacs已经到了version 19。当时在Lucid公司,一帮家伙要把GNU Emacs整合成一个C++的IDE,为了满足需要,他们做了很做修改,添加了许多新功能,甚至超过了GNU Emacs官方的版本更新速度。最后,他们不准备跟随官方的脚步了,于是一个新的Emacs 变种Lucid Emacs出现了。当然,Lucid这个很容易引起版权问题的名字后来变成了熟知的XEmacs,一路发展,成了除GNU Emacs外最流行的Emacs版本。另外的主流操作系统平台上也从GNU Emacs上衍变出了相应的版本,MS Windows的Meadow, Apple Macintosh上的Aquamacs

再扯下GNU Emacs的启动画面,这是在2000年的Version21中加入的。老一辈们还是很文艺的,Emacs后面的牛型字其实是“GNU”的飘渺写法,最初是Gnus(完美结合在Emacs里)的logo。前面的”Emacs”最初版本要虚幻很多,只是没能讨得Stallman老大欢心,才改成了现在的样子(这里有logo的详细历史溯源)。

现世

时到如今,在Emacs WikiEmacs Lisp List上已经有了成千上万的变态不变态的扩展,满足各种变态不变态的需要(这里有个Is there anything Emacs can not do的狂扯讨论)。“Emacs is my operating system, and Linux is its device driver”的古语也不是没有原因的,Vi一族经常说的“Emacs is a nice operating system, but lacks agood editor”也是可以理解的。但高配置性让Emacs虽然庞大但并不臃肿,贤惠的她是,你不要的,她不会给你;你要的,她肯定是可以给你的。Emacs和Vi成为*nix程序猿的的区分标志(虽然Emacs里也有个vi mode的),但是,Stallman老大认为这还是不够的(他自己是从来没有去用过Vi的),他把那些从未用过Emacs的人称为Emacs Virgins,而带领这些人走出这种尴尬境地是Emacsers的神圣使命(blessed act)。老大这番话很有压力的,我辈还需努力了。

一切故事还在写码中继续。当然,一切也不只在写码中继续。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值