Emacs

✍ dations ◷ 2025-09-10 08:26:48 #Emacs,档案比较工具,Unix文本编辑器,1976年软件,自由集成开发环境,用C编程的自由软件,用Lisp语言编辑的自由软件,自由文本编辑器,GNU计划软件

Emacs(/ˈiːmæks/,源自Editor MACroS,宏编辑器),是一个文本编辑器家族,具有强大的可扩展性,在程序员和其他以技术工作为主的计算机用户中广受欢迎。最初由Richard Stallman于1975年在MIT协同盖伊·史提尔二世共同完成。这一创意的灵感来源于TECO宏编辑器TECMAC和TMACS,它们是由盖伊·史提尔二世、Dave Moon、Richard Greenblatt、Charles Frankston等人编写的宏文本编辑器。

自诞生以来,Emacs演化出了众多分支,其中使用最广泛的两种分别是:1984年由理查·斯托曼发起并由他维护至2008年的GNU Emacs,以及1991年发起的XEmacs。XEmacs是GNU Emacs的分支,至今仍保持着相当的兼容性。它们都使用了Emacs Lisp这种有着极强扩展性的编程语言,从而实现了包括编程、编译乃至网络浏览等等功能的扩展。

在Unix文化里,Emacs是黑客们关于编辑器之战的两大主角之一,它的对手是vi(Vim)。

Emacs在1970年代诞生于MIT人工智能实验室(MIT AI Lab)。在此之前,人工智能实验室的PDP-6和PDP-10电脑上运行的ITS操作系统的默认编辑器是一个叫TECO(Text Editor and Corrector)的行编辑器。与现代的文本编辑器不同,TECO将击键、编辑和文本显示按照不同的模式进行处理,稍晚出现的vi与它有些类似。在TECO上击键并不会直接将这些字符插入到文档里去,必须先输入一系列相应的TECO指令,而被编辑的文本在输入命令的时候是不会显示在屏幕上的。在如今还在使用的UNIX编辑器ed上,我们还能看到类似的工作方式。

1970年代初,理查德·斯托曼访问斯坦福大學人工智能实验室(Stanford AI Lab)时见到了那里的"E" editor。这种编辑器有着所见即所得的直观特点,深深打动了斯托曼,后来成为了大部分现代文本编辑器都具有的特性。后来斯托曼回到MIT,那时候MIT AI lab的黑客Carl Mikkelsen已经给TECO加上了称作“Control-R”的编辑显示模式,使得屏幕能跟随用户的每次击键刷新显示。斯托曼重写了这一模式,使它运行得更有效率,后来又加入了宏,允许用户重新定义运行TECO程序的键位。

这一新版的TECO立刻在AI实验室流行开来,并且很快积累起了大量自定义的宏,这些宏的名字通常就以“MAC”或者“MACS”结尾,意为“宏”(macro)。两年后,盖伊·史提尔二世承担起统一当时存在的各种键盘命令集的工作。史提尔和斯托曼经过一夜奋战,最终由斯托曼完成了这一任务,包括一套扩展和注释新的宏包的工具。这个完成的系统被称作EMACS,代表“Editing MACroS”,也代表“E with MACroS”。

根据斯托曼的说法,他采用这个名字是“因为当时<E>在ITS里还没有被当作缩写用过”。也有说法指出,当时波士顿在MIT附近有家名为“Emack & Bolio's(英语:Emack & Bolio's)”的商店出售的冰淇淋很受欢迎,Dave Moon是那里的老主顾,他就将ITS上一个给文本排版的程序命名为BOLIO,然而斯托曼并不喜欢甚或根本不知道那种冰淇淋,此事后来成了黑客界的一桩公案。

斯托曼意识到过多的定制、在开发过程中事实上的分支以及针对特殊用途的限制,威胁着Emacs的发展。后来他写道:

最初的Emacs同TECO一样只能运行在PDP系列的电脑上。Emacs虽然是在TECO的基础上发展起来的,不过它已经足以被认为是一个新的文本编辑器了。很快,Emacs就成为ITS上的标准编辑程序,接着由Michael McMahon从ITS移植到Tenex和TOPS-20操作系统上。其他Emacs早期的贡献者还包括Kent Pitman、Earl Killian和Eugene Ciccarelli。到了1979年,Emacs已经是MIT人工智能实验室和它的计算机科学实验室的主流编辑器了。

