TUTORIAL.cn 53 KB
Newer Older
1
Emacs 快速指南.(查看版权声明请至本文末尾)
Kenichi Handa's avatar
Kenichi Handa committed
2

3
【注意:位于【】之间的内容是译注,比如本行,下同。】
Kenichi Handa's avatar
Kenichi Handa committed
4

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

9 10
 C-<chr>  表示当输入字符 <chr> 时按住 CONTROL 键。
          因此 C-f 就表示:按住 CONTROL 键再输入 f。
Kenichi Handa's avatar
Kenichi Handa committed
11

12 13 14 15
 M-<chr>  表示当输入字符 <chr> 时按住 META(或 EDIT 或 ALT)键。
          如果你的键盘上没有 META 、EDIT 或 ALT 键,用下述方法也等效:
          先按一下 ESC 键然后放开,再输入 <chr>。我们用 <ESC> 来表示
          ESC 键。
Kenichi Handa's avatar
Kenichi Handa committed
16

17 18 19
重要提示:要退出 Emacs,请用 C-x C-c(两个连续的组合键)。
要退出一个正在运行中的命令,请用 C-g。
下文中左边顶行的“>>”字样用来提示你尝试键盘命令。比如:
Kenichi Handa's avatar
Kenichi Handa committed
20
<<Blank lines inserted around following line by help-with-tutorial>>
21 22 23 24
[本页当中特意留出一些空白是出于教学目的,请继续往后阅读]
>> 现在输入 C-v (查看下一屏文字)移动到下一屏。
   (别紧张,在输入字符 v 的同时注意要按住 CONTROL 键)
   从现在开始,每读完当前一屏你都需要这样做一次。
Kenichi Handa's avatar
Kenichi Handa committed
25

26 27
值得注意的是,当你从上一屏滚到下一屏时,中间会有两行的重复;这样做是为
了维持滚屏的连续性,方便你顺畅、连续地阅读。
Kenichi Handa's avatar
Kenichi Handa committed
28

29 30 31
用编辑器,开门第一件事就是学会在文字中移动。你已经知道了 C-v 可以向下移
动一屏,要往上移,请用 M-v (也就是按住 META 键,然后输入v,如果你没有
META、EDIT 或 ALT 键那么就先按 <ESC> 再按 v)。
Kenichi Handa's avatar
Kenichi Handa committed
32

33
>>  试试 M-v,然后再试试 C-v,来回遛几次。
Kenichi Handa's avatar
Kenichi Handa committed
34 35


36
* 小结(SUMMARY)
Kenichi Handa's avatar
Kenichi Handa committed
37
-----------------
Kenichi Handa's avatar
Kenichi Handa committed
38

39
以下命令在翻页浏览时相当有用:
Kenichi Handa's avatar
Kenichi Handa committed
40

41 42 43 44
        C-v     向前移动一屏
        M-v     向后移动一屏
        C-l     重绘屏幕,并将光标所在行置于屏幕的中央
                (注意是 CONTROL-L,不是 CONTROL-1)
Kenichi Handa's avatar
Kenichi Handa committed
45

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

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

Kenichi Handa's avatar
Kenichi Handa committed
54

55
* 基本的光标控制(BASIC CURSOR CONTROL)
Kenichi Handa's avatar
Kenichi Handa committed
56 57
----------------------------------------

58
整屏的移动很有用,但是如何在文字中精确定位呢?
Kenichi Handa's avatar
Kenichi Handa committed
59

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

64
                             上一行 C-p
Kenichi Handa's avatar
Kenichi Handa committed
65 66
                                  :
                                  :
67
            向左移 C-b .... 目前光标位置 .... 向右移 C-f
Kenichi Handa's avatar
Kenichi Handa committed
68 69
                                  :
                                  :
70
                             下一行 C-n
Kenichi Handa's avatar
Kenichi Handa committed
71

72 73
>> 用 C-n 或 C-p 将光标移到上图的中央。
   按 C-l,整幅图会被显示在屏幕的中央。
