Emacs 编辑环境,第 3 部分: 高级 Emacs 文本操作

使用这个著名的开放源代码编辑器

本教程是系列文章的第 3 部分,基于您在前两部分教程中所学习的内容,介绍一些用于文本操作的更高级的 Emacs 功能。您将学习高级编辑技术的实际示例,包括如何执行递归编辑、进行标记和使用文本矩形区块,以及使用剪切环 (kill ring) 和二次选择处理复杂的选择技术。

开始之前

了解本教程中包含的内容以及如何最好地利用本教程。

关于本系列

Emacs 编辑环境深受 UNIX® 开发人员的喜爱。它是世界公认的编辑器之王,但许多用户发现它学起来需要一定的过程。Emacs 环境初看起来并不是很直观,而且和其他编辑器和字处理器的工作方式不大一样。但 Emacs 的学习并不困难。一旦您熟悉了它,就会发现它有多么直观,而且越用越顺手。这个系列教程将为您提供指导,带您了解 Emacs 的基础知识,如它的功能、原理、按键命令布局和编辑文本的方法,然后深入它众多的强大编辑功能。

在完成本系列文章的学习后,您可以通过 Emacs 很方便地进行日常编辑工作,能越来越熟练地使用 Emacs,并对 Emacs 的许多高级功能有一个良好的认识。

关于本教程

这是了解 Emacs 的系列教程中的第三部分,基于您在前两部分教程中所学习的内容,介绍一些用于文本操作的更高级的 Emacs 功能。您将学习高级编辑技术的实际示例,包括如何执行递归编辑、进行标记和使用文本矩形区块,并了解使用剪切环和二次选择的复杂选择技术。

目标

本教程的主要目标是面向那些已经对 Emacs 文本编辑技术具有基本认识的用户,并向您展示如何以初级和中级技术为基础执行高级的编辑任务,如进行二次选择、进行递归编辑以及使用矩形区块。在完成本教程的学习之后,您应该熟悉所有的这些主题,并且能够在您的编辑会话中使用它们。

先决条件

本教程建立在本系列文章(请参见参考资料)的前两部分教程中所介绍的一些概念的基础之上,所以您应该在完成前两部分教程的学习之后,再开始学习本教程。在本教程的示例中,使用了来自第 1 部分中的练习文件。

在本系列文章第一个教程(“Emacs 编辑环境,第 1 部分:学习 Emacs 的基础知识”,请参见参考资料)的介绍部分中,描述了用于表示键盘输入的特殊 Emacs 符号,在本教程和整个系列文章中都将使用到这些特殊的符号。

尽管本教程面向所有不同级别的 UNIX 专业技术人员,但如果您至少对 UNIX 文件系统有基本的了解,将会很有帮助:

  • 文件
  • 目录
  • 权限
  • 文件系统层次结构

系统要求

本教程需要您在基于 UNIX 的系统中有一个用户帐户,且此系统中安装有最新版本的 Emacs。

Emacs 有几个版本;最原始,也是最流行的是 GNU Emacs,它是由 GNU 工程在线发布的(请参阅参考资料)。

您必须拥有较新版本的 GNU Emacs,即版本 20 或更高版本。版本 20 和 21 是最常见的,您也可以获得版本 22 的开发快照。本教程可与这些版本的 Emacs 中的任何一种配合使用。如果您的系统运行的是较老的版本,您应该进行升级。

为了了解您运行的是什么版本的 Emacs,请使用 GNU 风格的 --version 标志:

$ emacs --version
GNU Emacs 22.0.91.1
Copyright (C) 2006 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
$

修改 Emacs 的命令执行

当您开始研究一些使用 Emacs 进行文本编辑的高级技术时,您首先需要了解如何在 Emacs 中改变常规命令的执行,包括那些您已经掌握的命令。接下来所介绍的技术填补了您在本系列文章的前两个教程中所了解到的内容的一些空白,并向您介绍了与改变命令(在它们运行之前、期间、之后)相关的一些技术。

指定一个数字前缀

正如本系列文章的第 1 部分教程中所描述的(请参见参考资料),通用参数可以在命令的前面使用一个数字。但是当您仅希望指定一位的数字时,还有另一种可能更加快捷的方法:使用 digit-argument 功能,即同时键入 Meta 键与一位的数字: M-5 C-n.

