分类: LINUX
2008-12-03 22:41:41
在缓冲区中输入和更改文本,以及在文本中进行导航,是您在 Emacs 中最重要的操作,无论您是在编辑文件,创建新文件,还是仅仅想研读某个文件,都要用到它们。
在此部分,您将学习用来完成下述工作的基本按键序列和命令:如何在缓冲区中输入文本,如何在文本中导航,以及如何对文本进行基本的编辑,如删除字符和单词。
正如您在从头创建一个新文件这一部分看到的,在 Emacs 缓冲区中输入文本是很容易的,您只要动手打字就行。您可以键入字母字符,将其输入某个缓冲区中。
Emacs 有时会被称为无模式编辑器, 常被拿来与模式编辑器如 vi 等作比较。这意味着编辑器的行为以及您可以键入的键盘输入和命令在您的会话中是保持不变的,与 vi 等编辑器不同,后者的击键会根据您是在命令模式还是在输入模式而有不同的含义。Emacs 没有这类模式;不过,它确实有一种不同的模式,可以用来更改其行为或扩展其功能,这将是本系列的下一篇教程的主题。
在进行普通的输入时,有些事是您必须记住的。
在 Emacs,有一个重要的概念,被称为插入点,它表示字符的插入位置。这是缓冲区中一个想像的位置,处于光标所在字符和前一个字符之间。
每当您在缓冲区中输入文本时,该文本都会在这个点插入。在缺省情况下,所有文本都在同一行,在这个点之后的文本会向右推移,为您插入的内容让出空间。按 Enter,移到下一行,然后再按一下 Enter,插入一个空白行。
请试着在 practice.b 的开始处插入一段文本。
$ emacs practice.b |
Tyger! Tyger! burning bright |
现在您的 practice.b 缓冲区应如图 5 所示。
您会看到,在您键入时光标会一直跟随,插入点保持不变:从您键入第一个句子开始,您键入的一切内容都被插入字母 O 之前。
要 移动插入点,您可以使用方向键,而且正如您预期的那样,所有其他与光标动作有关的键都可供使用,如 PgUp、PgDn、Home 和 End。但 Emacs 自带用来移动光标的键绑定,而且因为您不必将手移到键盘的基准键之外就能使用它们,所以您在打字时会觉得它们非常有用。
正如您在学习如何键入 Meta 组合键部分中看到的,您可以使用 C-p
将光标向上移动到上一行;类似地,C-n
将光标向下移动到下一行。C-f
会向前移动到下一个字符,而 C-b
会向后移动到上一个字符。
如果不想用 PgDn 和 PgUp 键向上和向下移动一屏,请使用 C-v
和 M-v
这两种键盘输入,它们可起到与前两个键相同的作用。要转至当前行的开始处,请使用 C-a
;使用 C-e
,转到当前行的结尾。
通常 Meta 键会被绑定到某个命令,这与相应的 Ctrl 键类似,对于移动命令,这条规则也同样适用。当使用 Meta 来代替 Ctrl 时,F 和 B 键可以向前和向后移动一个单词 而不是一个字符,而 A 和 E 键可以移动到当前句子的开头和结尾。(在缺省配置中,没有定义 M-n
和 M-p
键盘输入。)
表 3 列出了各种移动和导航的键,以及它们的函数名和描述。试着用它们移动到缓冲区的开头、结尾,和中间的某些位置。
键盘输入 | 函数 | 描述 |
---|---|---|
C-p ,UpArrow
|
previous-line
| 将插入点向上移动到上一行。 |
C-n , DownArrow
|
next-line
| 将插入点向下移动到下一行。 |
C-f , RightArrow
|
forward-char
| 将插入点移动到下一个字符。 |
C-b , LeftArrow
|
back-char
| 将插入点移动到上一个字符。 |
M-f
|
forward-word
| 将插入点移动到下一个单词。 |
M-b
|
backward-word
| 将插入点移动到上一个单词。 |
C-v , PgDn
|
scroll-up
| 将文本向上滚动一屏。 |
M-v , PgUp
|
scroll-down
| 将文本向下滚动一屏。 |
Home
|
beginning-of-buffer
| 将插入点移到缓冲区的开始处。(在某些版本中,这个键被缺省定义为移动到当前行的开始处。) |
End
|
end-of-buffer
| 将插入点移到缓冲区的末尾。(在某些版本中,这个键被缺省定义为移动到当前行的末尾。) |
C-a
|
beginning-of-line
| 将插入点移到本行的开始处。 |
C-e
|
end-of-line
| 将插入点移到本行的结尾。 |
M-a
|
beginning-of-sentence
| 将插入点移到句子的开始处。 |
M-e
|
end-of-sentence
| 将插入点移到句子的结尾处。 |
C-{
|
beginning-of-paragraph
| 将插入点移到段落的开始处。 |
C-}
|
end-of-paragraph
| 将插入点移到段落的结尾处。 |
正如您看到的,您键入的文本被插入到插入点处。不过您也可以改写现有的文本。按一下 Ins 键;这将切换到改写模式,该模式在缺省情况下是关闭的。查看模式行,您会看到 Ovwrt,说明该模式已处于活动状态。
使用表 3 中描述的移动命令,移动光标,使之处于 we 中的 w 处,然后键入一个 h 字符。
请试着转至缓冲区的顶部:键入 M-a M-a C-f
,将光标移到 y,然后输入一个 i 字符。对于下一个 y,采取同样的操作,键入 M-f C-f C-f C-f i
,以使缓冲区看起来如图 6 所示。
再按一下 Ins,关闭改写模式。
文本并不仅限于用字母键输入。您可以输入控制字符,也可以根据字符代码输入字符。为此您可以执行引用插入,该命令被绑定到 C-q
;此后再按一个键(或组合键)如 Ctrl 组合键,以便在插入点输入该键。您还可以输入一个字符代码值(用八进制表示),然后再按 Enter 键。
移到缓冲区的末尾,键入 Page break here
,然后按 Enter。现在键入一个分页符,即 Ctrl-l 代表的字符,在它的后面接一个转义字符,该转义字符的八进制字符值为 033: C-q C-l C-q 033 Enter
.
现在您可以试试 Emacs 中的一些工具,这些工具用来处理现有文本以及撤消(和重复)您已经做出的操作。
使用 Backspace 或 Del 键,删除插入点左边的字符。试着用这两个键删除您刚才输入的两个控制字符。
要删除插入点的字符,请用 C-d
;类似地,M-d
会从插入点开始,删除到单词的末尾。您还可以向回删除,M-Del
和 M-Backspace
都可以从插入点一直删除到单词的开头。
试着用这些命令删除您刚刚输入的 Page break here 这个句子,然后删除这些单词所在的空行。
将光标移动到文件的最后一行(应该是“What the hand dare seize the fire?”这个句子),然后按几次 M-d
,把这一行删除。
啊呀,如果您并不想删除最后一句怎么办?您可以通过运行 undo
函数把它找回来。该函数被绑定到 C-_
,您要键入它,请按住 Ctrl,并用 Shift 键输入下划线。请回到最后一行试试,每个单词操作一次,找回这些单词。
多操作几遍,直到 Page break here 重新显示为止。
现在您又对上次的撤消操作感到后悔了,您确实不想要 Page break here 了。您可以重复您撤消的操作,方法是键入 C-g
,这将取消所有的撤消操作,然后多次键入 C-_
使单词再次消失。
C-u
是一个通用参数命令,后面接一个数字和一个命令。它将按某个次数多次运行特定的命令。
尝试以下操作:移动到第二句诗的开始处,键入 In what distant d
,然后再键入 C-u 2 e
,这将写入两个 e 字符。输入以下内容,完成诗句:
ps or skies |
键入 C-x C-s
,保存您的缓冲区,现在的显示结果如 图 7 所示。
在没有数字参数的情况下,C-u
会假定这个数字为 4。如果您将 C-u
本身作为参数,则 4 会自乘,得到 16;您可以在反复自乘任意多次之后再指定一个命令,如 C-u C-u C-u A
会在插入点处键入 64 个 A。
请用一个 C-b
,向回移动,您会看到光标会回到前面的一行。现在试试通用参数,键入 C-u C-b
;注意光标向回移动了四个字符(而不是一个)。再试试 C-u C-u C-b
,注意光标会向左移动 16 个字符。键入 C-u C-u C-u C-b
,然后再指定 1000 作为参数:C-u 1000 C-b
。光标会移动到缓冲区的开始处,但请注意,Emacs 会发出蜂鸣声,这表明它在完成要求的操作次数之前就已经到了缓冲区的顶部(无法再向回移动了)。
我们来总结一下刚才学到了什么。在您继续学习下一部分之前,请看看表 4,它列出了重要的编辑命令和执行这些命令时用的缺省键盘输入。
键盘输入 | 函数 | 描述 |
---|---|---|
Ins |
overwrite-mode
| 切换改写模式(缺省为关闭)。 |
BackspaceDel
|
delete-backward-char
| 删除插入点前的字符。 |
C-d
|
delete-char
| 删除插入点处的字符。 |
M-d
|
kill-word
| 从插入点开始向前删除字符,直到单词末尾。 |
M-Backspace ,M-Del
|
backward-kill-word
| 从插入点开始向回删除字符,直至单词的开始处。 |
C-_
|
undo
| 撤消您的上一次键入或操作 |
C-q
字符 或 XXX
|
quoted-insert
| 在插入点插入按键本身代表的字符或由八进制数字(XXX)表示的字符。 |
C-u
次数
命令
|
universal-argument
| 按总的次数(缺省为 4 次)连续执行命令。 |