`
idning
  • 浏览: 138859 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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)。老大这番话很有压力的,我辈还需努力了。

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

分享到:
评论

相关推荐

    三本emacs书籍:生存于emacs+生活于emacs+emacs手册

    Emacs是一款强大的文本编辑器,深受程序员和高级用户喜爱,因其高度可定制性和丰富的扩展功能而闻名。这个压缩包包含了三本关于Emacs的重要书籍,旨在帮助用户从初识到熟练掌握这款工具。 《Survive in Emacs》是...

    emacs 24.5 for windows

    Emacs 24.5是针对Windows平台的版本,它是一款功能极其强大的文本编辑器,被誉为"神一样的编辑器"。这款编辑器以其高度可定制性、丰富的功能和开源特性深受程序员、作家以及任何需要处理文本的人士喜爱。在Emacs的...

    emacs用户手册(中文版).pdf

    ### Emacs用户手册中文版知识点概览 #### 一、Emacs简介与发展史 - **GNU与Emacs**:Emacs是GNU项目的一部分,由Richard Stallman于1975年在MIT创立的Free Software Foundation (FSF)发起。GNU旨在创建一个完全...

    Emacs User 's Guide中文版电子书

    GNU Emacs 是什麽 GNU EMACS 的特质 Emacs 的线上辅助说明 Emacs 的基本知识 Emacs 的自学教材 Ctrl-h 的用法 Emacs 的 info 使用说明 Emacs 的整合环境 如何在 Emacs 中执行 Shell 的指令 有关目录的编辑...

    [emacs].emacs

    标题 "[emacs].emacs" 暗示我们正在讨论的是 Emacs 配置文件,这是一个非常重要的文本编辑器的个性化设置。Emacs 是一个高度可定制的、功能强大的编辑器,广泛用于编写代码、文档等,尤其在程序员和系统管理员中非常...

    Emacs使用详解,Emacs使用详解

    ### Emacs使用详解 #### 一、Emacs简介 Emacs是一种功能极其强大的文本编辑器,在Unix和类Unix系统(如Linux)中广泛使用。对于熟悉它的用户来说,Emacs不仅是一个简单的文本编辑器,更是一个完整的开发环境。由于...

    Survive in Emacs(Emacs生存指南).7z

    《Survive in Emacs》是为初学者准备的一份详尽的Emacs编辑器入门指南,旨在帮助用户快速熟悉并掌握这款强大的开源文本编辑器。Emacs不仅是一个编辑器,更是一个功能丰富的集成开发环境(IDE),它提供了丰富的...

    linux下emacs安装

    在Linux环境中,Emacs是一款非常强大的文本编辑器,深受程序员和系统管理员的喜爱。它提供了丰富的功能,包括代码编辑、文档编写、邮件处理等。本文将详细介绍如何在Linux系统下安装Emacs,以及如何利用提供的安装包...

    emacs26.1 windows版本

    Emacs 26.1是GNU Emacs编辑器的一个重要版本,发布于2018年6月3日,特别为Windows平台进行了优化,构建为x86_64-w64-mingw32架构。作为一款强大的文本编辑器,Emacs不仅仅是一个简单的文本处理工具,更是一个全功能...

    Emacs配置与插件

    Emacs是一款强大的文本编辑器,深受程序员和程序员爱好者们的喜爱,因其高度可定制性和丰富的扩展功能而闻名。本文将深入探讨Emacs的配置与插件使用,帮助新手快速上手。 首先,我们要明白Emacs的基本配置是提升其...

    emacs

    Emacs是一款强大的文本编辑器,尤其受到程序员和高级用户的喜爱,因为它提供了丰富的功能和高度的可定制性。作为一款“好用的代码剪辑软件”,Emacs不仅支持编写各种编程语言,还具备代码高亮、自动补全、语法检查、...

    emacs配置IDE

    Emacs,被誉为“可扩展、可定制、自我文档化”的实时显示编辑器,不仅是一个文本编辑器,更是一个强大的集成开发环境(IDE)。它以其高度的可配置性和丰富的功能库,使得开发者能够根据个人需求定制自己的开发环境。...

    Emacs中文手册.pdf

    Emacs的基本操作包括启动Emacs、挂起Emacs、永久离开Emacs文件、读取文件到Emacs、保存文件到磁盘、插入其它文件的内容到当前缓冲、将要读取的文件替换当前文件、将当前缓冲写入指定的文件等。这些命令都是Emacs的...

    Writing GNU Emacs Extensions

    emacs 教程 Writing GNU Emacs Extensions pdf

    emacs多年使用总结

    ### Emacs多年使用总结 #### 一、第三方扩展Package Emacs作为一个高度可定制的文本编辑器,通过安装各种第三方扩展可以极大地提升工作效率。 ##### 1.1 学会使用ERC (IRC Client) - **功能**: ERC (Emacs ...

    emacs 快速配置脚本包

    快速搭建的主要思想是采用执行注册表脚本 设定 emacs 查找配置文件的路径为 c: emacs home emacs 同时又在此文件中定位到我们现在刚下载的路径 及更改 home 目录的方式 包含最基本的配置 颜色 字体等 脚本以及常用的...

    Emacs教程Learn_GNU_Emacs

    Emacs是一款强大的文本编辑器,源自GNU项目,是GNU Emacs的简称。它以其高度可定制性、丰富的功能和开源性质闻名于世。本教程“Learn_GNU_Emacs”旨在帮助用户从零开始掌握Emacs的基本操作和高级特性,成为熟练的...

    emacs使用指南 一个一看就会使用emacs的文档

    ### Emacs使用指南:高效利用Emacs与Gnus访问新闻组 #### 一、引言 GNU Emacs是一款功能强大且高度可定制的文本编辑器,它不仅支持多种编程语言的语法高亮显示,还能通过安装扩展插件实现更多实用功能。对于初学者...

    我的emacs模版

    Emacs是一款强大的文本编辑器,尤其受到程序员和高级用户的青睐,因为它的高度可配置性和丰富的扩展功能。在Linux环境中,Emacs是许多开发者首选的编辑工具。本压缩包中的"我的emacs模版"是为了帮助用户定制一个高效...

Global site tag (gtag.js) - Google Analytics