前面的命令将运行 next-line 功能 C-n 五次。

要指定一位数字,可以使用 digit-argument。这种方法比使用通用参数命令(在这一示例中,它将是 C-u 5 C-n)更加快捷,因为它比使用通用参数命令少按一个键。

现在,尝试针对本系列文章的第 1 部分教程中的练习文件(您所保存的名为 practice.b 的文件)应用这种方法:

  1. 使用该文件启动 Emacs:

    $ emacs practice.b
  2. 通过执行下面的命令,将光标向下移动三行:
    M-3 C-n
  3. 将光标向后移动五个字符:
    M-- M-5 C-f

    请注意,负数将使得给定的命令按照相反的方式执行。(您可以使用 M-5 C-b 得到相同的结果。)

  4. 通过输入以下的命令,移动到缓冲区尾:

    M-9 M-9 M-9 C-f

    请注意,您可以通过在一行中组合使用多个 Meta 按键,以指定更长的、多位数字,这甚至比使用通用参数更加快捷。

  5. 插入几个空行:键入 M-4,然后按 Enter 键。

  6. 缩进八个空格:输入 M-8,然后按空格键。

  7. 使用 M-3 - 插入三个破折号。

现在,您的缓冲区应该与图 1 中所示类似。

图 1. 在 Emacs 中使用数字参数功能进行编辑
在 Emacs 中使用数字参数功能进行编辑

重复上一条命令

repeat 功能对于密集型编辑工作来说是很有用的。顾名思义,它可以重复执行您最近键入的命令。

尝试运行一个命令,并重复执行它:

  1. 键入 C-b 将光标向后移动一个字符。
  2. 使用 C-x z 重复执行一次。

您还可以反复地执行一个命令——通过再次键入 z,以便再次重复执行一次该命令;不断地键入 z 就可以反复地执行该命令。

尝试下面的操作:

  1. 键入 z 将光标向后移动一个字符。
  2. 多次键入 z,将光标向后移动多个字符。
  3. 键入 C-f 将光标向前移动一个字符。
  4. 键入 C-x z 以重复执行 forward-char 一次,然后键入 z 以重复执行该命令,直到 Emacs 发出提示声表示您已经到达缓冲区尾。

如果您在 repeat 命令之前使用一个数字(既可以是使用 Meta 键给定的数字,也可以是通过通用参数功能给定的数字),那么您就可以多次重复执行最近的命令。

通过键入 C-b M-5 M-0 C-x z 将光标向后移动 50 个字符,以便尝试这种方法。

执行递归编辑

您已经在本系列文章的第 2 部分教程中,即“Emacs 编辑环境,第 2 部分:学习 Emacs 的基本模式和编辑特性”(请参见参考资料),了解了各种用于搜索和替换文本的 Emacs 命令。正如在该教程中所描述的,replace-string 功能可以将给定的字符串替换为另一个字符串;query-replace(绑定到 M-%)可以完成相同的工作,但它在每一次替换前都会提示您,允许您判定是否应该进行给定的替换。

当您运行 query-replace 进行给定的替换时,可以选择使用的方法之一是递归编辑,它是一种特殊的 Emacs 功能,该功能允许您挂起当前的编辑任务,以便当该任务在后台等待的时候,您能够以交互的方式编辑缓冲区。为了说明您已经进入到递归编辑方式,使用方括号将模式行中的当前模式括起来。通过键入 C-M-c 退出递归编辑,即exit-recursive-edit 功能;当您执行该操作时,将从模式行中删除方括号,并且您退回到原始编辑任务或者进入递归编辑之前的上下文。

您可以通过运行 recursive-edit 功能,在任何时候进入递归编辑。顾名思义,您可以嵌套进行任何次数的递归编辑;您每次在进行递归编辑时,都会对模式行中的当前模式加上一对新的括号。

在使用 query-replace 的情况下,您在询问提示符处键入 C-r,以进入递归编辑。这允许您在进行特定的替换之前,停止您将要进行的替换,以便您能够编辑缓冲区;当您退出递归编辑时,您将会返回到该替换操作。

