emacs入门教程

来源:互联网 发布:重启linux服务器命令 编辑:程序博客网 时间:2024/05/21 14:08
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-v (查看下一屏文字)移动到下一屏。
   (别紧张,在输入字符 v 的同时注意要按住 CONTROL 键)
   从现在开始,每读完当前一屏你都需要这样做一次。

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

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

>> 试试 M-v,然后再试试 C-v,来回遛几次。


* 小结(SUMMARY)
-----------------

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

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

>> 找到光标,留意其附近的文字,然后输入 C-l。
   找找光标在哪里,你会发现其附近的文字并没有变化。

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


* 基本的光标控制(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(前进)。这些组合键今后将与你形影不离。

>> 按几次 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 行,
而不是 8 屏。

>> 现在试试看,输入 C-u 8 C-v。

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

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

>> 试着在“滚动条内的反白区域”上按一下鼠标中键。
   文字应该会滚动到鼠标所指示的位置。

>> 当按住中键时,试着将鼠标上下移动。
   你会看到文字随着鼠标的移动而上下滚动。
   【Windows 版本符合 Windows 程序的传统操作习惯,上述操作不适用。】


* 在 EMACS 失去响应的时候(WHEN EMACS IS HUNG)
-----------------------------------------------

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

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

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

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


* 被禁用的命令(DISABLED COMMANDS)
-----------------------------------

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

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

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

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


* 窗格(WINDOWS)
-----------------

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

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

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

>> 把光标移到本行然后输入 C-u 0 C-l。

>> 输入 CONTROL-h k CONTROL-f。观察当一个新窗格出现时当前窗格(用来显示
   CONTROL-f 命令的文档)是如何缩小的。

>> 输入 C-x 1 关掉文档窗格。

这个命令跟先前学过的命令不太一样,因为它包含了两个字符,以 CONTROL-x 开
始。有一系列命令都是以 CONTROL-x 开始的,这些命令许多都跟“窗格、文件、
缓冲区【缓冲区(buffer)会在后文详细介绍】”等等诸如此类的东西有关,其
中有些命令可能包含了 2 个、3 个或者 4 个字符。


* 插入与删除(INSERTING AND DELETING)
--------------------------------------

插入文字很简单,直接敲键盘就可以了。你能看到的字符,比如 A、7、* 等等,
都被 Emacs 视为文字并且可以直接插入。敲 (回车键)会插入一个换
行符。

你可以用 来删除最后输入的一个字符,这个跟你在 Emacs 之外的用
法应该一样。一般来说 就是位于 键上方某处的一个大块头
的键,通常被标示为“Delete”、“Del”或者“Backspace”。

如果你找到了“Backspace”键,那么它应该就是 ;这时哪怕你又在别
的地方找到了一个“Del”键,那么它也应该不是 。

一种更通用的说法是, 将删除位于光标前的一个字符。

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

如果一行文字很长、超出了窗格的宽度,显示不下的部分会在紧邻的下一行继续
显示。这时会有一个反斜线(在控制台下是反斜线,如果你用图形窗口系统,则
应该是一个小小的转弯箭头)显示在右边沿,表明这是某一行的接续显示。

>> 输入文字,一直到屏幕的右边界,然后继续,你会看到一个接续行出现。

>> 用 删掉一些文字,直到此行长度小于窗格宽度,接续行就消失了。

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

>> 移动光标到某行的开头并输入 。
   这时该行将与其前一行一起被合并为一行。

>> 输入 重新插入你刚才删除的换行符。

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

>> 试试 C-u 8 *,这将会插入 ********。

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

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

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

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

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

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

你也可以用一种通用的办法来移除缓冲区里的任何一部分:首先把光标移动到你
想要移除的区域的一端,然后按 C-@ 或 C-SPC(任一即可,SPC指空格)【注意,
C-SPC 往往被中文用户设定成输入法热键,如果这样,C-SPC 就被系统拦截而无
法传递给 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)”。(就好像把别人从你身边
移走的东西又猛力地拉回来。)你可以在你删除文字的地方召回,也可以在别的
地方召回,还可以多次召回同样的文字以得到它的多个拷贝。

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

>> 试试看,输入 C-y 将文字召回。

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

>> 在这里试试,连续按几次 C-k。

现在再来恢复刚刚被我们移除的文字:

>> 按 C-y。然后把光标往下移动几行,再按一次 C-y。
   现在你应该知道怎么复制文字了。

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

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

>> 移除一行,移动一下光标,然后再移除另外一行。
   按 C-y 将第二次移除的那行召回来。
   紧接着再按 M-y,它将会被第一次移除的那行取代。
   试着再按几下 M-y 看看会发生什么。
   再继续,直到第二行被召回来,然后再做个几次。
   如果感兴趣,你可以试着给 M-y 指定一个正的或负的参数。
///////////////////////////////////////////////////////////////////////////
0 0
原创粉丝点击