Kenichi Handa's avatar
Kenichi Handa committed
74

75 76 77
“P N B F”四个字母分别代表了四个词,用这四个词记忆这些组合键会更容易:
P 代表 previous(上一行),N 代表 next(下一行),B 代表 backward(回
退),而 F 则代表 forward(前进)。这些组合键今后将与你形影不离。
Kenichi Handa's avatar
Kenichi Handa committed
78

79
>> 按几次 C-n 把光标往下挪到这里。
Kenichi Handa's avatar
Kenichi Handa committed
80

81 82
>> 用 C-f 把光标移动到这一行,然后再用 C-p 往上挪。
   注意观察当光标在一行的中央时 C-p 命令的行为。
Kenichi Handa's avatar
Kenichi Handa committed
83

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

87 88
>> 在一行的行头输入 C-b。
   光标应该会移动到前一行的行尾,因为光标在回退过程中越过了换行符。
Kenichi Handa's avatar
Kenichi Handa committed
89

90
同样 C-f 也可以像 C-b 一样越过换行符。
Kenichi Handa's avatar
Kenichi Handa committed
91

92 93 94
>> 连按几次 C-b,感受一下光标的移动。
   然后按几次 C-f 回到本行的行尾。
   再按一次 C-f,光标会移动到下一行。
Kenichi Handa's avatar
Kenichi Handa committed
95

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

100
>> 用 C-n 将光标下移,一直越过屏幕边界,同时观察发生了什么变化。
Kenichi Handa's avatar
Kenichi Handa committed
101

102 103 104
如果你嫌一个字符一个字符地挪光标太慢,你还可以一个词一个词地跳。M-f
(META-f) 可以将光标往前移动一个词,而 M-b 则是往后移。【这里的“词”指
英文单词,对中文来说,则是指移动到下一个标点符号。】
Kenichi Handa's avatar
Kenichi Handa committed
105

106
>> 试试 M-f 和 M-b。
Kenichi Handa's avatar
Kenichi Handa committed
107

108 109
如果光标停在一个词的中间,M-f 会移动到这个词的末尾。如果光标处于词与词
之间的空白处,M-f 会移动到下一个词的末尾。M-b 的功能类似,只是方向相反。
Kenichi Handa's avatar
Kenichi Handa committed
110

111 112
>> 按几次 M-f 和 M-b,中间夹杂一些 C-f 和 C-b。
   你可以观察到 M-f 和 M-b 在不同位置上所表现出来的不同行为。
Kenichi Handa's avatar
Kenichi Handa committed
113

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

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

121 122
>> 按两次 C-a,再按两次 C-e。
   按两次 M-a,再按两次 M-e。
Kenichi Handa's avatar
Kenichi Handa committed
123

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

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

130
这里对简单的光标移动命令做一个总结,其中也包括了整词和整句的移动:
Kenichi Handa's avatar
Kenichi Handa committed
131

132 133
        C-f     向右移动一个字符
        C-b     向左移动一个字符
Kenichi Handa's avatar
Kenichi Handa committed
134

135 136
        M-f     向右移动一个词【对中文是移动到下一个标点符号】
        M-b     向左移动一个词【对中文是移动到上一个标点符号】
Kenichi Handa's avatar
Kenichi Handa committed
137

138 139
        C-n     移动到下一行
        C-p     移动到上一行
Kenichi Handa's avatar
Kenichi Handa committed
140

141 142
        C-a     移动到行首
        C-e     移动到行尾
Kenichi Handa's avatar
Kenichi Handa committed
143

144 145
        M-a     移动到句首
        M-e     移动到句尾
Kenichi Handa's avatar
Kenichi Handa committed
146

147
>> 把上面所有的命令都练习几次,这些可都是最常用的命令。
Kenichi Handa's avatar
Kenichi Handa committed
148

149 150
这里还要介绍两个重要的光标移动命令:M-< (META 小于号)可以将光标移动到
所有文字的最开头;M-> (META 大于号)可以将光标移动到所有文字的最末尾。
Kenichi Handa's avatar
Kenichi Handa committed
151

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

