整屏的移动很有用,但是如何在文字中精确定位呢?
有几种方式可以选择。用方向键当然可以,不过更有效率的方法是保持双手位于 主键盘区,然后使用 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(前进)。这些组合键今后将与你形影不离。
>> 按几次 C-n 把光标往下挪到这里。
>> 用 C-f 把光标移动到这一行,然后再用 C-p 往上挪。
注意观察当光标在一行的中央时 C-p 命令的行为。
每行文字都以一个“换行符”结束,“换行符”把行与行区分开来。(通常情况下, 一个文件的最后一行会有一个换行符,但是 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 逗号)。
>> 试一试 M-< ,移到本快速指南的最开始。
然后再按几次 C-v 回到这里。
>> 试一试 M-> ,移到本快速指南的最末尾。
然后再按几次 M-v 回到这里。
如果你的键盘上有方向键的话,也可以用它们来移动光标。不过我们有三个理由 推荐你学习 C-b 、C-f 、C-n 、和 C-p:(1)它们在任何键盘上都能用。(2) 当你熟练使用 Emacs 之后,你会发现用这些组合键比用方向键要快得多,因为你 的手不需要离开打字区。(3)一旦你习惯了使用这些组合键,你也可以很容易地 适应其它更高级的光标移动命令。
大部分的 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窗 口的一边应该有一个长方形的区域叫“滚动条”。你可以用鼠标操纵滚动条来滚动 文字。
如果你的鼠标有滚轮的话,你也可以使用滚轮来滚动。