现在,请尝试下面的操作:

  1. 键入 M-% 以运行 query-replace 功能。
  2. 回答迷你缓冲区中的询问:
    • Query replace: o
    • Query replace o with: a
  3. 在第一个替换的位置,当受到询问时,可以通过键入 C-r 进行递归编辑:
    • 询问是否使用 a 替换 o:(? 用于帮助)C-r
  4. 通过键入 M-> 移动到缓冲区尾,然后在三个破折号后键入 William Bloke
  5. 键入 C-M-c 以退出递归编辑。
  6. 键入 n 以拒绝对第一个匹配项进行替换。
  7. 所找到的第二个匹配项是 Bloke 中的 o,该单词是您在 query-replace 功能运行之后键入的;键入 y 以替换它。

当退出这个功能时,您的缓冲区的最后一部分内容应该与图 2 中所示类似,且 Emacs 应该在迷你缓冲区中报告,它已经替换了给定字符串的一个匹配项。

图 2. 在 Emacs 询问替换期间,进行递归编辑之后
在 Emacs 询问替换期间,进行递归编辑之后

矩形区块

您是否曾经希望能够从文档中选择文本区块,以对其进行复制、剪切或者粘贴?您的确可以这样做。在 Emacs 中,我们将通过文本的四个角中任何两个相对的角所指定的文本选择称为矩形区块;接下来的部分将向您介绍如何有效地使用矩形区块。

标记一个矩形区块

要指定一个矩形区块,您只需要对矩形区块的四个假想的角中的任何一个设置标记,然后将光标移动到与该角相对的角。当您完成以上操作时,选定的两个角所包围的虚构文本块就是当前矩形区块。

当您运行下面的矩形区块命令之一时,将针对您所选择的文本执行相应的操作。Emacs 所有的矩形区块命令都是以 C-x r 开头的,本文在接下来的部分中对它们进行了说明。

删除一个矩形区块

有几种方法可以删除标注为矩形区块的文本。尽管这里描述的所有功能都适用于删除当前矩形区块,但其中每一个都具有不同的效果。

剪切一个矩形区块

使用 kill-rectangle 功能,C-x r k,可以剪切当前矩形区块。它与您所熟悉的常规 kill-line 功能相似:它删除该矩形区块中的所有字符,并且不用任何其他的字符来替换它们。位于该矩形区块右边的字符将自动地向左移动。

这一功能可以将矩形区块的内容保存到某个特殊的矩形区块剪切区域中,而不是保存到一般的剪切环中(请参见使用剪切环)。

现在,请尝试下面的操作:

  1. 将光标移动到以 What the hammer 开始的节的开头,并键入 C-space 以设置标记。
  2. 移动光标,使其恰好位于单词 terrors 之前,以指定一个包含四行的矩形区块(顺便提一下,该区块中每行包括三个单词)。
  3. 剪切您选择的矩形区块:键入 C-x r k

您所选择的矩形区块已经不存在了。请注意,该矩形区块右边的所有文本是如何进行移动,以填充该矩形区块所在位置的。

删除一个矩形区块

删除 您所标记的矩形区块中的字符,而不保存它们,可以使用 delete-rectangle,它绑定到了 C-x r d。这一命令用于删除矩形区块的区域,因此其效果看起来与剪切的矩形区块的效果相同(正如刚刚描述的);它们的区别在于,在执行该命令后,您无法再粘贴回所剪切的文本。

(然而,正如您在第一部分教程中所了解到的,您始终可以撤消 刚执行的操作。如果您在刚刚删除或者剪切了一个矩形区块之后键入 C-_,那么将恢复该矩形区块的原始文本。)

清除一个矩形区块

刚介绍的这两个用于删除矩形区块的命令都会删除该矩形区块所占据的整个空间。但是,您还可以清除 它,通过运行 clear-rectangle 功能,用空格字符替换整个区域,该功能与 C-x r c 进行了绑定。

尝试下面的操作:

  1. 移动光标,使其恰好位于行 On what wings dare he aspire? 中的单词 dare 之前,并通过键入 C-space 来设置标记。
  2. 要指定由两行中的单词 dare 组成的小的矩形区块,可以移动光标,使其恰好位于下面一行的单词 dare 之后。
  3. 键入 C-x r c 以清除您刚刚定义的矩形区块。