156 157
>> 试一试 M-< ,移到本快速指南的最开始。
   然后再按几次 C-v 回到这里。
Kenichi Handa's avatar
Kenichi Handa committed
158

159 160
>> 试一试 M-> ,移到本快速指南的最末尾。
   然后再按几次 M-v 回到这里。
Kenichi Handa's avatar
Kenichi Handa committed
161

162 163 164 165 166
如果你的键盘上有方向键的话,也可以用它们来移动光标。不过我们有三个理由
推荐你学习 C-b 、C-f 、C-n 、和 C-p:(1)它们在任何键盘上都能用。(2)
当你熟练使用 Emacs 之后,你会发现用这些组合键比用方向键要快得多,因为你
的手不需要离开打字区。(3)一旦你习惯了使用这些组合键,你也可以很容易地
适应其它更高级的光标移动命令。
Kenichi Handa's avatar
Kenichi Handa committed
167

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

175
举例来说, C-u 8 C-f 会向前移动 8 个字符。
Kenichi Handa's avatar
Kenichi Handa committed
176

177 178
>> 为 C-n 或者 C-p 指定一个数字参数,这样你可以只用一个命令就把光标移动
   到本行的附近。
Kenichi Handa's avatar
Kenichi Handa committed
179

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

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

187
>> 现在试试看,输入 C-u 8 C-v。
Kenichi Handa's avatar
Kenichi Handa committed
188

189 190
这个命令应该已经将文字向上滚动了 8 行。如果你想将它再次地向下滚动,你可
以给定一个参数然后执行 M-v。
Kenichi Handa's avatar
Kenichi Handa committed
191

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

196
如果你的鼠标有滚轮的话,你也可以使用滚轮来滚动。
Kenichi Handa's avatar
Kenichi Handa committed
197

198
* 如果 EMACS 失去响应(IF EMACS STOPS RESPONDING)
Kenichi Handa's avatar
Kenichi Handa committed
199
-----------------------------------------------
Kenichi Handa's avatar
Kenichi Handa committed
200

201 202
如果 Emacs 对你的命令失去响应,你可以用 C-g 来安全地终止这条命令。C-g
也可以终止一条执行过久的命令。
Kenichi Handa's avatar
Kenichi Handa committed
203

204
C-g 还可以取消数字参数和只输入到一半的命令。
Kenichi Handa's avatar
Kenichi Handa committed
205

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

209 210 211
如果你不小心按了一下 <ESC>,你也可以用 C-g 来取消它。
【这个说法似乎有问题,因为按照这个按键顺序输入的应该是 C-M-g。
  取消 <ESC> 的正确做法是再连按两次 <ESC>。】
Kenichi Handa's avatar
Kenichi Handa committed
212 213


214
* 被禁用的命令(DISABLED COMMANDS)
Kenichi Handa's avatar
Kenichi Handa committed
215
-----------------------------------
Kenichi Handa's avatar
Kenichi Handa committed
216

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

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

223 224
如果你真的想用这条命令,在 Emacs 询问你的时候应该按空格。一般来说,如果
你不想用,就按“n”。
Kenichi Handa's avatar
Kenichi Handa committed
225

226 227
>> 试试 C-x C-l (这是一个被禁用的命令)
   然后用 n 来回答询问。
Kenichi Handa's avatar
Kenichi Handa committed
228 229


230
* 窗格(WINDOWS)
Kenichi Handa's avatar
Kenichi Handa committed
231
-----------------
Kenichi Handa's avatar
Kenichi Handa committed
232

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

236
        C-x 1   只保留一个窗格(也就是关掉其它所有窗格)。
Kenichi Handa's avatar
Kenichi Handa committed
237

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

241
>> 把光标移到本行然后输入 C-u 0 C-l。
Kenichi Handa's avatar
Kenichi Handa committed
242

