树洞

靡不有初,鲜克有终

Emacs 快速简明指南

简单整理了下 Emacs 指令,以备查阅。

Emacs 键盘命令通常包含 CONTROL 键(有时候以 CTRL 或 CTL 来标示)和 META 键(有时候用 EDIT 或 ALT 来标示)。为了避免每次都要写出全名,我们 约定使用下述缩写:

C- 表示当输入字符 时按住 CONTROL 键。
因此 C-f 就表示:按住 CONTROL 键再输入 f。

M- 表示当输入字符 时按住 META(或 EDIT 或 ALT)键。
如果你的键盘上没有 META 、EDIT 或 ALT 键,用下述方法也等效:
先按一下 ESC 键然后放开,再输入 。我们用 来表示
ESC 键。

重要提示:要退出 Emacs,请用 C-x C-c(两个连续的组合键)。 要退出一个正在运行中的命令,请用 C-g。

1 小结(SUMMARY)

以下命令在翻页浏览时相当有用:

C-v 向前移动一屏
M-v 向后移动一屏
C-l 重绘屏幕,并将光标所在行置于屏幕的中央
(注意是 CONTROL-L,不是 CONTROL-1)

找到光标,留意其附近的文字,然后输入 C-l。
找找光标在哪里,你会发现其附近的文字与之前相同,位置却变为屏幕的中心。 如果你再次输入 C-l ,附近的文字将移动到屏幕的顶端。再次输入 C-l , 文字将移动到底端。

如果你的键盘上有 PageUp 和 PageDn,也可以用这两个键来滚屏。不过使用 C-v 和 M-v 的效率要更高一些。

2 基本的光标控制(BASIC CURSOR CONTROL)

整屏的移动很有用,但是如何在文字中精确定位呢?

有几种方式可以选择。用方向键当然可以,不过更有效率的方法是保持双手位于 主键盘区,然后使用 C-p 、 C-b 、 C-f 和 C-n 这四个命令。它们的功能和方 向键是一样的,如下图所示:

                         上一行 C-p
                              :
                              :
        向左移 C-b .... 目前光标位置 .... 向右移 C-f
                              :
                              :
                         下一行 C-n

用 C-n 或 C-p 将光标移到上图的中央。
按 C-l,整幅图会被显示在屏幕的中央。
“P N B F” 四个字母分别代表了四个词,用这四个词记忆这些组合键会更容易: P 代表 previous(上一行),N 代表 next(下一行),B 代表 backward(回 退),而 F 则代表 forward(前进)。这些组合键今后将与你形影不离。

每行文字都以一个 “换行符” 结束,“换行符”把行与行区分开来。(通常情况下, 一个文件的最后一行会有一个换行符,但是 Emacs 不强制要求这一点。)

在一行的行头输入 C-b。
光标应该会移动到前一行的行尾,因为光标在回退过程中越过了换行符。

同样 C-f 也可以像 C-b 一样越过换行符。

连按几次 C-b,感受一下光标的移动。
然后按几次 C-f 回到本行的行尾。 再按一次 C-f,光标会移动到下一行。

当你移动光标穿越屏幕的上下边界时,在边界外的文字会移动到屏幕内,这称为 “滚动”(scrolling)。滚动使得光标可以被移动到文字中的任何位置,并且还 不会让光标跑到屏幕外边去。

用 C-n 将光标下移,一直越过屏幕边界,同时观察发生了什么变化。
如果你嫌一个字符一个字符地挪光标太慢,你还可以一个词一个词地跳。M-f (META-f) 可以将光标往前移动一个词,而 M-b 则是往后移。【这里的 “词” 指 英文单词,对中文来说,则是指移动到下一个标点符号。】

试试 M-f 和 M-b。
如果光标停在一个词的中间,M-f 会移动到这个词的末尾。如果光标处于词与词 之间的空白处,M-f 会移动到下一个词的末尾。M-b 的功能类似,只是方向相反。

按几次 M-f 和 M-b,中间夹杂一些 C-f 和 C-b。
你可以观察到 M-f 和 M-b 在不同位置上所表现出来的不同行为。

请注意 C-f 、C-b 和 M-f 、M-b 两对之间的类比关系。通常的惯例是:META 系 列组合键用来操作 “由语言定义的单位(比如词、句子、段落)”,而 CONTROL 系列组合键用来操作 “与语言无关的基本单位(比如字符、行等等)”。

类似的惯例在 “行” 与“句子”之间也同样适用:C-a 和 C-e 可以将光标移动到 “一行”的头部和尾部;而 M-a 和 M-e 则将光标移动到 “一句” 的头部和尾部。

按两次 C-a,再按两次 C-e。
按两次 M-a,再按两次 M-e。

想一想为什么重复的 C-a 命令会没有作用,而重复的 M-a 命令则会让光标不断 地回退到上一个句子。虽然这个类比规律并不严格,但是很自然。

