Emacs ( ,源自E ditor MAC roS ,宏 编辑器),是一个文本编辑器 家族,它具有可扩展性,使用者以程序员 和其他以技术工作为主的计算机用户為主。最初由理查德·斯托曼 於1975年在MIT 协同蓋伊·史提爾二世 共同完成。这一创意的灵感来源于TECO宏编辑器TECMAC和TMACS,它们是由蓋伊·史提爾二世 、David Moon 、李察·格連布勒 、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裡还没有被当作缩写用过”[ 2] 。也有说法指出,当时波士顿 在MIT附近有家名为“Emack & Bolio's ”的商店出售的冰淇淋 很受欢迎,Dave Moon 是那裡的老主顾,他就将ITS上一个给文本排版的程序命名为BOLIO,然而斯托曼并不喜欢甚或根本不知道那种冰淇淋,此事后来成了黑客界的一桩公案。
斯托曼意识到过多的定制、在开发过程中事实上的分支以及针对特殊用途的限制,威胁着Emacs的发展。后来他写道:
“
Emacs的发布基于社群共享,这意味着所有的发展都要反馈给我,由我进行整合和发布。[ 3]
”
最初的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成为专有软件 。
GNU 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 [ 4] 。他在mail list上發出以下內容:
“
From:Richard Stallman
Subject:Re: Looking for a new Emacs maintainer or team
Date:Fri, 22 Feb 2008 17:57:22 -0500
Stefan和Yidong願意接管,所以我也樂意將Emacs開發工作移交给他們。
”
XEmacs
1991年,Lucid公司的Jamie Zawinski 等人以GNU Emacs 19的一个早期alpha版为基础,添加了一些新的特性,开发出Lucid Emacs。很快,Lucid Emacs的开发与GNU Emacs渐行渐远,最终双方的团队放弃了将两者合并的努力。Lucid Emacs被重新命名为XEmacs;至今为止,XEmacs仍然是最流行的Emacs变种之一。
其他GNU Emacs的衍生版本
其他的衍生版本,包括:
其他Emacs变种
除上述编辑器以外,还有很多不基于GNU Emacs的编辑器,有些项目的目标是创建一个精简版的Emacs。在1980年代,GNU Emacs只能在很高端的电脑上运行,这就为精简版的Emacs实现的出现奠定了基础。还有一些Emacs变种是为了克隆一个完整的Emacs,但是使用不同的Lisp方言或者其他的编程语言。比如:
MicroEMACS ,原作者是Dave Conroy,后来由Daniel Lawrence进一步开发,有很多变种。
Mg ,原名MicroGNUEmacs,是一个MicroEMACS的公共领域分支,比MicroGNUEmacs更加接近于GNU Emacs。现在默认安装在OpenBSD 上。
NotGNU,一个小型、快速的Emacs实现,是免费软件,支持DOS、Win16、Win32和GNU/Linux,作者为Julie Melbin。
JOVE (Jonathan's Own Version of Emacs),Jonathan Payne为类Unix系统 写的Emacs不可编程的Emacs实现。
Zile 是Z ile I s L ossy E macs 的递归缩写,以C语言 编写。
Climacs ,以Common Lisp 编写的Emacs变种。
QEmacs ,一个由Fabrice Bellard 编写的小型编辑器,支持UTF-8,可以快速编辑上百兆大小的文件。
Epsilon,一个由Lugaru Software开发的Emacs变种。支持MS-DOS、MS-Windows、GNU/Linux、FreeBSD、O/S 2等操作系统。它使用了一个与C语言语法类似的非Lisp语言作为扩展语言。
EmACT ,1986年由Christian Jullien从MicroEmacs衍生而来,源代码可以在SourceForge获取。
Hemlock ,最初以Spice Lisp 实现,后来改为Common Lisp 。Hemlock是CMU Common Lisp 的一部分,受到了Zmacs 的影响。
可以模拟Emacs的编辑器
版权
Emacs的版权遵从GNU通用公共许可证 ,赋予他人自由地对包括C和Lisp在内的Emacs源文件进行修改和再发行的权利。较早版本的GNU Emacs文档是在一种点对点(ad-hoc)的许可下发布的,要求所有修改过的副本都要包含某些特定的文字。例如,GNU Emacs的用户手册中必须包含如何获得GNU Emacs的说明,以及理查·史托曼的文章——《GNU宣言 》。作为较早版本的GNU Emacs的分支,XEmacs的手册也采用相同的使用许可。较新版本的GNU Emacs文档则采用《GNU自由文档许可证 》,以使用“不变段落”("invariant sections")的形式包含有同样的文本,并且要求这些文档自我声明为“GNU手册”(GNU Manuals )。
功能特点
Emacs不仅仅是一个编辑器,它是一个整合环境,或可称它为集成开发环境 ,这些功能如让使用者置身于全功能的操作系统中。Emacs可以:
收发电子邮件 、上新闻组 (Gnus)
無縫直接编辑远程档案(Tramp)
通过Telnet 登录远程主机
操作殼層 (M-x EShell,Term)
結合git, mercurial等版本控制系統並直接操作(Magit,VC)
上Twitter(Twittering-mode)
登陆IRC 和朋友交流(M-x ERC,rcirc)
电子数据表
模拟其他编辑器,如vi(Evil-mode)、WordStar、EDT、TPU等
编辑Wiki (Wikipedia-mode)
对多种编程语言 的编辑 ,如C/C++、Perl 、Python 、Lisp 等等
调试程序 ,结合GDB ,EDebug等。
玩游戏
计算器
心理咨询(M-x doctor)
煮咖啡
记笔记、日记(Org-mode)
管理日程,Task,待辦事項(ToDo),约会等GTD(Org-mode)
寫作與出版(Org-mode,Muse-mode)
目录管理(Dired)
文件比较、合并(Ediff)
阅读info和man文档(M-x info,woman)
浏览网站(M-x eww)
为各种程序(TeX 、LaTeX 等)提供统一的操作界面
……
此外Emacs还有如下特点:
实时编辑器
Self-documenting
可定制性
可扩展性(集成Lisp语言)
可定制性
GNU Emacs几乎所有的功能都可以定制,有的可以通过C语言 实现,有的可以通过一个Lisp 的方言——Emacs Lisp 来实现。在Lisp环境中,变量 和子程序 可以在不重新编译/启动Emacs的前提下被修改。Emacs用户可以根据自身的需要和偏好对编辑器进行定制。强大而自由的个人定制功能是Emacs受到广泛欢迎的重要原因之一。定制Emacs主要有三种方法:
使用Emacs的交互式定制功能(即customize )。Emacs提供了图形化的交互界面,使用户能够对可定制的公共变量进行设置,也可以定制配色主题。这种方法使Emacs的初学者不需要接触Emacs Lisp代码即可完成定制。
将一系列按键记录为宏,调用这一宏可以自动重复进行已经记录的一系列复杂操作。宏可以保存并命名,以便按名调用,不过同一时刻只能存在一个匿名的宏。
通过使用Emacs Lisp完成Emacs的定制。这种方法最为复杂,但是也提供了更多的灵活性和更强大的功能。用户通常将个人定制的Emacs Lisp代码保存在一个名为.emacs(.el)
(或init.el)的配置文件中,Emacs程序运行之初便读取这一文件,完成用户要求的配置。用户可以通过.emacs
文件重设变量、重新定义按键的绑定(key bindings)、以及定义新的命令,以方便用户个人的使用。很多高级用户的.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变量和函数,使用户在这种模式下能更方便的处理这一特定类型的文本。例如,各种编程语言的主模式通常会提供:
语法高亮 (“font lock”):对源文件文本中的关键字、注释加以不同的字体和颜色(“faces”)。
自动缩进,用来维护文件的格式一致。
自动插入文件所需要的结构元素,如空格、换行以及括号。
特殊的编辑命令,比如跳转到函数的开头或者结尾,或者(在类似于XML的标记语言中)验证文档还有插入关闭标签。
次模式
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。
使用Emacs
命令
在普通的编辑模式下,GNU Emacs和其他文本编辑器一样,允许用户通过按下键盘上的键插入其相对应的字符,也可以使用键盘上的方向键来移动光标。使用各种修饰键 (如[Ctrl]、[Alt]、[Shift]等)和其它的普通键配合可以调用Emacs Lisp函数和宏。
某些GNU Emacs命令会调用外部程序,比如使用Aspell进行拼写检查或者使用GCC 进行程序编译,解析被调用的外部程序的输出,并将结果显示出来。习惯IBM Common User Access 的用户可以使用“cua-mode”,“cua-mode”曾经是一个第三方插件,从GNU Emacs 22开始被包含在Emacs中。
下表给出了一些基本命令。[Ctrl]键以大写C 表示,[Meta]键[Alt]键以大写M 表示。
命令
快捷键
功能
forward-word
M-f
向前移动一个单词。
isearch-forword
C-s
递增搜索
undo
C-/
撤销最后一次操作,如果多次执行则取消以前的操作。
keyboard-quit
C-g
取消当前的命令。
find-file
C-x C-f
在一个新的缓冲区里访问某个文件(用户给定文件名)。
save-buffer
C-x C-s
将缓冲区的内容保存到文件。
save-some-buffers
C-x s
保存所有的缓冲区
save-with-newname
C-x C-w
将缓冲区的内容另存为一个新的文件。
save-buffers-kill-emacs
C-x C-c
提示是否保存文件,然后退出Emacs。
set-mark-command
C-[空格]注
设定标记,用于剪切或复制。
kill-region
C-w
剪切标记到当前光标所在处的文本。
kill-ring-save
M-w
复制标记到当前光标所在处的文本。
yank
C-y
从Emacs的剪贴板中粘贴文本。
kill-buffer
C-x k
关闭当前buffer。
注:中文系统C-[空格]一般为系统输入法,可使用C-@代替。
小缓冲
Emacs使用“小缓冲”(通常在最下面一行)显示信息提示以及输入命令和命令参数。在合适的情况下,小缓冲支持使用制表键或空格键补全。每个frame只有一个小缓冲。
文件管理与显示
Emacs将文本存放在缓冲区 中。用户可以创建新的缓冲区,也可以关闭不需要的缓冲区,Emacs可以同时存在很多缓冲区。大部分的缓冲区的文本来自文本文件 ,用户可以编辑缓冲区的内容,并且保存到磁盘上。缓冲区也可以保存临时文本,比如“help”库显示的文档字符串。
编程语言支持
Python
Emacs 内建的 python-mode
Elpy
Emacs小拇指
很多Emacs用户都有过重複性勞損 的经历,原因是Emacs强烈依赖Ctrl键和Meta键,也由于Ctrl键在现代键盘中的位置。
解决方法有软件方法,也有硬件方法。软件方法包括:
使用 ergoemacs-mode 定制键盘布局。[ 5]
定制键盘布局,使Ctrl和大寫鎖定键交换位置。其他相似的方法包括将大写锁定键定义为Ctrl,或交换Ctrl和Meta键。
god-mode 可以让 Emacs 不用修饰键就触发命令。
使用 evil-mode,一个高级的 Vim 模拟层。
Emacs有一个内置的“Viper-mode”,允许用户使用vi 的键绑定来进行基本的文本编辑,而使用Emacs本身的键绑定来进行更高级的操作。
让一个更容易按的键(如空格键 )拥有多种功能,当那个键和其他键一起按下时,功能为Ctrl键的。
使用语音输入控制Emacs。
很多软件,如xwrits ,可以提醒用户进行定期的休息。
硬件方法包括使用特殊的键盘,如Kinesis键盘的修饰键放在大拇指 很容易按到的位置,或者微软自然键盘 ,它的修饰键对称的放置在键盘的两边,并且可以使用手掌按下。脚控踏板也是一种方法。
如果使用普通鍵盤,可以在按Ctrl組合鍵時手掌下移,用無名指擊Ctrl,或者直接以小指掌骨压下Ctrl,以規避小指過度利用。
“Emacs小拇指”是近些年才出现的。在Emacs诞生时,键盘的Ctrl键非常大,并且在空格键的旁边,使用大拇指很容易按。
Vim 的拥护者经常以Emacs小拇指作为切换编辑器的原因,虽然有些 Vim 用户(因为相似的原因)也会交换模式转换键和大小写转换键的功能。[ 6]
外部链接
参考文献
注:本文第一部分,部分引用自遵守GFDL 的《Emacs用户指南》汉译版
参见