243 244
>> 输入 C-h k C-f。观察当一个新窗格出现时当前窗格(用来显示
   C-f 命令的文档)是如何缩小的。
Kenichi Handa's avatar
Kenichi Handa committed
245

246
>> 输入 C-x 1 关掉文档窗格。
Kenichi Handa's avatar
Kenichi Handa committed
247

248 249 250
有一系列命令是以 CONTROL-x 开始的,这些命令许多都跟“窗格、文件、缓冲区
【缓冲区(buffer)会在后文详细介绍】”等等诸如此类的东西有关,其中有些
命令可能包含了 2 个、3 个或者 4 个字符。
Kenichi Handa's avatar
Kenichi Handa committed
251 252


253
* 插入与删除(INSERTING AND DELETING)
Kenichi Handa's avatar
Kenichi Handa committed
254
--------------------------------------
Kenichi Handa's avatar
Kenichi Handa committed
255

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

260 261
你可以用 <DEL> 来删除光标左边的字符,这个键通常被标注为“Backspace”――跟
你在 Emacs 之外的用法应该一样,删除最后一个输入的字符。
Kenichi Handa's avatar
Kenichi Handa committed
262

263
你的键盘上可能有另外一个键,标注着 <Delete>,但那个不是我们所说的 <DEL>。
Kenichi Handa's avatar
Kenichi Handa committed
264

265
>> 现在就来试试――敲点字,然后按几下 <DEL> 删除它们。
266
   不用担心文件被修改,你做什么都没关系,这里就是专给你练习用的。
Kenichi Handa's avatar
Kenichi Handa committed
267

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

273 274
>> 输入文字,一直到屏幕的右边界,然后继续。
你会看到一个接续行出现。
Kenichi Handa's avatar
Kenichi Handa committed
275

276
>> 用 <DEL> 删掉一些文字,直到此行长度小于窗格宽度,接续行就消失了。
Kenichi Handa's avatar
Kenichi Handa committed
277

278 279 280
换行符跟其它字符一样可以被删除。两行中间的换行符被删除后,这两行将会合
并成一行。如果合并后的这一行太长,超出了窗格宽度,它就会以一个接续行来
显示。
Kenichi Handa's avatar
Kenichi Handa committed
281

282
>> 移动光标到某行的开头并输入 <DEL>。
283
   这时该行将与其前一行一起被合并为一行。
Kenichi Handa's avatar
Kenichi Handa committed
284

285
>> 输入 <Return> 重新插入你刚才删除的换行符。
Kenichi Handa's avatar
Kenichi Handa committed
286

Xue Fuqiao's avatar
Xue Fuqiao committed
287 288
<Return> 是一个特殊的键,因为按下这个键后,得到的可能不仅仅是一个换行
符。根据周围文本的不同,Emacs 可能会在换行符之后插入一些空白字符,这样,
Xue Fuqiao's avatar
Xue Fuqiao committed
289
当你在新的一行开始打字时,文本会自动与前一行对齐。
Xue Fuqiao's avatar
Xue Fuqiao committed
290

Xue Fuqiao's avatar
Xue Fuqiao committed
291
>> 这是一个自动缩进的例子。
Xue Fuqiao's avatar
Xue Fuqiao committed
292 293 294 295 296
   在这一行的末尾输入 <Return>。

可以看到,在插入换行符之后,Emacs 插入了空格,因此光标移动到了“在”这个
字的下面。

297 298
前面讲过,大部分的 Emacs 命令都可以指定重复次数,这其中也包括输入字符的
命令。重复执行输入字符的命令实际上就是输入多个相同的字符。
Kenichi Handa's avatar
Kenichi Handa committed
299

300
>>  试试 C-u 8 *,这将会插入 ********。
Kenichi Handa's avatar
Kenichi Handa committed
301

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

305
        <DEL>        删除光标前的一个字符
306
        C-d          删除光标后的一个字符
Kenichi Handa's avatar
Kenichi Handa committed
307

308
        M-<DEL>      移除光标前的一个词
309
        M-d          移除光标后的一个词