后来几年,程序员们写了很多类Emacs的编辑器。其中包括Michael McMahon和Daniel Weinreb为Lisp机器写的EINE(“EINE Is Not EMACS”)和ZWEI(“ZWEI Was EINE Initially”),还有Owen Theodore Anderson写的Sine。Weinreb的EINE是第一个以Lisp实现的Emacs。1978年,Bernard Greenberg写了Multics Emacs,大部分由Multics Lisp实现。Multics Emacs后来由Richard Soley维护。很多Emacs的变种,包括GNU Emacs,后来都将Lisp作为自己的扩展语言。

詹姆斯·高斯林,在1981年写了Gosling Emacs,他后来还发明了NeWS和Java。作为第一个在Unix上运行的类Emacs编辑器,Gosling Emacs由C语言实现,并且以Mocklisp作为扩展语言。1984年,Gosling Emacs成为专有软件。

1984年,斯托曼开始致力于开发GNU Emacs,这将是一个自由软件,以代替专有的Gosling Emacs。最初GNU Emacs是在Gosling Emacs的基础上开发的,不过斯托曼后来用一个真正的Lisp解释器代替了原来的Mocklisp解释器,由于Lisp解释器在此软件中的核心地位,这意味着实际上重写了几乎全部代码。GNU Emacs是GNU计划的第一个项目,以C语言编写,将Emacs Lisp(其解释器由C实现)作为扩展语言。GNU Emacs最早广泛发布的版本是15.34,出现于1985年。实际上版本2到12并不存在,GNU Emacs的早期版本都是以“1.x.x”的形式编号,直到1.12版时开发人员放弃了这一记法,因为他们认为主版本号是不应该改动的,所以版本号从“1”跳跃到了“13”。因此,Version 13是第一个public release,它发布于1985年3月20日。

GNU Emacs后来被移植到了Unix系统上。它比Gosling Emacs拥有更多的的功能,尤其是它有一个真正的Lisp作为扩展语言。结果,GNU Emacs很快就取代了Gosling Emacs,成为Unix系统上默认的Emacs编辑器。

到1999年为止,GNU Emacs的开发工作基本是在封闭的情况下进行。这种开发方式在《大教堂和市集》中被称为“大教堂模式”。从那以后,GNU Emacs项目创建了公共开发邮件列表和匿名CVS代码访问,开发工作在一个CVS代码仓库中进行。2008年,Emacs开始使用Bazaar进行版本控制。

斯托曼是GNU Emacs的主要维护者,但他曾经有几次把维护工作交给别人。他于2008年将代码的维护工作交给了Stefan Monnier和Chong Yidong。他在mail list上发出以下内容:

Subject:Re: Looking for a new Emacs maintainer or team
Date:Fri, 22 Feb 2008 17:57:22 -0500
Stefan和Yidong愿意接管,所以我也乐意将Emacs开发工作移交给他们。

1991年,Lucid公司的Jamie Zawinski等人以GNU Emacs 19的一个早期alpha版为基础,添加了一些新的特性,开发出Lucid Emacs。很快,Lucid Emacs的开发与GNU Emacs渐行渐远,最终双方的团队放弃了将两者合并的努力。Lucid Emacs被重命名为XEmacs;至今为止,XEmacs仍然是最流行的Emacs变种之一。

其他的派生版本,包括:

除上述编辑器以外,还有很多不基于GNU Emacs的编辑器,有些项目的目标是创建一个精简版的Emacs。在1980年代,GNU Emacs只能在很高端的电脑上运行,这就为精简版的Emacs实现的出现奠定了基础。还有一些Emacs变种是为了克隆一个完整的Emacs,但是使用不同的Lisp方言或者其他的编程语言。比如:

Emacs的著作权遵从GNU通用公共许可证,赋予他人自由地对包括C和Lisp在内的Emacs源文件进行修改和再发行的权利。较早版本的GNU Emacs文档是在一种点对点(ad-hoc)的许可下发布的,要求所有修改过的副本都要包含某些特定的文字。例如,GNU Emacs的用户手册中必须包含如何获得GNU Emacs的说明,以及理查·斯托曼的文章——《GNU宣言》。作为较早版本的GNU Emacs的分支,XEmacs的手册也采用相同的使用许可。较新版本的GNU Emacs文档则采用《GNU自由文档许可证》,以使用“不变段落”("invariant sections")的形式包含有同样的文本,并且要求这些文档自我声明为“GNU手册”()。

Emacs不仅仅是一个编辑器,它是一个集成环境,或可称它为集成开发环境,这些功能如让用户置身于全功能的操作系统中。Emacs可以:

此外Emacs还有如下特点:

GNU Emacs几乎所有的功能都可以定制,有的可以通过C语言实现,有的可以通过一个Lisp的方言——Emacs Lisp来实现。在Lisp环境中,变量和子程序可以在不重新编译/启动Emacs的前提下被修改。Emacs用户可以根据自身的需要和偏好对编辑器进行定制。强大而自由的个人定制功能是Emacs受到广泛欢迎的重要原因之一。定制Emacs主要有三种方法:

如果一段Emacs Lisp代码确实有用,它通常会被打包并发布给其他用户。在因特网上能找到很多这样来自第三方的Emacs Lisp库,例如能用于编辑维基百科条目的wikipedia-mode。Usenet上的新闻组gnu.emacs.sources专门发布新的Emacs Lisp库。有些第三方代码最终还成为了Emacs的一部分。

手工配置安装各种Emacs Lisp代码毕竟有些麻烦。为了解决这个问题,Emacs 24自带包管理器ELPA(package.el)。用户可以方便的浏览可用的包(M-x package-list-packages)和自动下载安装包(M-x package-install)。详细信息可以参考Emacs Wiki上的ELPA词条。

在GNU Emacs刚诞生时,它比相同系统上的其他编辑器运行速度要慢很多,但是现代的电脑可以很快地运行GNU Emacs。早期的GNU Emacs可以处理256 MB以下的文件,GNU Emacs 23.2将这一限制提升到512 MB,而在64位系统的GNU Emacs 24中,这个限制是大约2 EiB。

Emacs是目前世界上最具可移植性的重要软件之一,能够在当前绝大多数操作系统上运行,包括各种类Unix系统(GNU/Linux、FreeBSD、NetBSD、OpenBSD、Solaris、AIX、OS X等)、MS-DOS、Microsoft Windows等。甚至在Android和诺基亚的Maemo上,Emacs也能运行。

GNU Emacs既可以在文本终端也可以在图形用户界面环境下运行。在类Unix系统上,GNU Emacs使用X-Window产生GUI,或者直接使用“框架”(widget toolkit),例如Motif、LessTif或GTK+等等。Emacs也能够利用OS X和Microsoft Windows的本地图形系统产生GUI。用GUI环境下的Emacs能提供菜单栏(Menubar)、工具栏(toolbar)、滚动条以及环境菜单(context menu)等交互方式。

Emacs采取的编辑方式是对不同类型的文本进入相应的编辑模式,即“主模式”(major mode)。Emacs针对多种文档定义了不同的主模式,包括普通文本文件、各种编程语言的源文件、HTML文档、TEX与LaTeX文档,以及其他类型的文本文件等等。

每种主模式都有特殊的Emacs Lisp变量和函数,使用户在这种模式下能更方便的处理这一特定类型的文本。例如,各种编程语言的主模式通常会提供:

Emacs还能进一步定义“次模式”(minor mode),用以深度定制Emacs。一个GNU Emacs的缓冲区(buffer)只能关联于一种主模式,却能同时关联多个次模式。比如,编写C语言的主模式可以同时定义多个次模式,每个次模式有着不同的缩进风格(indent style)。

Emacs支持对多种文字的文本编辑,加上对多种字符集、字母系统、书写系统,以及不同文化的书写习惯都提供了支持,使得世界上大多数语言的用户都能通过Emacs进行文本处理。Emacs还能通过调用诸如Aspell这样的外部程序,实现多种语言的拼写检查。GNU Emacs 24添加了对双向文字的支持。

Emacs支持包括UTF-8在内的诸多编码系统。GNU Emacs从23开始以UTF-8作为自身的编码系统,而在之前的版本,Emacs拥有一种特殊的内部编码系统MULE(MULti-language Environment),在读写文件时进行编码和解码。XEmacs编码系统和GNU Emacs相似,但具体的实现方法不完全一样。

一个叫做Emacspeak的子系统可以通过音频反馈,让拥有视觉障碍的用户和盲人用户使用Emacs。

在普通的编辑模式下,GNU Emacs和其他文本编辑器一样,允许用户通过按下键盘上的键插入其相对应的字符,也可以使用键盘上的方向键来移动光标。使用各种修饰键(如、、等)和其它的普通键配合可以调用Emacs Lisp函数和宏。