光标停留的位置也可以称作 “点位”(point)。或者干脆说,光标指示出了屏幕 上“点位” 在文本中的位置。

这里对简单的光标移动命令做一个总结,其中也包括了整词和整句的移动:

C-f 向右移动一个字符
C-b 向左移动一个字符

M-f 向右移动一个词【对中文是移动到下一个标点符号】
M-b 向左移动一个词【对中文是移动到上一个标点符号】

C-n 移动到下一行
C-p 移动到上一行

C-a 移动到行首
C-e 移动到行尾

M-a 移动到句首
M-e 移动到句尾

把上面所有的命令都练习几次,这些可都是最常用的命令。
这里还要介绍两个重要的光标移动命令:M-<(META 小于号)可以将光标移动到 所有文字的最开头;M-> (META 大于号)可以将光标移动到所有文字的最末尾。

注意,在大部分键盘上,小于号(<)需要用上档键(Shift)来输入,所以在这 些键盘上你应该用 Shift 键来输入 M-<,如果不按 Shift 键,你输入的会是 M-comma(META 逗号)。

大部分的 Emacs 命令接受数字参数,并且对于多数命令而言,这些数字参数的作 用是指定命令的重复次数。为一个命令指定数字参数(也就是重复次数)的方法 是:先输入 C-u,然后输入数字作为参数,最后再输入命令。如果你有 META (或 EDIT 或 ALT)键,那么还有另一种办法:按住 META 键不放,然后输入数字。不 过我们还是建议你用 C-u,因为它在任何终端机上都能用。这种数字参数也称为 “前缀参数”,意思是说这个参数是先于使用它的命令而输入的。

举例来说, C-u 8 C-f 会向前移动 8 个字符。

为 C-n 或者 C-p 指定一个数字参数,这样你可以只用一个命令就把光标移动
到本行的附近。

虽然大部分命令把数字参数解释为其重复次数,但是也有些命令例外,它们将数 字参数另做它用。比如有些命令(我们目前还没学到)仅仅将前缀参数作为一个 标志――只要给出有一个前缀参数,不管其值为何,它都会改变命令的功能。

而 C-v 和 M-v 则属于另一种类型的例外。当给定一个参数时,它们将滚动你指 定的 “行数”,而不是 “屏数”。举例来说,C-u 8 C-v 将文本向下滚动 8 行。

现在试试看,输入 C-u 8 C-v。
这个命令应该已经将文字向上滚动了 8 行。如果你想将它再次地向下滚动,你可 以给定一个参数然后执行 M-v。

如果你正在使用图形界面,比如 X 或者微软的 Windows,那么在 Emacs 窗 口的一边应该有一个长方形的区域叫 “滚动条”。你可以用鼠标操纵滚动条来滚动 文字。

如果你的鼠标有滚轮的话,你也可以使用滚轮来滚动。

3 如果 EMACS 失去响应(IF EMACS STOPS RESPONDING)

如果 Emacs 对你的命令失去响应,你可以用 C-g 来安全地终止这条命令。C-g 也可以终止一条执行过久的命令。

C-g 还可以取消数字参数和只输入到一半的命令。

输入 C-u 100 设定一个值为 100 的数字参数,然后按 C-g。
现在再按 C-f,光标应该只会移动一个字符,因为你已经用 C-g 取消了参数。

如果你不小心按了一下 ,你也可以用 C-g 来取消它。 【这个说法似乎有问题,因为按照这个按键顺序输入的应该是 C-M-g。 取消 的正确做法是再连按两次 。】

4 被禁用的命令(DISABLED COMMANDS)

有一些 Emacs 命令被 “禁用” 了,以避免初学者在不了解其确切功能的情况下误 用而造成麻烦。

如果你用到了一个被禁用的命令,Emacs 会显示一个提示消息,告诉你这个命令 到底是干什么的,询问你是否要继续,并在得到你的肯定之后再执行这命令。

如果你真的想用这条命令,在 Emacs 询问你的时候应该按空格。一般来说,如果 你不想用,就按 “n”。

试试 C-x C-l (这是一个被禁用的命令)
然后用 n 来回答询问。

5 窗格(WINDOWS)

Emacs 可以有多个 “窗格”,每个窗格显示不同的文字。后面会介绍怎么对付多个窗格,现在我们先学会如何关掉多余的窗格。其实也很简单:

C-x 1 只保留一个窗格(也就是关掉其它所有窗格)。

也就是先按 CONTROL-x 然后再按 1。C-x 1 会保留光标所在的窗格,并将其扩大到整个屏幕,同时关掉所有其它的窗格。

把光标移到本行然后输入 C-u 0 C-l。
输入 C-h k C-f。观察当一个新窗格出现时当前窗格(用来显示C-f 命令的文档)是如何缩小的。

