在Unix环境中重新实现

Emacs最初由TECO宏发展而来,后来又有在Lisp机器和Multics上实现的版本。理查德·斯托曼于1984年着手GNU Emacs,以詹姆斯·戈斯林的编辑器为起点,用新的Lisp解释器替换Mock Lisp及相关内部结构。设计既要容许用户扩展,又要在缺少高性能Lisp编译器的机器上运行,因此采用C与Lisp结合的实现。C负责缓冲区操作、屏幕刷新和解释器等底层工作,Lisp则承担可修改的编辑命令。语言主要取法Maclisp。为适应只有1兆字节内存的Unix机器,早期实现还省去了一些专门的循环控制结构。

参考:[1]

1985年的公开传播

1985年3月20日,Chuck Wegrzyn在Usenet的net.emacs等新闻组报告,斯托曼编写的GNU Emacs已经可以分发,发行物包括编辑器源代码和源代码级调试器。他还在征询读者,是开通UUCP拨号获取,还是寄送磁带;这反映了软件已经可得之后,如何让更多人取得副本的实际问题。

5月8日,斯托曼通过麻省理工学院的prep主机公布15.34版可供取得,并说明刚修复了VT100等终端的处理错误。公告希望这成为15版系列的最后一次分发,可见发布后的工作还包括针对具体终端修补缺陷。同年7月的修改记录也出现Richard Mlynarik的名字:他优化了缓冲区菜单的处理,记录同时保留了斯托曼的技术评语。

参考:[2] [3] [5]

把反复输入写成命令

可以用1985年16.56发行物已有的操作自写一个小命令:(defun insert-note () (interactive) (insert "NOTE: "))。defun定义函数,interactive使它可被交互调用,insert把文字插入当前位置。在Emacs-Lisp模式下求值定义,再执行M-x insert-note,便会插入“NOTE: ”。改写字符串并重新求值,下一次调用就采用新内容。用户由此能把反复键入的文字变成自己的编辑命令,再随需要修改。较大的扩展可保存为.el文件,再加载进编辑器。

参考:[4] [5]

软件发布与手册编写

16.56发行包所存《GNU Emacs Manual》题页标明“第一版、Emacs第16版、1985年6月”。它介绍键与命令时,仍把专门的《GNU Emacs Lisp Manual》列为尚未写成的计划。1985年公开的是随编辑器运作的语言实现;专门语言手册的编写属于另一个阶段。

参考:[2] [4]

后续语言变化

早期Emacs Lisp采用动态作用域,变量取值受当时仍有效的调用环境影响。2012年6月的Emacs 24.1加入词法作用域,属于多年之后的语言演进。

参考:[1]