某些GNU Emacs命令会调用外部程序,比如使用Aspell进行拼写检查或者使用GCC进行程序编译,解析被调用的外部程序的输出,并将结果显示出来。习惯IBM Common User Access的用户可以使用“cua-mode”,“cua-mode”曾经是一个第三方插件,从GNU Emacs 22开始被包含在Emacs中。

下表给出了一些基本命令。键以大写表示,键键以大写表示。

注:中文系统C-一般为系统输入法,可使用C-@代替。

Emacs使用“小缓冲”(通常在最下面一行)显示信息提示以及输入命令和命令参数。在合适的情况下,小缓冲支持使用制表键或空格键补全。每个frame只有一个小缓冲。

Emacs将文本存放在缓冲区中。用户可以创建新的缓冲区,也可以关闭不需要的缓冲区,Emacs可以同时存在很多缓冲区。大部分的缓冲区的文本来自文本文件,用户可以编辑缓冲区的内容,并且保存到磁盘上。缓冲区也可以保存临时文本,比如“help”库显示的文档字符串。

很多Emacs用户都有过重复性劳损的经历,原因是Emacs强烈依赖Ctrl键和Meta键,也由于Ctrl键在现代键盘中的位置。

解决方法有软件方法,也有硬件方法。软件方法包括:

硬件方法包括使用特殊的键盘,如Kinesis键盘的修饰键放在大拇指很容易按到的位置,或者微软自然键盘,它的修饰键对称的放置在键盘的两边,并且可以使用手掌按下。脚控踏板也是一种方法。

如果使用普通键盘,可以在按Ctrl组合键时手掌下移,用无名指击Ctrl,或者直接以小指掌骨压下Ctrl,以规避小指过度利用。

“Emacs小拇指”是近些年才出现的。在Emacs诞生时,键盘的Ctrl键非常大,并且在空格键的旁边,使用大拇指很容易按。

Vim 的拥护者经常以Emacs小拇指作为切换编辑器的原因,虽然有些 Vim 用户(因为相似的原因)也会交换模式转换键和大小写转换键的功能。

相关

  • 不自主肌肉动作舞蹈症可能指以下其中一项:
  • 地木耳... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no changes ... no cha
  • 刘墉《清代学者象传》第一集之《刘墉像》,清叶衍兰摹刘墉(1719年-1805年1月25日),字崇如,号石庵,山东诸城注沟镇逄戈庄村(今属高密)人,祖籍江南省砀山(明弘治间始祖福公自南直隶砀山县迁山
  • 台铁E200-E400型电力机车E200、E300、E400型电力机车,是台湾铁路管理局的六轴电力机车,目前仍是台铁局主线电力机车主力车型之一。台湾铁路管理局为因应十大建设的纵贯线铁路电气化,从美国GE运输公司(简
  • 怖军怖军(梵语:भीम)在摩诃婆罗多中般度族的一员,般度五子的二子,哈斯蒂纳普尔的国王。怖军名义上的父亲是般度,但因般度得罪天神导致不能与女性行房,所以贡蒂利用神力与天神生下儿子
  • 埃塞克斯县 (马萨诸塞州)埃塞克斯县(英语:Essex County)是美国马萨诸塞州东北部的一个县,北邻新罕布什尔州,东临大西洋。面积2,146平方公里。根据美国2000年人口普查,共有人口723,419人。县治有二:塞勒姆(Sa
  • 台19线台19线 彰化-台南,别称中央公路,是连络台湾中南部次要城镇的纵贯省道,全线贯通彰化平原、嘉南平原。北起彰化县彰化市,南至台南市永康区,起终点皆位于台1线,总长140.195公里。路廊
  • 阿尤布汗 (钦察)阿尤布汗(波斯语:ايوب خان‎,鞑靼语:Äyyüb,俄语:Аепа,11世纪-1117年),钦察联盟领袖,他是安德烈·博戈柳布斯基的祖父,他曾与弗拉基米尔·莫诺马赫战争。但他也曾与基辅罗斯
  • 吉迪恩·费尔吉迪恩·费尔是约翰·狄克森·卡尔笔下的虚构侦探。他是1933至1967年间23部长篇小说〔也是数篇短篇)的主角。卡尔是一个差不多整个成人阶段都住在英国的美国人;而费尔则是一个
  • 欧盟蓝卡欧盟蓝卡是一种类似于美国绿卡的一种移民身份。与绿卡不同的是,蓝卡不是一种给外国公民的永久居住许可证,更接近于一种免入境签证的工作签证,两年有效,可以延期,在失去工作后仍然