请注意,光标移动到该矩形区块的左下角。

打开一个矩形区块

最后,您可以打开 一个矩形区块,使用该矩形区块以指定一个将要添加空格的区域。要完成这项操作,可以标记一个矩形区块,然后运行 open-rectangle 功能,C-x r o。执行以上的操作,将使用空格字符填充整个矩形区块,并将原矩形区块中的所有文本向右移动。

现在,请尝试下面的操作:

  1. 将光标移动到缓冲区顶部,并通过键入 C-space 设置标记。
  2. 移动光标,使其恰好位于底部节中 Could 中的 Co 的后面。
  3. 通过键入 C-x r o 打开该矩形区块。

粘贴一个矩形区块

要在光标处粘贴上一次剪切的矩形区块的内容,可以运行 yank-rectangle,该操作与 C-x r y 进行了绑定。这一命令用于在光标处插入上一次剪切的矩形区块。在执行插入操作时,将该矩形区块中所有行的所有现有文本移动到右边。

尝试下面的操作:

  1. 将光标移动到文本中包含 what the chain 的节的开头:键入 M-< M-1 M-5 C-n M-2 C-f
  2. 键入 C-x r y 以粘贴该矩形区块。

请注意,您刚刚清除的小矩形区块并不是被粘贴的那个区块;当您清除 一个矩形区块时,并没有对其进行保存,仅保存那些剪切 的矩形区块,并且您只能够粘贴上一次剪切的矩形区块。

另外请注意,光标移动到该矩形区块右下角的后面,并且迷你缓冲区报告已经设置了标记。当您粘贴一个矩形区块时,标记设置到您所粘贴的矩形区块的左上角。

要使用空白字符替换一个矩形区块,但需要保存它的原始内容,以便您稍后可以对其进行粘贴,那么可以首先剪切它,再粘贴它,然后清除它:

  1. 通过键入 M-< M-2 M-2 C-n M-2 C-f C-space,在倒数第二节中的第一个 Did he 之前设置标记。
  2. 键入 M-6 C-f C-n 以移动光标,使其恰好位于下一行中的 he 之后。
  3. 键入 C-x r k 以剪切矩形区块。
  4. 键入 C-p 将光标移动到您刚刚剪切的矩形区块的左上角。
  5. 使用 C-x r y 粘贴它。
  6. 使用 C-x r c 清除它。

此时,您可以将这个矩形区块粘贴到其他地方。矩形区块的原始位置现在已经填满了空白字符。

尝试下面的操作:

  1. 通过键入 M-1 M-6 C-p M-1 M-4 C-f 移动光标,使其恰好位于单词 wings 之后。
  2. 使用 C-x r y 粘贴该矩形区块。

请注意,光标移动到您刚刚粘贴的矩形区块的右下角。已经将标记设置到该矩形区块的左上角,正如迷你缓冲区中所报告的。

矩形区块的命令表

表 1 列出了您刚刚了解的各种 Emacs 矩形区块命令,给出它们的功能名称,并描述它们的含义。

表 1. 使用矩形区块的 Emacs 命令
键盘输入功能描述
C-spaceset-mark-command标记矩形区块的一个角(光标标记其相对的角)。
C-x r kkill-rectangle剪切当前的矩形区块,并将其保存在一个特殊的矩形区块缓冲区中。
C-x r ddelete-rectangle删除当前的矩形区块,并不为粘贴而保存它。
C-x r cclear-rectangle清除当前的矩形区块,使用空白字符替换整个区域。
C-x r oopen-rectangle打开当前的矩形区块,使用空白字符填充整个区域,并将该矩形区块的所有文本移动到右边。
C-x r yyank-rectangle在光标处,粘贴上一次剪切的矩形区块的内容,将所有的现有文本移动到右边。

操作标记

设置标记和进行选择都是非常重要的,在本系列文章的第 1 部分教程(请参见参考资料)中您了解了相关的 Emacs 概念。但是需要了解的内容远不止这些,本部分将描述与这些主题相关的一些高级编辑技术。

移动到标记处