输入 C-x 1 关掉文档窗格。
有一系列命令是以 CONTROL-x 开始的,这些命令许多都跟 “窗格、文件、缓冲区 【缓冲区(buffer)会在后文详细介绍】” 等等诸如此类的东西有关,其中有些 命令可能包含了 2 个、3 个或者 4 个字符。

6 插入与删除(INSERTING AND DELETING)

插入文字很简单,直接敲键盘就可以了。普通的字符,比如 A、7、* 等等,会 随着你的输入而插入。要插入一个换行符,输入 (这个键在键盘上有 时会被标注成 “Enter”)。

你可以用 来删除光标左边的字符,这个键通常被标注为 “Backspace”――跟 你在 Emacs 之外的用法应该一样,删除最后一个输入的字符。

你的键盘上可能有另外一个键,标注着 ,但那个不是我们所说的

如果一行文字很长、超出了窗格的宽度,显示不下的部分会在紧邻的下一行继续 显示。如果你使用的是图形界面,文本区域两边的狭窄区域(左右 “边缘”)会出 现小小的转弯箭头,表明这是某一行的接续显示。如果你使用的是文本终端,接 续显示由屏幕最右边一列的一个反斜线来表示。

好,现在你应该已经掌握了最基本的的文本插入和修改功能,其实删除还可以 “以词为单位”进行,下面是一个关于 “删除” 操作的小结:

删除光标前的一个字符
C-d 删除光标后的一个字符

M- 移除光标前的一个词
M-d 移除光标后的一个词

C-k 移除从光标到“行尾”间的字符
M-k 移除从光标到“句尾”间的字符

【可能你已经注意到了 “删除(delete)” 和“移除(kill)”的用词区别,后文会有详细说明。】

注意 “ 和 C-d” 还有 “M- 和 M-d” 是根据前述惯例从 C-f 和 M-f 衍生 出来的(其实 < DEL > 不是控制字符,我们先忽略这一点)。C-k 和 M-k 的关系在 某种程度上与 C-e 和 M-e 一样――如果把 “一行” 和“一句”作一个类比的话。

你也可以用一种通用的办法来移除缓冲区里的任何一部分:首先把光标移动到你 想要移除的区域的一端,然后按 C- 指空格)【注意,C- 往 往被中文用户设定成输入法热键,如果这样,C- 就被系统拦截而无法传递 给 Emacs 了,在这种情况下可以使用 C-@。】,然后将光标移动到你准备移除的 文字的另一端。这个时候, Emacs 会高亮光标和你按下 C- 之间的文本。 最后,按下 C-w 。这样就可以把位于这两点之间的所有文字移除了。

移动光标到上一段开头的“你”字。
输入 C- 。Emacs 应该会在屏幕的下方显示一个“Mark set”的消息。
移动光标到第二行中的“端”字。
输入 C-w,从“你”开始到“端”之前的文字被全部移除。

注意,“移除(kill)”和 “删除(delete)” 的不同在于被移除的东西可以被重新 插入(在任何位置),而被删除的就不能使用相同的方法重新插入了(不过可以 通过撤销一个删除命令来做到,后文会提到)。【实际上,移除掉的东西虽然看 起来 “消失” 了,但实际上被 Emacs 记录了下来,因此还可以找回来;而删除掉 的东西虽然也可能还在内存里,但是已经被 Emacs“抛弃”了,所以就找不回来 了。】重新插入被移除的文字称为“召回(yank)”。一般而言,那些可能消除很 多文字的命令会把消除掉的文字记录下来(它们被设定成了“可召回”),而那些 只消除一个字符或者只消除空白的命令就不会记录被消除的内容(自然你也就无 法召回了)。

移动光标到一非空白行的行头,然后输入 C-k 移除那一行上的文字。
再次 C-k,你可以看到它移除了跟在那一行后面的换行符。

注意,单独的 C-k 会把一行的内容移除,而第二个 C-k 则会移除换行符,并使 其后所有的行都向上移动。C-k 处理数字参数的方式很特别,它会把参数指定的 那么多行连同其后的换行符一起移除,而不仅仅是重复 C-k 而已。比如 C-u 2 C-k 会把两行以及它们的换行符移除;而如果只是输入 C-k 两次显然不是这个结果。

重新插入被移除的文字恢复的动作称为 “召回(yanking)”。(就好像把别人从你身边 移走的东西又猛力地拉回来。)你可以在你删除文字的地方召回,也可以在别的 地方召回,还可以多次召回同样的文字以得到它的多个拷贝。很多其它的编辑器 把移除和召回叫做“剪切” 和“粘贴” (详情可见 Emacs 使用手册里的术语表)。

召回的命令是 C-y。它会在光标所在处插入你最后移除的文字。

C-y 可以召回最近一次移除的内容,那如何召回前几次移除的内容呢?它们当然 没有丢,你可以用 M-y 来召回它们。在用 C-y 召回最近移除的文字之后,紧接 着再按 M-y 就可以召回再前一次被移除的内容,再按一次 M-y 又可以召回再上 一次的…… 连续使用 M-y 直到找到你想要召回的东西,然后什么也不用做,继续 编辑就行了。