Kenichi Handa's avatar
Kenichi Handa committed
310

311 312
        C-k          移除从光标到“行尾”间的字符
        M-k          移除从光标到“句尾”间的字符
Kenichi Handa's avatar
Kenichi Handa committed
313

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

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

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

328
>> 移动光标到上一段开头的“你”字。
329
>> 输入 C-<SPC> 。Emacs 应该会在屏幕的下方显示一个“Mark set”的消息。
330 331
>> 移动光标到第二行中的“端”字。
>> 输入 C-w,从“你”开始到“端”之前的文字被全部移除。
Kenichi Handa's avatar
Kenichi Handa committed
332

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

343
>> 移动光标到一非空白行的行头,然后输入 C-k 移除那一行上的文字。
Kenichi Handa's avatar
Kenichi Handa committed
344

345
>> 再次 C-k,你可以看到它移除了跟在那一行后面的换行符。
Kenichi Handa's avatar
Kenichi Handa committed
346

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

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

358
召回的命令是 C-y。它会在光标所在处插入你最后移除的文字。
Kenichi Handa's avatar
Kenichi Handa committed
359

360
>> 试试看,输入 C-y 将文字召回。
Kenichi Handa's avatar
Kenichi Handa committed
361

362 363
如果你一次连按了好几下 C-k,那么所有被移除的行会被存储在一起,只要一个
C-y 就可以把它们都召回。
Kenichi Handa's avatar
Kenichi Handa committed
364

365
>> 在这里试试,连续按几次 C-k。
Kenichi Handa's avatar
Kenichi Handa committed
366

367
现在再来恢复刚刚被我们移除的文字:
Kenichi Handa's avatar
Kenichi Handa committed
368

369 370
>> 按 C-y。然后把光标往下移动几行,再按一次 C-y。
   现在你应该知道怎么复制文字了。
Kenichi Handa's avatar
Kenichi Handa committed
371

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

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

381 382 383 384 385 386
>> 移除一行,移动一下光标,然后再移除另外一行。
   按 C-y 将第二次移除的那行召回来。
   紧接着再按 M-y,它将会被第一次移除的那行取代。
   试着再按几下 M-y 看看会发生什么。
   再继续,直到第二行被召回来,然后再做个几次。
   如果感兴趣,你可以试着给 M-y 指定一个正的或负的参数。
Kenichi Handa's avatar
Kenichi Handa committed
387

Kenichi Handa's avatar
Kenichi Handa committed
388

389
* 撤销(UNDO)
Kenichi Handa's avatar
Kenichi Handa committed
390 391
--------------

392
如果你修改了一段文字,又觉得改得不好,可以用 undo 命令进行撤销:C-/。
Kenichi Handa's avatar
Kenichi Handa committed
393

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

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

402
>> 用 C-k 将这一行移除,然后输入 C-/ ,它会再次出现。
Kenichi Handa's avatar
Kenichi Handa committed
403

404 405 406
C-_ 也是撤销命令;它的作用跟 C-/ 一样,但是它比较容易多次输入。在
某些终端上,输入 C-/ 实际上向 Emacs 发送的是 C-_ 。
另外, C-x u 和 C-/ 完全一样,但是按起来有些麻烦。
Kenichi Handa's avatar
Kenichi Handa committed
407

408
数字参数对于 C-/ 、 C-_ 和 C-x u 的意义是执行撤销的重复次数。
Kenichi Handa's avatar
Kenichi Handa committed
409 410


411
* 文件(FILE)
Kenichi Handa's avatar
Kenichi Handa committed
412
--------------
Kenichi Handa's avatar
Kenichi Handa committed
413

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

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

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

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

432
        C-x C-f   寻找一个文件
Kenichi Handa's avatar
Kenichi Handa committed
433

434 435 436
Emacs 会提示你输入文件名。你输入的文件名会出现在屏幕最底端的一行,这一
行被称为小缓冲(minibuffer),在小缓冲里你可以使用通常的 Emacs 编辑命令
来编辑文件名。
Kenichi Handa's avatar
Kenichi Handa committed
437