您知道 C-spaceset-mark-command 功能,可以在光标处设置标记。但是当您继续编辑时,确切地了解在缓冲区中的哪个位置设置了标记,这有时是很有用的,而且同样可以很容易地回到标记处,如果您在光标处设置它,并且希望出于某种原因而引用它。Emacs 目前还无法对设置标记的位置进行可视化表示,但是有一些方法可以将光标移动到标记处,这就可以解决前面的两个问题。

您可以通过几种不同的方法来完成这一任务。其中一种方法是,在 C-space 之前使用通用参数 C-u 命令。使用这种方法,可以更改 C-space 的含义,不再设置标记,而是移动 到标记处。

在您的练习缓冲区中,您所执行的最后一项操作是粘贴一个矩形区块(请参见前面的部分),所以光标移动到该矩形区块的右下角,并且标记设置于其右上角。现在通过输入以下命令,尝试移动到标记处: C-u C-space

这是一种很好的、快速的方法,但使用起来却并不是很方便,尤其是如果在您移动到标记处之后,希望返回到光标原来所在的位置,但这个位置已经丢失了。但是还有另一种方法可以移动到标记处,即记住光标的位置,对于上述的情况,这种方法是很有用的。可以使用 exchange-point-and-mark 功能,它与 C-x C-x 进行了绑定。它的工作方式正如其名称所表示的:它将光标移动到标记处,但是同时,它在光标处设置一个新的标记。

现在,请尝试下面的操作:

  1. 键入 M-< C-space 以在缓冲区的顶部设置标记。
  2. 键入 M-5 C-n 以从标记处移开。
  3. 交换光标和标记:键入 C-x C-x
  4. 要移回到光标的最近位置——并且在缓冲区的顶部设置标记——再次运行该命令:键入 C-x C-x
  5. 再次将标记设置到缓冲区的顶部。如果您再次运行这个命令,而不设置新的标记,那么无论您将光标移动到了什么位置,都将返回到缓冲区的顶部。通过移动光标,然后再次运行这一命令,以尝试这种方法:键入 M-9 C-f C-x C-x

通过两次键入该命令,您可以将这个命令作为一种快速的、功能强大的方式来使用,以“查看”标记设置的位置:第一次,您键入 C-x C-x,将光标移动到标记处,但同时还在光标处设置了标记。第二次,您键入 C-x C-x,将标记设置回它原来所在的位置,并且将光标移动到开始所处的位置。

标记缓冲区中特殊的部分

Emacs 提供了一些特殊的功能,用于标记文本单元的某些类型。这些内容值得深入研究,并且在这里对它们进行了相应的描述。

可以在所有这些标记命令之前加上数字,以修改它们进行标记的单元数目以及它们的位置,既可以在当前光标的右边(正数),也可以在其左边(负数)。

标记单词

mark-word 功能用于标记从光标处到当前词尾,并且它与 M-@ 进行了绑定(按住 Meta 键,同时键入 @ 字符)。

对于快速地剪切一个单词来说,它并不是很有价值(您仍然应该使用 M-d 来完成这一任务,正如您在前面的教程中所了解到的),但对于对单个单词进行标记,以对其执行某些其他操作来说,这是一个很好的命令,如使用 upcase-regiondowncase-region 功能进行大小写转换,它们分别将区域中的所有文本转换为大写字符和小写字符。

尝试下面的操作:

  1. 移动到缓冲区中的最后一行,恰好处于 W 的前面:键入 M-> M-b M-b
  2. 键入 M-2 M-@ 对光标右边的两个单词进行标记。(如果您没有移动到这些单词的左边,您可以使用 M-- M-2 M-@ 实现相同的目的。)
  3. 运行下面的功能,将区域中所有的字符转换为大写字母:键入 M-x upcase-region 并按 Enter
  4. 请注意,这时打开了一个新的窗口,它告诉您禁用了 upcase-region 功能;这是因为它可能让新用户感到不知所措。现在您已经掌握了这个内容,因此键入 y 以便为这一会话启用它。然后,如果您愿意,可以在提示是否同时希望为将来的会话启用它时,再次键入 y

标记段落

mark-paragraph 功能,M-h,将当前段落标记为区域。当您键入这个命令时,光标可以位于该段落中的任何位置。这个功能在段落尾设置标记,并且移动光标,使其恰好位于该段落的前面。