如果连续按 M-y 很多次,你可能会回到起始点,也就是最近移除的文字。 【看得出这实际上是一个环。】

7 撤销(UNDO)

如果你修改了一段文字,又觉得改得不好,可以用 undo 命令进行撤销:C-/。

通常 C-/ 会消除一个命令所造成的所有改变;如果你在一行中连续多次地使用 C-/,你会把以前的命令也依次撤销。

但是有两个例外: 1) 没有改变文字的命令不算(包括光标移动命令和滚动命令) 2) 从键盘输入的字符以组为单位――每组最多 20 个字符――来进行处理。 (这是为了减少你在撤销 “插入文字” 动作时需要输入 C-/ 的次数)

用 C-k 将这一行移除,然后输入 C-/ ,它会再次出现。
C-_ 也是撤销命令;它的作用跟 C-/ 一样,但是它比较容易多次输入。在 某些终端上,输入 C-/ 实际上向 Emacs 发送的是 C-_ 。 另外, C-x u 和 C-/ 完全一样,但是按起来有些麻烦。

数字参数对于 C-/ 、 C-_ 和 C-x u 的意义是执行撤销的重复次数。

8 文件(FILE)

想保存工作成果就要记得存盘,否则一旦退出 Emacs 你编辑的文字就会丢失。要 存盘,就要在编辑前 “寻找” 到一个存盘文件。(这个过程通常也被称为“访问” 文件。)

寻找到一个文件意味着你可以在 Emacs 里查看这个文件的内容。从许多角度看, 这就等于你在直接编辑这个文件,只是你所做的修改只有在 “存盘” 的时候才会 被写入文件。也正因为如此,你可以丢弃一个写到一半的文件而不必把这个残缺 文件也保存到计算机上。在存盘的时候,Emacs 会把存盘前的文件重命名保存, 以防你改完之后又想反悔。

在屏幕的下方,你应该能够看到头部有短线 “-” 的一行,行首通常是一些诸如 “ -:— TUTORIAL.cn” 的文字,这些文字代表了你当前正在访问的文件。比如你现 在正在访问的文件是对 Emacs 快速指南的一份临时拷贝,叫做“TUTORIAL.cn”。 每当 Emacs 寻找到一个文件,文件名就会出现在这个位置。

寻找文件的命令有一个特点,那就是你必须给出文件名。我们称这个命令 “读入 了一个参数”(在这里,这个参数显然就是文件名)。在你输入这条命令之后:

C-x C-f 寻找一个文件
Emacs 会提示你输入文件名。你输入的文件名会出现在屏幕最底端的一行,这一 行被称为小缓冲(minibuffer),在小缓冲里你可以使用通常的 Emacs 编辑命令 来编辑文件名。

在小缓冲里输入文件名(其实输入其它东西也一样)时可以用 C-g 取消。

输入 C-x C-f,然后输入 C-g
这会关掉小缓冲,同时也会取消使用小缓冲的 C-x C-f 命令。 当然了,你也没有找任何文件。

结束文件名的输入。之后,小缓冲会消失,C-x C-f 将会去寻找你 指定的文件。小缓冲在 C-x C-f 命令结束之后也会消失。

文件被显示在了屏幕上,你可以开始编辑了。存盘用这条命令:

C-x C-s 储存这个文件
这条命令把 Emacs 中的文字存储到文件中。第一次存盘的时候 Emacs 会将原文 件重命名以备份。重命名的规则通常是在原文件名之后添加一个 “~” 字符。 【对许多人来说,这是一个烦人的特性,关掉文件备份可以用如下命令: M-x customize-variable make-backup-files

存盘结束后,Emacs 会显示写入文件的文件名。你最好养成经常存盘的习惯,这 可以减少系统崩溃和死机给你带来的损失(也可参见下面的 “自动保存” 一节)。

输入 C-x C-s TUTORIAL.cn
这将会把该指南保存为一个名为 TUTORIAL.cn 的文件,并且在屏幕的下方显 示一条消息:“Wrote …TUTORIAL.cn”。

你不但可以寻找一个已有的文件来查看或编辑,还可以寻找一个不存在的文件。 实际上这正是 Emacs 创建新文件的方法:找到不存在的新文件。事实上,只有 在存盘的时候,Emacs 才会真正创建这个文件。而在这之后的一切就跟编辑一个 已有文件没有区别了。

9 缓冲区(BUFFER)

你可以用 C-x C-f 找到并打开第二个文件,但第一个文件仍然在 Emacs 中。要 切回第一个文件,一种办法是再用一次 C-x C-f。这样,你就可以在 Emacs 中同 时打开多个文件。