438
在小缓冲里输入文件名(其实输入其它东西也一样)时可以用 C-g 取消。
Kenichi Handa's avatar
Kenichi Handa committed
439

440 441 442
>> 输入 C-x C-f,然后输入 C-g
   这会关掉小缓冲,同时也会取消使用小缓冲的 C-x C-f 命令。
   当然了,你也没有找任何文件。
Kenichi Handa's avatar
Kenichi Handa committed
443

444 445
用 <Return> 结束文件名的输入。之后,小缓冲会消失,C-x C-f 将会去寻找你
指定的文件。小缓冲在 C-x C-f 命令结束之后也会消失。
Kenichi Handa's avatar
Kenichi Handa committed
446

447
文件被显示在了屏幕上,你可以开始编辑了。存盘用这条命令:
Kenichi Handa's avatar
Kenichi Handa committed
448

449
        C-x C-s   储存这个文件
Kenichi Handa's avatar
Kenichi Handa committed
450

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

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

459 460 461
>> 输入 C-x C-s TUTORIAL.cn <Return> 。
   这将会把该指南保存为一个名为 TUTORIAL.cn 的文件,并且在屏幕的下方显
   示一条消息:“Wrote ...TUTORIAL.cn”。
Kenichi Handa's avatar
Kenichi Handa committed
462

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


469
* 缓冲区(BUFFER)
Kenichi Handa's avatar
Kenichi Handa committed
470
------------------
Kenichi Handa's avatar
Kenichi Handa committed
471

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

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

480
        C-x C-b   列出缓冲区
Kenichi Handa's avatar
Kenichi Handa committed
481

482
>> 现在就试一下 C-x C-b
Kenichi Handa's avatar
Kenichi Handa committed
483

484 485
观察一下缓冲区是如何被命名的,它很可能跟与其对应的文件同名。实际上,一
个 Emacs 窗格里的任何文字都是某个缓冲区的一部分。
Kenichi Handa's avatar
Kenichi Handa committed
486

487
>> 输入 C-x 1 离开缓冲区列表
Kenichi Handa's avatar
Kenichi Handa committed
488

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

494
>> 通过输入 C-x C-f foo <Return> 创建一个名为“foo”的文件。
495
   然后输入 C-x b TUTORIAL.cn <Return> 回到这里。
Kenichi Handa's avatar
Kenichi Handa committed
496

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

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

“*Messages*”缓冲区也没有对应文件,这个缓冲区里存放的都是在 Emacs 底部
出现的消息。
Kenichi Handa's avatar
Kenichi Handa committed
506

507 508
>> 输入 C-x b *Messages* <Return> 瞅瞅消息缓冲区里都有什么东西。
   然后再输入 C-x b TUTORIAL.cn <Return> 回到这里。
Kenichi Handa's avatar
Kenichi Handa committed
509

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

517
        C-x s   保存多个缓冲区
Kenichi Handa's avatar
Kenichi Handa committed
518

519 520
C-x s 会找出所有已被修改但尚未存盘的缓冲区,然后向你逐个询问:是否需要
存盘?
Kenichi Handa's avatar
Kenichi Handa committed
521

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


527
* 命令集扩展(EXTENDING THE COMMAND SET)
Kenichi Handa's avatar
Kenichi Handa committed
528
-----------------------------------------
Kenichi Handa's avatar
Kenichi Handa committed
529

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

534 535
        C-x     字符扩展。  C-x 之后输入另一个字符或者组合键。
        M-x     命令名扩展。M-x 之后输入一个命令名。
Kenichi Handa's avatar
Kenichi Handa committed
536

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

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

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

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

553
C-x 的扩展命令有很多,下面列出的是你已经学过的:
Kenichi Handa's avatar
Kenichi Handa committed
554

555 556 557 558 559 560
        C-x C-f         寻找文件。
        C-x C-s         保存文件。
        C-x C-b         列出缓冲区。
        C-x C-c         离开 Emacs。
        C-x 1           关掉其它所有窗格,只保留一个。
        C-x u           撤销。