尝试标记一个段落:

  1. 使用 M-5 C-p 移动到最后一节,该命令将光标移动到最后一行中的倒数第二个单词。
  2. 键入 M-h 以选择这一段落。
  3. 请注意,光标移动到该节前面的空白行。标记设置到该节前面的行,键入 C-x C-x 以验证它。

标记整个缓冲区

要立刻为整个缓冲区设置标记,可以运行 mark-whole-buffer 功能,C-x h

现在,请尝试下面的操作:C-x h C-w C-y 将整个缓冲区标记为一个区域,剪切该区域(因而剪切整个缓冲区),然后粘贴它。

对于完整地将一个现有的缓冲区复制到另一个缓冲区,这是一种很好的方法。通过将缓冲区标记为区域,然后键入 M-w 以运行 kill-ring-save 功能,可以完成这一任务。然后,您可以将它粘贴到其他地方,甚至粘贴到另一个缓冲区中。

使用标记环

您已经了解了,键入 C-u C-space 可以返回到最近设置的标记(请参见“移动到标记处”)。但是 Emacs 并不仅仅只能够记住最后一个标记,它可以记住您最近设置的 16 个标记,并且将它们保存在一个称为标记环 的特殊位置。

当您多次键入 C-u C-space 时,Emacs 将遍历标记环中的这 16 个位置。在您键入该命令 16 次之后,Emacs 将返回到该标记环中的第一个标记处。

每个缓冲区都具有自己的标记环,标记环用于保存特定缓冲区中最近设置的 16 个标记。

尝试多次键入 C-u C-space 以遍历在您的练习缓冲区中最近设置的一些标记。

设置临时标记

只要在缓冲区中的某处设置了一个标记,就存在一个区域(正如您所了解的,当前区域 是位于标记和当前光标位置之间的区域),但该区域是不可视的,因此您通常无法看到它。查看区域的一种方法是,当您第一次通过拖动鼠标选择它时,仅持续到您按某个键之前。

但是通过运行 transient-mark-mode 功能,您可以使得这个区域成为可见的,该功能可以进行切换。在设置了这一辅助模式后,无论您何时设置标记,都会突出显示该区域,并且当您调整它的时候,如通过使用光标移动键,它仍然保持突出显示的状态。一旦您键入更改缓冲区的另一个键,而且无需与该区域有关,比如当您键入一个常规字母数字字符,以将其插入到光标处(或者如果您键入 C-g)时,突出显示将会消失,并且清除该区域,尽管标记仍然存在。

如果您再次设置标记,或者如果您键入一个与该区域有关的命令(如交换光标和标记),那么将设置该区域,并且它在缓冲区中再次突出显示。

现在,请尝试下面的操作:

  1. 键入 M-x transient-mark-mode 以启用这一模式。
  2. 移动到缓冲区尾,并设置标记:键入 M-> C-space
  3. 通过键入 C-p 几次,向上移动光标,并观察标记的移动情况。
  4. 移动到缓冲区的顶部,并插入一个空格:键入 M-< C-o。请注意,该区域不再突出显示。
  5. 键入 C-w 以剪切这一区域,并且注意,没有剪切任何内容,相反地,Emacs 发出提示声,并且在迷你缓冲区中向您报告“The mark is not active now”。
  6. 但是仍然设置了一个标记,键入 C-x C-x 以证明这一点,并再次观察如何快速地突出显示该区域。

您的 Emacs 会话应该与图 3 中所示类似。

图 3. 临时标记模式中的可见区域
临时标记模式中的可见区域

请注意,这是一个辅助模式,当激活它时,在模式行中不显示。键入 M-x transient-mark-mode 以禁用它。

使用二次选择

回到本系列文章的第 1 部分教程中,您学习了如何设置标记以及操作区域,同时您还学习了如何使用鼠标来进行选择。但是当您在使用 X 时,还有另一种方法,即使用鼠标进行选择和剪切文本,而无需使用标记和光标,或者甚至根本无需设置标记或移动光标。这是通过使用二次选择 来实现的,二次选择是所选文本的一个连续区域(没有通过标记和当前光标来表示其结尾)。当您使用鼠标进行选择时,可以通过按下 Meta 键进行二次选择。