Emacs 把每个编辑中的文件都放在一个称为 “缓冲区(buffer)” 的地方。每寻 找到一个文件,Emacs 就在其内部开辟一个缓冲区。用下面的命令可以列出当前 所有的缓冲区:

C-x C-b 列出缓冲区

现在就试一下 C-x C-b
观察一下缓冲区是如何被命名的,它很可能跟与其对应的文件同名。实际上,一 个 Emacs 窗格里的任何文字都是某个缓冲区的一部分。

输入 C-x 1 离开缓冲区列表
不管存在多少缓冲区,任何时候都只能有一个 “当前” 缓冲区,也就是你正在编 辑的这个。如果你想编辑其它的缓冲区,就必须 “切换” 过去。上面讲过,用 C-x C-f 是一种办法。不过还有一个更简单的办法,那就是用 C-x b。用这条命 令,你必须输入缓冲区的名称。

通过输入 C-x C-f foo 创建一个名为“foo”的文件。
然后输入 C-x b TUTORIAL.cn 回到这里。

大多数情况下,缓冲区与跟其对应的文件是同名的(不包括目录名),不过这也 不是绝对的。用 C-x C-b 得到的缓冲区列表总是显示缓冲区名。

缓冲区未必有对应文件。显示缓冲区列表的缓冲区(叫做 “Buffer List”)就 是这样。这个 TUTORIAL.cn 缓冲区起初没有对应的文件,但是现在有了,因为 在前一节你输入了 C-x C-s , 将它保存成了一个文件。

Messages” 缓冲区也没有对应文件,这个缓冲区里存放的都是在 Emacs 底部 出现的消息。

输入 C-x b Messages 瞅瞅消息缓冲区里都有什么东西。
然后再输入 C-x b TUTORIAL.cn 回到这里。

如果你对某个文件做了些修改,然后切换到另一个文件,这个动作并不会帮你把 前一个文件存盘。对第一个文件的修改仍然仅存在于 Emacs 中,也就是在它对 应的缓冲区里。并且,对第二个文件的修改也不会影响到第一个文件。这很有用, 但也意味着你需要一个简便的办法来保存第一个文件的缓冲区。先切换回那个缓 冲区,再用 C-x C-s 存盘,太麻烦了。你需要一个更简便的方法,而 Emacs 已 经为你准备好了:

C-x s 保存多个缓冲区
C-x s 会找出所有已被修改但尚未存盘的缓冲区,然后向你逐个询问:是否需要存盘?

插入一行文字,然后输入 C-x s。
它应该会问你,是否要储存名为 TUTORIAL.cn 的缓冲区? 按 “y” 告诉它你想存盘。

10 命令集扩展(EXTENDING THE COMMAND SET)

Emacs 的命令就像天上的星星,数也数不清。把它们都对应到 CONTROL 和 META 组合键上显然是不可能的。Emacs 用扩展(eXtend)命令来解决这个问题,扩展 命令有两种风格:

C-x 字符扩展。 C-x 之后输入另一个字符或者组合键。
M-x 命令名扩展。M-x 之后输入一个命令名。

很多扩展命令都相当有用,虽然与你已经学过的命令比起来,他们可能不那么常 用。我们早已经见过一些扩展命令了,比如用 C-x C-f 寻找文件和用 C-x C-s 保存文件;退出 Emacs 用的 C-x C-c 也是扩展命令。(不用担心退出 Emacs 会 给你带来什么损失,Emacs 会在退出之前提醒你存盘的。)

如果你使用图形界面,你不需要任何特殊的命令来切换 Emacs 和其他应用程序。 你可以使用鼠标或者窗口管理器的命令。然而,如果你使用只能同时显示一个应 用程序的文本终端,你需要 “挂起” Emacs ,以切换到其他的应用程序。

C-z 可以暂时离开 Emacs――当然,你还可以再回来。在允许 C-z 的系统中,C-z 会把 Emacs“挂起”,也就是说,它会回到 shell 但不杀死 Emacs 的进程。在常用的 shell 中,通常可以用 “fg” 或者 “%emacs” 命令再次回到 Emacs 中。

你最好在打算退出登陆的时候再用 C-x C-c。在把 Emacs 当做一个临时的编辑 器的时候(比如被一个邮件处理程序调用),也可以用 C-x C-c 退出。

C-x 的扩展命令有很多,下面列出的是你已经学过的:

C-x C-f 寻找文件。
C-x C-s 保存文件。
C-x C-b 列出缓冲区。
C-x C-c 离开 Emacs。
C-x 1 关掉其它所有窗格,只保留一个。
C-x u 撤销。

用命令名扩展的命令通常并不常用,或只用在部分模式下。比如 replace-string(字符串替换)这个命令,它会把一个字符串替换成另一个。在 输入 M-x 之后,Emacs 会在屏幕底端向你询问并等待你输入命令名。如果你想 输入 “replace-string”,其实只需要敲“repl s” 就行了,Emacs 会帮你自动补齐。输入完之后按 提交。