Kenichi Handa's avatar
Kenichi Handa committed
561

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

568 569
字符串替换命令需要两个参数――被替换的字符串和用来替换它的字符串。每个
参数的输入都以换行符来结束。
Kenichi Handa's avatar
Kenichi Handa committed
570

571 572
>> 将光标移到本行下面第二行的空白处,然后输入
   M-x repl s<Return>changed<Return>altered<Return>。
Kenichi Handa's avatar
Kenichi Handa committed
573

574 575
   【以下保留一行原文,以应练习之需:】
   Notice how this line has changed: you've replaced...
Kenichi Handa's avatar
Kenichi Handa committed
576

577 578
请注意这一行的变化:在光标之后的范围内,你已经将“changed”这个词――不
论它在哪里出现――全部用“altered”替换掉了。
Kenichi Handa's avatar
Kenichi Handa committed
579 580


581
* 自动保存(AUTO SAVE)
Kenichi Handa's avatar
Kenichi Handa committed
582
-----------------------
Kenichi Handa's avatar
Kenichi Handa committed
583

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

590
所以,假如不幸真的发生了,你大可以从容地打开原来的文件(注意不是自动保
591 592
存文件)然后输入 M-x recover file <Return> 来恢复你的自动保存文件。在
提示确认的时候,输入 yes<Return>。
Kenichi Handa's avatar
Kenichi Handa committed
593 594


595
* 回显区(ECHO AREA)
Kenichi Handa's avatar
Kenichi Handa committed
596
---------------------
Kenichi Handa's avatar
Kenichi Handa committed
597

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


602
* 状态栏(MODE LINE)
Kenichi Handa's avatar
Kenichi Handa committed
603
---------------------
Kenichi Handa's avatar
Kenichi Handa committed
604

605
位于回显区正上方的一行被称为“状态栏”。状态栏上会显示一些信息,比如:
Kenichi Handa's avatar
Kenichi Handa committed
606

607
 -:**- TUTORIAL.cn 63% L749 (Fundamental)
Kenichi Handa's avatar
Kenichi Handa committed
608

609
状态栏显示了 Emacs 的状态和你正在编辑的文字的一些信息。
Kenichi Handa's avatar
Kenichi Handa committed
610

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

616
“L” 和其后的数字给出了光标所在行的行号。
Kenichi Handa's avatar
Kenichi Handa committed
617

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

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

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

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

634
编辑自然语言文本――比如现在――应该用 Text 模式。
Kenichi Handa's avatar
Kenichi Handa committed
635

636
>> 输入 M-x text-mode <Return>。
Kenichi Handa's avatar
Kenichi Handa committed
637

