emacs

1 作者及历史

我是emacs教的圣教主,我保佑你的电脑—我的孩子—地久天长。

理查德·马修·斯托曼

说到emacs,不得不说一说它的作者。

emacs的作者是理查德·马修·斯托曼(Richard Matthew Stallman, 简称RMS)。如果你还不太熟悉这个名字, 那么GNU这个名字你应该经常听说。GNU的目标是创建一套完全自由的操作系统以及软件,GNU软件可以自由的使用 、复制、修改和发布。而斯托曼就是GNU计划的发起人,也是自由软件基金会(Free Software Foundation) 的创立者。他开发了emacs、gcc以及gdb,发布了GNU通用公共许可证(GNU General Public License,即GPL), 是自由软件的奠基人,是自由软件运动的精神领袖。他幽默的称自己是emacs教的教主。

emacs的开发历史可以追溯到1976年,最初它是由斯托曼和Guy Lewis Steele Jr.为TECO编辑器开发的一系列宏的集合(Editor MACroS), 这也是它名字的来源。而TECO是1960年代MIT开发的面向字符的文本编辑器(Text Editor Character Oriented,前期也是 Tape Editor and COrrector和Text Editor and COrrector的简称)。 因此,TECO可以说是emacs的前身。象TECO这么古老的编辑器,它是怎么工作的呢?实际上TECO不仅仅是一个编辑器,它也是一个用来进行文本操作的解释型编程语言,比如, 以下是TECO修改一个文件的实例,这个例子将文件hello.c中的“Hello”修改成“Goodbye”。其中hello.c文件的内容 如下:

int main(int argc, char **argv)
{
    printf("Hello world!\n");
    return 0;
}

编辑的过程如下:其中 * 是提示符, $ 表示ESC。后面的中文是注释。

*EBhello.c$$                     以读写模式打开文件并备份当前文件
*P$$                             读取第一页
*SHello$0TT$$                    搜索Hello并打印这一行,光标停留在搜索字符串后面
    printf("Hello world!\n");    打印出来的这一行
*-5DIGoodbye$0TT$$               删除光标前的5个字符(即Hello),插入“Goodbye”,打印当前行
    printf("Goodbye world!\n");  打印出来的结果
*EX$$                            复制文件的剩余部分并推出

由这个例子看来,TECO的编辑模式很象现在的行编辑器ed。后来MIT的Carl Mikkelsen为TECO添加了可视化编辑的模式。斯托曼则重新实现了这个模式并添加了 宏的支持,使用户可以在按键上绑定自己的宏。很快,这个新版本的TECO在AI实验室流行起来,每个人都为这个编辑器定义了一些宏,这个宏的集合开始变大。后来, Guy Steele和斯托曼开启了一个项目来统一这些宏,使这些宏标准化,其结果就是emacs。这样说来,TECO就是emacs的直接前身。

当时,emacs只在PDP-10机器上的ITS系统中运行,后来被移殖到其他系统中。到1979年的时候,emacs就已经成了MIT人工智能实验室的主要编辑器了。由此可见, emacs流行的时间比我们想像的要早得多。在后来的时间里,各种类似的编辑器也被开发出来。此时,emacs的实现语言还不是lisp,而EINE是第一个使用lisp的 Emacs。1978年,Bernard Greenberg几乎完全使用Multics Lisp写了一个Multics Emacs。再后来的各个版本,包括GNU Emacs都使用了lisp作为扩展语言。 我想他们使用lisp作为扩展语言一个很重要的原因大概是:那时候在人工智能方面最流行的语言就是lisp。当然lisp语言灵活性也许也是其中的一个理由。

2 风格和理念

前面说到,emacs中是一个可视化的编辑器,其中定义了很多宏,并且这些宏可以被绑定到不同的按键上。而宏就是一些编辑命令,可以对文本进行一些事先定义好的处理。

emacs只有一个状态,那就是编辑状态,为了避免和文本键入相冲突,宏命令通常绑定在一些控制键上,因为宏命令繁多,各命令通常绑定在一个控制键序列上,比如说,打开文件的宏缺省状态下是绑定在CTRL+x CTRL+f上,这里CTRL+x表示同时按下ctrl和x键,在emacs的文档中,这个组合键通常都简写为C-x。因此上面的绑定也可以简写为C-x C-f。

除了ctrl键以外,另一个常用的控制键就是Alt,Alt键在emacs的文档中简写为M,因此M-x就表示同时按下Alt键和x键。

对于有些不太常用的宏,比如一些个人定义的宏,可能会绑定在一个相对长的按键序列中,比如三个键或四个键,但是这么长的按键序列和没有这个宏比起来,人们还是愿意按这个长的按键序列。这些自定义的宏和长长的命令序列是emacs看起来非常神秘的部分原因,也是让一些emacs初学者望而生畏的原因之一。但是请记住,这些长长的按键序列是你自己的选择,你也可以选择将它们绑定在一些更简单的按键上,当然代价是别的宏就不能绑定在它们之上了。

在emacs中不是所有的命令都被绑定在某个按键序列上,对于那些没有绑定到按键上的命令(或者说是宏),可以直接通过它们的名字来调用,方法是先输入M-x,然后输入你想要调用的宏。如下所示:

p6583_1.png

这里在M-x之后,输入了find-file宏,表示你将要调用这个宏。要直接记住所有的这些宏是困难的。但是emacs中有些插件可以帮助你解决这个问题,你只要大概记住某个命令就可以了。后面我们可以看到怎样来做这件事情。

因此在emacs中,最重要的概念就是宏,这些宏可以是内置的,也可以是你自己定义的。每个宏,可以绑定在某些按键上,也可以通过M-x直接调用。而其中可以自己定义的宏是emacs最为强大的部分。有了它,你就可以让emacs来做你想要做的事情。

emacs中的宏是使用emacs lisp来开发的。emacs lisp是lisp语言的一个方言。lisp是一门古老的语言,但时至今日依然具有顽强的生命力。如果要对emacs做一些个性化的设置,需要对emacs lisp有一些基本的了解。

3 emacs和vi的比较

3.1 单状态 vs 多状态

emacs是单状态的,vi是多状态的,这应该算是二者的最大区别。通常emacs只有一个编辑状态,所有的文本插入和命令的执行都在这个状态下完成。为了区分输入和命令,所有的命令基本上都使用了控制键。而vi有插入、命令模式以及搜索模式,比如在命令模式,你键入的每个按键都会被当作是命令,因此,vi的命令相对emacs而言,更加简单,它很少使用到控制键。



本文地址: http://www.bagualu.net/wordpress/archives/6583 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注