字符串替换命令需要两个参数――被替换的字符串和用来替换它的字符串。每个参数的输入都以换行符来结束。

11 自动保存(AUTO SAVE)

如果你已经修改了一个文件,但是还没来得及存盘你的计算机就罢工了,那么你 所做的修改就很可能会丢失。为了避免这样的不幸发生,Emacs 会定期将正在编 辑的文件写入一个 “自动保存” 文件中。自动保存文件的文件名的头尾各有一个 “#”字符,比如你正在编辑的文件叫“hello.c”,那么它的自动保存文件就叫 “#hello.c#”。这个文件会在正常存盘之后被 Emacs 删除。

所以,假如不幸真的发生了,你大可以从容地打开原来的文件(注意不是自动保 存文件)然后输入 M-x recover file 来恢复你的自动保存文件。在 提示确认的时候,输入 yes

12 回显区(ECHO AREA)

如果 Emacs 发现你输入多字符命令的节奏很慢,它会在窗格的下方称为 “回显区” 的地方给你提示。回显区位于屏幕的最下面一行。

13 状态栏(MODE LINE)

位于回显区正上方的一行被称为 “状态栏”。状态栏上会显示一些信息,比如:

-:**- TUTORIAL.cn 63% L749 (Fundamental)

状态栏显示了 Emacs 的状态和你正在编辑的文字的一些信息。

你应该知道文件名的意思吧?就是你找到的那个文件嘛。-NN%– 显示的是光标在 全文中的位置。如果位于文件的开头,那么就显示 –Top– 而不是 –00%–;如 果位于文件的末尾,就显示 –Bot–。如果文件很小,一屏就足以显示全部内容, 那么状态栏会显示 –All–。

“L” 和其后的数字给出了光标所在行的行号。

最开头的星号(*)表示你已经对文字做过改动。刚刚打开的文件肯定没有被改动 过,所以状态栏上显示的不是星号而是短线(-)。

状态栏上小括号里的内容告诉你当前正在使用的编辑模式。缺省的模式是 Fundamental,就是你现在正在使用的这个。它是一种 “主模式”。

Emacs 的主模式林林总总。有用来编辑程序代码的――比如 Lisp 模式;也有用 来编辑各种自然语言文本的――比如 Text 模式。任何情况下只能应用一个主模 式,其名称会显示在状态栏上,也就是现在显示 “Fundamental” 的地方。

主模式通常会改变一些命令的行为。比方说,不管编辑什么语言的程序代码,你 都可以用一个相同的命令来添加注释。但是在不同的语言中注释的语法往往是不 同的,这时不同的主模式就会用各自不同的语法规则来添加注释。主模式都是可 以用 M-x 启动的扩展命令,M-x fundamental-mode 就可以切换到 Fundamental 模式。

编辑自然语言文本――比如现在――应该用 Text 模式。

输入 M-x text-mode
别担心,什么都没变。不过细心一些可以发现,M-f 和 M-b 现在把单引号(’) 视为词的一部分了。而在先前的 Fundamental 模式中,M-f 和 M-b 都将单引号 视为分隔单词的符号。

主模式通常都会搞一些类似的小动作,因为很多命令其实完成的是 “相同的工 作”,只是在不同环境下会有不同的工作方式而已。【所谓 “求同存异”,在 Emacs 里得到了很好的体现】

用 C-h m 可以查看当前主模式的文档。

把光标移动到下一行。
用 C-l C-l 将本行带到屏幕的最上方。
输入 C-h m,看看 Text 模式与 Fundamental 模式有哪些不同。
输入 C-x 1 关掉文档窗格。

主模式之所以称之为 “主(major)” 模式,是因为同时还有“辅模式”(minor mode)存在。辅模式并不能替代主模式,而是提供一些辅助的功能。每个辅模式 都可以独立地开启和关闭,跟其它辅模式无关,跟主模式也无关。所以你可以不 使用辅模式,也可以只使用一个或同时使用多个辅模式。

有一个叫做自动折行(Auto Fill)的辅模式很有用,特别是在编辑自然语言文本 的时候。启用自动折行后,Emacs 会在你打字超出一行边界时自动替你换行。

用 M-x auto-fill-mode 启动自动折行模式。再用一次这条命令,自 动折行模式会被关闭。也就是说,如果自动折行模式没有被开启,这个命令会开 启它;如果已经开启了,这个命令会关闭它。所以我们说,这个命令可以用来 “开关(toggle)” 模式。

现在输入 M-x auto-fill-mode 。然后随便敲点什么,直到你看到它
分成两行。你必须敲一些空格,因为 Auto Fill 只在空白处进行断行。 【输入空格对英文来说是必须的,而对中文则不必。】

行边界通常被设定为 70 个字符【这里指英文字符】,你可以用 C-x f 命令配合 数字参数来重新设定它。