638 639 640
别担心,什么都没变。不过细心一些可以发现,M-f 和 M-b 现在把单引号(')
视为词的一部分了。而在先前的 Fundamental 模式中,M-f 和 M-b 都将单引号
视为分隔单词的符号。
Kenichi Handa's avatar
Kenichi Handa committed
641

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

646
用 C-h m 可以查看当前主模式的文档。
Kenichi Handa's avatar
Kenichi Handa committed
647

648 649
>> 把光标移动到下一行。
>> 用 C-l C-l 将本行带到屏幕的最上方。
650 651
>> 输入 C-h m,看看 Text 模式与 Fundamental 模式有哪些不同。
>> 输入 C-x 1 关掉文档窗格。
Kenichi Handa's avatar
Kenichi Handa committed
652

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

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

661 662 663 664
用 M-x auto-fill-mode <Return> 启动自动折行模式。再用一次这条命令,自
动折行模式会被关闭。也就是说,如果自动折行模式没有被开启,这个命令会开
启它;如果已经开启了,这个命令会关闭它。所以我们说,这个命令可以用来
“开关(toggle)”模式。
Kenichi Handa's avatar
Kenichi Handa committed
665

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

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

673 674 675
>> 输入 C-x f 并传递参数 20: C-u 2 0 C-x f。
   然后输入一些文字,观察 Emacs 的自动折行动作
   最后再用 C-x f 将边界设回 70。
Kenichi Handa's avatar
Kenichi Handa committed
676

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

680
>> 移动光标到前一段中,然后输入 M-q。
Kenichi Handa's avatar
Kenichi Handa committed
681 682


683
* 搜索(SEARCHING)
Kenichi Handa's avatar
Kenichi Handa committed
684 685
-------------------

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

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

692
C-s 是向前搜索,C-r 是向后搜索。不过手别这么快!别着急试。
Kenichi Handa's avatar
Kenichi Handa committed
693

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

697 698 699 700
>> 输入 C-s 开始一个搜索。注意敲慢一点,一次输入一个字符。
   慢慢输入“cursor”这个词,每敲一个字都停顿一下并观察光标。
   现在你应该已曾经找到“cursor”这个词了。
>> 再按一次 C-s,搜索下一个“cursor”出现的位置。
701
>> 现在按四次 <DEL> ,看看光标是如何移动的。
702
>> 敲 <Return> 结束搜索。
Kenichi Handa's avatar
Kenichi Handa committed
703

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

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

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

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


723
* 多窗格(MULTIPLE WINDOWS)
Kenichi Handa's avatar
Kenichi Handa committed
724
----------------------------
Kenichi Handa's avatar
Kenichi Handa committed
725

726
Emacs 的迷人之处很多,能够在屏幕上同时显示多个窗格就是其中之一。
Kenichi Handa's avatar
Kenichi Handa committed
727

728
>> 移动光标到这一行,然后输入 C-l C-l。
Kenichi Handa's avatar
Kenichi Handa committed
729

730 731
>> 现在输入 C-x 2,它会将屏幕划分成两个窗格。
   这两个窗格里显示的都是本篇快速指南,而光标则停留在上方的窗格里。
Kenichi Handa's avatar
Kenichi Handa committed
732

733 734 735
>> 试试用 C-M-v 滚动下方的窗格。
   (如果你并没有 META 键,用 ESC C-v 也可以。)
   【向上滚动是 C-M-S-v,也就是同时按住 CONTROL、META 和 SHIFT 再按 v】
Kenichi Handa's avatar
Kenichi Handa committed
736

737 738
>> 输入 C-x o(“o”指的是“其它(other)”),
   将光标转移到下方的窗格。
Kenichi Handa's avatar
Kenichi Handa committed
739

740 741
>> 在下方的窗格中,用 C-v 和 M-v 来滚动。
   同时继续在上方的窗格里阅读这些指导。
Kenichi Handa's avatar
Kenichi Handa committed
742

743 744
>> 再输入 C-x o 将光标移回到上方的窗格里。
   光标会回到它在上方窗格中原本所在的位置。
Kenichi Handa's avatar
Kenichi Handa committed
745

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

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

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

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

762
>> (在上方窗格里)输入 C-x 1 关掉下方窗格。
Kenichi Handa's avatar
Kenichi Handa committed
763

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

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

770
用下面的方法可以在一个新开窗格里打开文件:
Kenichi Handa's avatar
Kenichi Handa committed
771

772 773
>> 输入 C-x 4 C-f,紧跟着输入一个文件名,再用 <Return> 结束。
   可以看到你指定的文件出现在下方的窗格中,同时光标也跳到了那里。
Kenichi Handa's avatar
Kenichi Handa committed
774

775
>> 输入 C-x o 回到上方的窗格,然后再用 C-x 1 关掉下方窗格。
Kenichi Handa's avatar
Kenichi Handa committed
776 777


778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
* 多窗口(MULTIPLE FRAMES)
------------------

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

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

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

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

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


798
* 递归编辑(RECURSIVE EDITING LEVELS)
Kenichi Handa's avatar
Kenichi Handa committed
799
--------------------------------------
Kenichi Handa's avatar
Kenichi Handa committed
800

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

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