您将注意到,二次选择与普通的 X 选择相比,使用了不同的颜色进行突出显示。

现在尝试进行二次选择:

  1. 按住 Meta 键。
  2. 在第一节的开始处按下鼠标的 左键,然后将它拖曳到末尾,然后放开 Meta 键和鼠标按钮。

当您进行该操作时,并没有将光标从所处的位置移开。

不使用鼠标拖曳,也可以进行二次选择。要完成这一任务,按住 Meta 键,在开始处单击鼠标的左键,在末尾处单击鼠标的右键,然后释放 Meta 键。

有一些用于选择单词和行(作为二次选择)的其他快捷方式,它们类似与用于进行常规选择的鼠标操作:当鼠标指针位于一个单词上,以选择整个单词时,按住 Meta 键,然后双击鼠标左键(M-B1-B1);当您三击一行中的某处(M-B1-B1-B1)以选择整行时,按住 Meta 键。

现在,请尝试下面的操作:按住 Meta 键,然后双击缓冲区中出现的单词 Tiger 中的任何一个。请注意,同样的,光标并没有移动。

要对二次选择进行粘贴,请按住 Meta 键,然后在希望将二次选择粘贴到缓冲区的目标位置单击 鼠标中键。当您在进行该操作时,光标移动到您所粘贴的选择内容的末尾。您还可以将它粘贴到另一个 X 客户端窗口。

通过单击 WILLIAMBLAKE 之间的 鼠标左键,按空格键以插入一个额外的空格;然后按住 Meta 键,并单击 鼠标右键 以便将二次选择粘贴到此处,以尝试这项操作。

标记和选择命令表

表 2 为刚介绍的高级标记和选择命令提供了汇总信息。表中给出这些命令的功能名(在适用的情况下)。

表 2. 高级 Emacs 标记和选择命令
键盘输入功能描述
C-u C-space 移动到标记环中的前一个标记。
C-x C-xexchange-point-and-mark交换光标和标记的位置。
M-@mark-word标记从光标到当前词尾的所有文本。
M-hmark-paragraph标记当前段落,不管光标处在什么位置。
 transient-mark-mode切换临时标记模式。
 mark-whole-buffer标记整个缓冲区,不管光标处在什么位置。
M-B1 设置二次选择的开始,拖曳鼠标以进行二次选择。
M-B3 设置二次选择的结尾。
M-B1-B1 将一个单词标记为二次选择。
M-B1-B1-B1 将一行标记为二次选择。

高级剪切和粘贴命令

您已经了解了有关剪切和粘贴文本的内容,这在本系列文章的第 1 部分教程中已进行了描述(请参见参考资料),但对于 Emacs 来说,并不仅限于这些基本的操作。本部分将描述一些高级技术。

高级剪切命令

您已经了解,C-k 可以剪切从光标到行尾的全部内容,但是还有一些其他有趣的剪切命令,可用于缓冲区中的其他部分。

剪切超过当前行的内容

如果您在 C-k 之前加上一个数字参数,既可以使用 Meta 键(正如在“指定一个数字前缀”中所描述的),也可以使用通用参数,那么您就可以剪切多行内容。

如果您在 C-k 之前使用 0 作为参数,那么您将剪切从光标到该行开始处 的所有文本。

尝试剪切当前行中位于光标左边的全部内容:键入 M-0 C-k

现在,当您在进行粘贴时,将重新得到该行原来的内容。尝试下面的操作: C-y

您还可以进行向后操作。以当前行中光标之前 的内容作为开始,负的参数将向后剪切多行内容。例如,C-u -5 C-k 剪切从光标到该行开头以及它前面的五行内容。

剪切句子

使用 kill-sentence 功能,M-k,可以剪切从光标到当前句尾的所有文本。

尝试下面的操作:

  1. 移动光标到以 In what distant 开头的行:键入 M-< M-6 C-n M-2 C-f
  2. 键入 M-k 以剪切该句子。

C-k 一样,这个命令从光标处开始剪切操作,并且它还可以接受一个数字参数。所以,M-0 M-k 将剪切从光标处到句子开始的全部内容。

删除到一个字符