输入 C-x f 并传递参数 20: C-u 2 0 C-x f。
然后输入一些文字,观察 Emacs 的自动折行动作 最后再用 C-x f 将边界设回 70。

如果你在段落的中间做了一些修改,那么自动折行模式不会替你把整个段落重新 折行,你需要用 M-q 手动折行。注意,光标必须位于你需要折行的那一段里。

移动光标到前一段中,然后输入 M-q。

14 搜索(SEARCHING)

Emacs 可以向前或向后搜索字符串(“字符串” 指的是一组连续的字符)。搜索命 令是一个移动光标的命令:搜索成功后,光标会停留在搜索目标出现的地方。

Emacs 的搜索命令是 “渐进的(incremental)”。意思是搜索与输入同时进行: 你在键盘上一字一句地输入搜索词的过程中,Emacs 就已经开始替你搜索了。

C-s 是向前搜索,C-r 是向后搜索。

在按下 C-s 之后,回显区里会有 “I-search” 字样出现,表明目前 Emacs 正处 于 “渐进搜索” 状态,并等待你输入搜索字串。按 可以结束搜索。

输入 C-s 开始一个搜索。注意敲慢一点,一次输入一个字符。
慢慢输入 “cursor” 这个词,每敲一个字都停顿一下并观察光标。 现在你应该已曾经找到 “cursor” 这个词了。

再按一次 C-s,搜索下一个“cursor”出现的位置。
现在按四次 ,看看光标是如何移动的。
结束搜索。

看仔细了么?在一次渐进式搜索中,Emacs 会尝试跳到搜索目标出现的位置。要 跳到下一个命中位置,就再按一次 C-s。如果找不到目标,Emacs 会发出 “哔” 的一声,告诉你搜索失败。在整个过程中,都可以用 C-g 来终止搜索。【你会发 现 C-g 会让光标回到搜索开始的位置,而 则让光标留在搜索结果上, 这是很有用的功能。】

在渐进式搜索中,按 会 “撤回” 到最近一次搜索的命中位置。如果之前没 有一个命中, 会抹去搜索字符串中的最后一个字符。比如你已经输入了 “c”,光标就停在 “c” 第一次出现的位置,再输入 “u”,光标停在“cu” 第一次出现 的位置,这时再按 ,“u”就从搜索字串中消失了,然后光标会回到 “c” 第 一次出现的位置。

另外,如果你在搜索的时候输入了 control 或者 meta 组合键的话,搜索可能会 结束。(也有例外,比如 C-s 和 C-r 这些用于搜索的命令。)

前面说的都是 “向下” 搜索,如果想 “向上” 搜索,可以用 C-r。C-r 与 C-s 相比除了搜索方向相反之外,其余的操作都一样。

15 多窗格(MULTIPLE WINDOWS)

Emacs 的迷人之处很多,能够在屏幕上同时显示多个窗格就是其中之一。

连续使用 C-x o 可以遍历所有窗格。“被选中的窗格”,也就是绝大多数的编辑 操作所发生的地方,是在你不打字时闪烁光标的那个窗格。其他的窗格有它们自 己的光标位置; 如果你在图形界面下运行 Emacs ,这些光标是镂空的长方形。

当你在一个窗格中编辑,但用另一个窗格作为参考的时候,C-M-v 是很有用的命 令。无需离开被选中的窗格,你就可以用 C-M-v 命令滚动另外一个窗格中的文 字。【比如翻译和校对就很适合用这种方式进行。】

C-M-v 是一个 CONTROL-META 组合键。如果你有 META (或 Alt)键的话,可以 同时按住 CONTROL 和 META 键并输入 v。CONTROL 和 META 键先按哪个都可以, 因为它们只是用来 “修饰(modify)” 你输入的字符的。

如果你并没有 META 键,你也可以用 ESC 来代替,不过这样的话就要注意按键顺 序了:你必须先输入 ESC ,然后再输入 CONTROL-v。CONTROL-ESC v 是没用的, 因为 ESC 本身是一个字符键,而不是一个修饰键(modifier key)。

(在上方窗格里)输入 C-x 1 关掉下方窗格。
(如果你在下方的窗格里输入 C-x 1,那么就会关掉上方的窗格。你可以把这个 命令看成是 “只保留一个窗格”――就是我们正在编辑的这个。)

不同的窗格可以显示不同的缓冲区。如果你在一个窗格里用 C-x C-f 打开了一个 文件,另一个窗格并不会发生什么变化。任何一个窗格里都可以用来打开文件。

用下面的方法可以在一个新开窗格里打开文件:

输入 C-x 4 C-f,紧跟着输入一个文件名,再用 结束。
可以看到你指定的文件出现在下方的窗格中,同时光标也跳到了那里。

输入 C-x o 回到上方的窗格,然后再用 C-x 1 关掉下方窗格。

16 多窗口(MULTIPLE FRAMES)

