Emacs
原作者 | 理查德·斯托曼和盖伊·史提尔二世 |
---|---|
开发者 | GNU计划 |
当前版本 | 29.4[1](2024年6月) |
操作系统 | GNU/Linux、FreeBSD、AIX 4.3.3或更高、macOS、MS-DOS、Windows、NetBSD、OpenBSD、Solaris等 |
类型 | 文本编辑器 |
许可协议 | GNU通用公共许可证 |
Emacs(/ˈiːmæks/,源自Editor MACroS,宏编辑器),是一个文本编辑器家族,它具有可扩展性,用户以程序员和其他以技术工作为主的电脑用户为主。最初由理查德·斯托曼于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)。
历史
GNU Emacs及其派生 |
---|
Emacs内部技术 |
模式(mode) |
人物 |
相关 |
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 |
” |
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是Zile Is Lossy Emacs的递归缩写,以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的编辑器
- Yi,以Haskell语言编写,内建一个Emacs模拟器。
- Joe's Own Editor内建一个Emacs模拟器。
- JED内建一个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]
外部链接
- GNU Emacs官方网站(页面存档备份,存于互联网档案馆),包括:
- A paper on the design of the original Emacs(页面存档备份,存于互联网档案馆),by Stallman
- "Multics Emacs: The History, Design and Implementation"(页面存档备份,存于互联网档案馆) by B. Greenberg
- "Emacs Timeline"(页面存档备份,存于互联网档案馆) by J. Zawinski
- "List of Emacs implementations" by C. Finseth
- Reviewed entry(页面存档备份,存于互联网档案馆) in the Free Software Directory
- Emacs实现列表(页面存档备份,存于互联网档案馆)
- WikEmacs(页面存档备份,存于互联网档案馆)
- Emacs中文网(已失效)
- Emacs China中文论坛(页面存档备份,存于互联网档案馆)
- 中文Emacs User's Guide
- IBM dw教程:生活在Emacs中
- Emacs Wiki(页面存档备份,存于互联网档案馆):一个关于Emacs的wiki。网站上有英语、汉语等多种语言。EmacsWiki主要是提供一些Emacs的使用教程、技巧和用户贡献的配置文件[7][8][9]。像其他wiki一样,所有人都可以编辑。不过EmacsWiki没有注册的制度,不需要账户就可以编辑整个wiki。[10]
参考文献
- ^ Emacs 29.4 released.
- ^ 原文:because <E> was not in use as an abbreviation on ITS at the time.
- ^ 原文:EMACS was distributed on a basis of communal sharing, which means all improvements must be given back to me to be incorporated and distributed.
- ^ Re: Looking for a new Emacs maintainer or team. gnu.org Mailing List. [2008-02-23]. (原始内容存档于2011-06-03).(英文),参见"Stallman on handing over GNU Emacs, its future and the importance of nomenclature" (页面存档备份,存于互联网档案馆)(英文)
- ^ ergoemacs-mode. [2015-02-17]. (原始内容存档于2015-06-27).
- ^ VimとEmacsのあいだで小指痛を叫んだけもの. 2007-10-14 [2015-02-17]. (原始内容存档于2015-02-17) (日语).
- ^ GNU Emacs的终极扩展管理工具— el-get. Emacs中文网. [2012-05-29]. (原始内容存档于2012-06-20).
- ^ Emacs Wiki. [2012-05-29]. (原始内容存档于2012-05-23).
- ^ redguardtoo. 一年成为Emacs高手(像神一样使用编辑器). csdn. [2012-05-29]. (原始内容存档于2013-04-30).
- ^ EmacsWiki: Site Map. [2012-05-29]. (原始内容存档于2012-12-06).
You can edit this website. There’s a link, Edit this page, at the bottom of this and other pages. Please check SiteMap Discussion before editing this SiteMap page, however.
- 注:本文第一部分,部分引用自遵守GFDL的《Emacs用户指南》汉译版