zap-to-char 功能,与 M-z 进行了绑定,对于删除一定范围的字符(从光标直到一个特定的字符,包括该字符),该功能是很有用的。通过键入 M-z,然后给出要删除到的字符,以便执行该命令。

现在,请尝试下面的操作:

  1. 键入 M-z
  2. 键入 D 以删除自光标到第一个 D 字符(包括该字符)之间的全部内容。

与本文中介绍的在前面加上数字参数的其他命令一样,这个功能将删除直到给定字符的出现次数恰好等于数字参数的所有文本,既可以从光标处向前(正整数),也可以向后(负整数)删除。

尝试删除从光标到其后的第五个 e 字符间的全部内容:键入 M-- M-5 M-z e

使用剪切环

正如存在标记环以保存所设置的标记(正如使用标记环中所描述的)一样,还存在一个剪切环,用于保存每次您进行剪切操作时所剪切的文本。每次在剪切某些文本时,都将会在剪切环的一个槽位中保存它。仅有的例外情况是矩形区块,最后剪切的矩形区块保存在其本身的特殊位置,而不在剪切环中(请参见矩形区块)。在缺省情况下,每个缓冲区的剪切环都有 30 个槽位。

当您键入 C-y 以粘贴您上一次剪切的文本时,事实上您是从剪切环的顶部进行粘贴。要在剪切环中回退一个槽位,可以键入 M-y。在进行这个操作时,将使用剪切环中前面的文本替换您刚刚粘贴的文本。每当您再次键入 M-y,您就会在剪切环中回退一个槽位。

您还可以在一般的 C-y 前面加上一个数字参数,以粘贴剪切环中特定位置的文本,在剪切环中,最近的内容编号最小,所以 C-u 1 C-yM-1 C-y 是相同的,这与简单的 C-y 是相同的。

此时,尝试粘贴该剪切环中的第三个条目:键入 M-3 C-y

但是 C-u C-y(不带数字参数),它具有特殊的含义。通常,C-y 在光标处粘贴位于剪切环顶部条目的文本,然后光标移动到被粘贴的文本末尾。但是使用 C-u C-y,光标将仍然位于粘贴文本的开头处。对于编辑您将要粘贴的文本,这是一种很好的方法。

现在,通过在该行的开头粘贴文本来尝试这一操作:键入 C-a C-u C-y

通过观察 kill-ring 变量,您可以查看剪切环中的内容。尝试下面的操作:键入 C-h v kill-ring

这个命令打开了一个新的窗口,其中显示了剪切环中的内容。键入 C-x 1 以关闭该窗口。

剪切和粘贴命令表

表 3 对这一部分中描述的高级剪切和粘贴命令提供了汇总信息。

表 3. 高级 Emacs 剪切和粘贴命令
键盘输入功能描述
integer C-kkill-line剪切行的整数 数目。如果是 0,剪切从光标到该行开头的全部内容;如果是负数,则反向剪切。
M-kkill-sentence剪切从光标到句子的结尾处的内容。
M-zzap-to-char删除从光标到指定的字符之间的所有文本。
M-yyank-pop移动到剪切环中的下一个槽位。
integer C-yyank粘贴剪切环中指定槽位的内容。

总结

关于使用 Emacs 的系列文章的第 3 部分教程到此就结束了。到现在为止,您可能已经认识到,Emacs 提供了各种各样的特性和功能(甚至有些特性和功能是您在任何其他编辑器或者应用程序中可能从未听说过的),它也因此赢得了“编辑器之王”的美名。

尽管还有更多的 Emacs 概念和特性需要了解,但您已经掌握了 Emacs 的一些更高级的文本操作方法,您应该可以成为一位充满信心的 Emacs 用户,并且准备好了在您的日常工作中使用它。当使用它时,您将会发现它带来了高效、事半功倍的体验。

参考资料

学习

获得产品和技术

  • GNU 工程网站:为您的操作系统和体系结构免费下载最新的 GNU Emacs 免费副本。
  • IBM 试用软件:从 developerWorks 可直接下载这些试用软件,您可以利用它们开发您的下一个项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=248594
ArticleTitle=Emacs 编辑环境,第 3 部分: 高级 Emacs 文本操作
publish-date=08162007