Emacs 可以创建多个窗口。窗口由许多窗格以及菜单、滚动条、回显区等组成。 在图形界面下,多个窗口可以同时显示出来。在文本终端中,只能同时显示一个 窗口。

输入 M-x make-frame
可以看到一个新的窗口出现在了你的屏幕上。

你可以在新的窗口里做最初的窗口里可以做的任何事情。第一个窗口没有什么特 别的。

输入 M-x delete-frame .
这个命令将会关闭选中的窗口。

你也可以通过图形系统来关闭某个窗口(通常是在窗口上面的某个角落里的一个 “X” 按钮)。如果你关闭的是 Emacs 进程的最后一个窗口, Emacs 将会退出。

17 递归编辑(RECURSIVE EDITING LEVELS)

有时候你会进入所谓的 “递归编辑”。递归编辑状态由位于状态栏的方括号所指 示,其中包含了用小括号来指明的模式名称。比如说,你有时可能会看到 [(Fundamental)],而不是 (Fundamental)。【比如在用 M-% 进行交互式替换的 时候你又用了 C-s 进行搜索,这时替换模式并没有结束,但你又进入了搜索模式, 这就是所谓的递归编辑。】

离开递归编辑可以用 ESC ESC ESC。这是一个最通用的 “离开” 命令,你甚至可 以使用它来关掉多余的窗格,或者离开小缓冲。

输入 M-x 进入小缓冲;然后输入 ESC ESC ESC 离开。
你不能用 C-g 退出递归编辑,因为 C-g 的作用是取消 “本层递归编辑之内” 的 命令和其参数(arguments)。

18 获得更多帮助(GETTING MORE HELP)

本快速指南的目的仅仅是帮助你在 Emacs 的海洋里下水,不至于束手无策望洋兴 叹。有关 Emacs 的话题可谓汗牛充栋,这里自然是难尽万一。不过 Emacs 很理 解你求知若渴的心情,因为它提供的强大功能实在是太多了。为此,Emacs 提供 了一些命令来查看 Emacs 的命令文档,这些命令都以 CONTROL-h 开头,这个字 符也因此被称为 “帮助(Help)字符”。

要使用帮助(Help)功能,请先输入 C-h,然后再输入一个字符以说明你需要什 么帮助。如果你连自己到底需要什么帮助都不知道,那么就输入 C-h ?,Emacs 会告诉你它能提供了哪些帮助。如果你按了 C-h 又想反悔,可以用 C-g 取消。

(如果你按 C-h 之后没有任何帮助信息显示出来,那么试试 F1 键或者 M-x help 。)

最基本的帮助功能是 C-h c。输入 C-h c 之后再输入一个组合键,Emacs 会给出 这个命令的简要说明。

输入 C-h c C-p。
显示的消息应该会是这样:

C-p runs the command previous-line
这条消息显示了 C-p 命令对应的函数名。命令的功能由函数完成,所以函数名 本身也可以被看成是最简单的文档――至少对于你已经学过的命令来说,它们的函 数名足以解释它们的功能了。

多字符命令一样可以用 C-h c 来查看。

想得到更多的信息,请把 C-h c 换成 C-h k 试试看。

输入 C-h k C-p。
上面的命令会新打开一个 Emacs 窗格以显示函数的名称及其文档。你读完之后可 以用 C-x 1 关掉这个帮助窗格。当然你并不需要立即这样做,你完全可以先在编 辑窗格里做点别的事情,然后再关掉帮助窗格。

还有一些其它有用的 C-h 命令:

C-h f 解释一个函数。需要输入函数名。

试试看,输入 C-h f previous-line
Emacs 会给出它所知道的所有有关 “实现 C-p 命令功能的函数” 的信息。

C-h v 用来显示 Emacs 变量的文档。Emacs 变量可以被用来 “定制 Emacs 的行 为”。同样,你需要输入变量的名称。

C-h a 相关命令搜索(Command Apropos)。 输入一个关键词然后 Emacs 会列出所有命令名中包含此关键词 的命令。
这些命令全都可以用 M-x 来启动。对于某些命令来说, 相关命令搜索还会列出一两个组合键。

输入 C-h a file
Emacs 会在另一个窗格里显示一个 M-x 命令列表,这个列表包含了所有名称中含 有 “file” 的命令。你可以看到像 “C-x C-f” 这样的组合键显示在“find-file” 这样的命令名的旁边。

用 C-M-v 来回滚动 help 窗格,多试几次。
输入 C-x 1 来删除 help 窗格。

C-h i 阅读手册(也就是通常讲的 Info)。
这个命令会打开一个称为 “info” 的特殊缓冲区,在那里, 你可以阅读安装在系统里的软件包使用手册。要读 Emacs 的使用手册,按 m emacs 就可以了。如果你之前从没用过 Info 系统,那么请按“?”,Emacs 会带你进入 Info 的使用指南。在看完本快速指南之后,Emacs Info 会成为你的主要参考文档。