免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1350 | 回复: 0
打印 上一主题 下一主题

[转]Emacs 编辑环境,第 3 部分: 高级 Emacs 文本操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-15 13:40 |只看该作者 |倒序浏览
本教程是系列文章的第 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 的文件)应用这种方法:
  使用该文件启动 Emacs:
$ emacs practice.b
  通过执行下面的命令,将光标向下移动三行:M-3 C-n
  将光标向后移动五个字符:M-- M-5 C-f
  请注意,负数将使得给定的命令按照相反的方式执行。(您可以使用 M-5 C-b 得到相同的结果。)
  通过输入以下的命令,移动到缓冲区尾:M-9 M-9 M-9 C-f
  请注意,您可以通过在一行中组合使用多个 Meta 按键,以指定更长的、多位数字,这甚至比使用通用参数更加快捷。
  插入几个空行:键入 M-4,然后按 Enter 键。
  缩进八个空格:输入 M-8,然后按空格键。
  使用 M-3 - 插入三个破折号。
  现在,您的缓冲区应该与图 1 中所示类似。
  图 1. 在 Emacs 中使用数字参数功能进行编辑

  重复上一条命令
  repeat 功能对于密集型编辑工作来说是很有用的。顾名思义,它可以重复执行您最近键入的命令。
  尝试运行一个命令,并重复执行它:
  键入 C-b 将光标向后移动一个字符。
  使用 C-x z 重复执行一次。
  您还可以反复地执行一个命令——通过再次键入 z,以便再次重复执行一次该命令;不断地键入 z 就可以反复地执行该命令。
  尝试下面的操作:
  键入 z 将光标向后移动一个字符。
  多次键入 z,将光标向后移动多个字符。
  键入 C-f 将光标向前移动一个字符。
  键入 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,以进入递归编辑。这允许您在进行特定的替换之前,停止您将要进行的替换,以便您能够编辑缓冲区;当您退出递归编辑时,您将会返回到该替换操作。
  现在,请尝试下面的操作:
  键入 M-% 以运行 query-replace 功能。
  回答迷你缓冲区中的询问:
  Query replace: o
  Query replace o with: a
  在第一个替换的位置,当受到询问时,可以通过键入 C-r 进行递归编辑:
  询问是否使用 a 替换 o:(? 用于帮助)C-r
  通过键入 M-> 移动到缓冲区尾,然后在三个破折号后键入 William Bloke。
  键入 C-M-c 以退出递归编辑。
  键入 n 以拒绝对第一个匹配项进行替换。
  所找到的第二个匹配项是 Bloke 中的 o,该单词是您在 query-replace 功能运行之后键入的;键入 y 以替换它。
  当退出这个功能时,您的缓冲区的最后一部分内容应该与图 2 中所示类似,且 Emacs 应该在迷你缓冲区中报告,它已经替换了给定字符串的一个匹配项。
  图 2. 在 Emacs 询问替换期间,进行递归编辑之后

  矩形区块
  您是否曾经希望能够从文档中选择文本区块,以对其进行复制、剪切或者粘贴?您的确可以这样做。在 Emacs 中,我们将通过文本的四个角中任何两个相对的角所指定的文本选择称为矩形区块;接下来的部分将向您介绍如何有效地使用矩形区块。
  标记一个矩形区块
  要指定一个矩形区块,您只需要对矩形区块的四个假想的角中的任何一个设置标记,然后将光标移动到与该角相对的角。当您完成以上操作时,选定的两个角所包围的虚构文本块就是当前矩形区块。
  当您运行下面的矩形区块命令之一时,将针对您所选择的文本执行相应的操作。Emacs 所有的矩形区块命令都是以 C-x r 开头的,本文在接下来的部分中对它们进行了说明。
  删除一个矩形区块
  有几种方法可以删除标注为矩形区块的文本。尽管这里描述的所有功能都适用于删除当前矩形区块,但其中每一个都具有不同的效果。
  剪切一个矩形区块
  使用 kill-rectangle 功能,C-x r k,可以剪切当前矩形区块。它与您所熟悉的常规 kill-line 功能相似:它删除该矩形区块中的所有字符,并且不用任何其他的字符来替换它们。位于该矩形区块右边的字符将自动地向左移动。
  这一功能可以将矩形区块的内容保存到某个特殊的矩形区块剪切区域中,而不是保存到一般的剪切环中(请参见使用剪切环)。
  现在,请尝试下面的操作:
  将光标移动到以 What the hammer 开始的节的开头,并键入 C-space 以设置标记。
  移动光标,使其恰好位于单词 terrors 之前,以指定一个包含四行的矩形区块(顺便提一下,该区块中每行包括三个单词)。
  剪切您选择的矩形区块:键入 C-x r k。
  您所选择的矩形区块已经不存在了。请注意,该矩形区块右边的所有文本是如何进行移动,以填充该矩形区块所在位置的。
  删除一个矩形区块
 
 要删除 您所标记的矩形区块中的字符,而不保存它们,可以使用 delete-rectangle,它绑定到了 C-x r
d。这一命令用于删除矩形区块的区域,因此其效果看起来与剪切的矩形区块的效果相同(正如刚刚描述的);它们的区别在于,在执行该命令后,您无法再粘贴回
所剪切的文本。
  (然而,正如您在第一部分教程中所了解到的,您始终可以撤消 刚执行的操作。如果您在刚刚删除或者剪切了一个矩形区块之后键入 C-_,那么将恢复该矩形区块的原始文本。)
  清除一个矩形区块
  刚介绍的这两个用于删除矩形区块的命令都会删除该矩形区块所占据的整个空间。但是,您还可以清除 它,通过运行 clear-rectangle 功能,用空格字符替换整个区域,该功能与 C-x r c 进行了绑定。
  尝试下面的操作:
  移动光标,使其恰好位于行 On what wings dare he aspire? 中的单词 dare 之前,并通过键入 C-space 来设置标记。
  要指定由两行中的单词 dare 组成的小的矩形区块,可以移动光标,使其恰好位于下面一行的单词 dare 之后。
  键入 C-x r c 以清除您刚刚定义的矩形区块。
  请注意,光标移动到该矩形区块的左下角。
  打开一个矩形区块
 
 最后,您可以打开 一个矩形区块,使用该矩形区块以指定一个将要添加空格的区域。要完成这项操作,可以标记一个矩形区块,然后运行
open-rectangle 功能,C-x r o。执行以上的操作,将使用空格字符填充整个矩形区块,并将原矩形区块中的所有文本向右移动。
  现在,请尝试下面的操作:
  将光标移动到缓冲区顶部,并通过键入 C-space 设置标记。
  移动光标,使其恰好位于底部节中 Could 中的 Co 的后面。
  通过键入 C-x r o 打开该矩形区块。
  粘贴一个矩形区块
  要在光标处粘贴上一次剪切的矩形区块的内容,可以运行 yank-rectangle,该操作与 C-x r y 进行了绑定。这一命令用于在光标处插入上一次剪切的矩形区块。在执行插入操作时,将该矩形区块中所有行的所有现有文本移动到右边。
  尝试下面的操作:
  将光标移动到文本中包含 what the chain 的节的开头:键入 M-键盘输入功能描述C-space set-mark-command 标记矩形区块的一个角(光标标记其相对的角)。C-x r k kill-rectangle 剪切当前的矩形区块,并将其保存在一个特殊的矩形区块缓冲区中。C-x r d delete-rectangle 删除当前的矩形区块,并不为粘贴而保存它。C-x r c clear-rectangle 清除当前的矩形区块,使用空白字符替换整个区域。C-x r o open-rectangle 打开当前的矩形区块,使用空白字符填充整个区域,并将该矩形区块的所有文本移动到右边。C-x r y yank-rectangle 在光标处,粘贴上一次剪切的矩形区块的内容,将所有的现有文本移动到右边。
  操作标记
  设置标记和进行选择都是非常重要的,在本系列文章的第 1 部分教程(请参见参考资料)中您了解了相关的 Emacs 概念。但是需要了解的内容远不止这些,本部分将描述与这些主题相关的一些高级编辑技术。
  移动到标记处
 
 您知道 C-space,set-mark-command
功能,可以在光标处设置标记。但是当您继续编辑时,确切地了解在缓冲区中的哪个位置设置了标记,这有时是很有用的,而且同样可以很容易地回到标记处,如果
您在光标处设置它,并且希望出于某种原因而引用它。Emacs
目前还无法对设置标记的位置进行可视化表示,但是有一些方法可以将光标移动到标记处,这就可以解决前面的两个问题。
  您可以通过几种不同的方法来完成这一任务。其中一种方法是,在 C-space 之前使用通用参数 C-u 命令。使用这种方法,可以更改 C-space 的含义,不再设置标记,而是移动 到标记处。
  在您的练习缓冲区中,您所执行的最后一项操作是粘贴一个矩形区块(请参见前面的部分),所以光标移动到该矩形区块的右下角,并且标记设置于其右上角。现在通过输入以下命令,尝试移动到标记处: C-u C-space。
 
 这是一种很好的、快速的方法,但使用起来却并不是很方便,尤其是如果在您移动到标记处之后,希望返回到光标原来所在的位置,但这个位置已经丢失了。但是
还有另一种方法可以移动到标记处,即记住光标的位置,对于上述的情况,这种方法是很有用的。可以使用 exchange-point-and-mark
功能,它与 C-x C-x 进行了绑定。它的工作方式正如其名称所表示的:它将光标移动到标记处,但是同时,它在光标处设置一个新的标记。
  现在,请尝试下面的操作:
  键入 M- M-b M-b。
  键入 M-2 M-@ 对光标右边的两个单词进行标记。(如果您没有移动到这些单词的左边,您可以使用 M-- M-2 M-@ 实现相同的目的。)
  运行下面的功能,将区域中所有的字符转换为大写字母:键入 M-x upcase-region 并按 Enter。
 
 请注意,这时打开了一个新的窗口,它告诉您禁用了 upcase-region
功能;这是因为它可能让新用户感到不知所措。现在您已经掌握了这个内容,因此键入 y
以便为这一会话启用它。然后,如果您愿意,可以在提示是否同时希望为将来的会话启用它时,再次键入 y。
  标记段落
  mark-paragraph 功能,M-h,将当前段落标记为区域。当您键入这个命令时,光标可以位于该段落中的任何位置。这个功能在段落尾设置标记,并且移动光标,使其恰好位于该段落的前面。
  尝试标记一个段落:
  使用 M-5 C-p 移动到最后一节,该命令将光标移动到最后一行中的倒数第二个单词。
  键入 M-h 以选择这一段落。
  请注意,光标移动到该节前面的空白行。标记设置到该节前面的行,键入 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)时,突出显示将会消失,并且清除该区域,尽管标记仍然存在。
  如果您再次设置标记,或者如果您键入一个与该区域有关的命令(如交换光标和标记),那么将设置该区域,并且它在缓冲区中再次突出显示。
  现在,请尝试下面的操作:
  键入 M-x transient-mark-mode 以启用这一模式。
  移动到缓冲区尾,并设置标记:键入 M-> C-space。
  通过键入 C-p 几次,向上移动光标,并观察标记的移动情况。
  移动到缓冲区的顶部,并插入一个空格:键入 M-键盘输入功能描述C-u C-space  移动到标记环中的前一个标记。C-x C-x exchange-point-and-mark 交换光标和标记的位置。M-@ mark-word 标记从光标到当前词尾的所有文本。M-h mark-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,可以剪切从光标到当前句尾的所有文本。
  尝试下面的操作:
  移动光标到以 In what distant 开头的行:键入 M-键盘输入功能描述integer C-k kill-line 剪切行的整数 数目。如果是 0,剪切从光标到该行开头的全部内容;如果是负数,则反向剪切。M-k kill-sentence 剪切从光标到句子的结尾处的内容。M-z zap-to-char 删除从光标到指定的字符之间的所有文本。M-y yank-pop 移动到剪切环中的下一个槽位。integer C-y yank 粘贴剪切环中指定槽位的内容。
  总结
  关于使用 Emacs 的系列文章的第 3 部分教程到此就结束了。到现在为止,您可能已经认识到,Emacs 提供了各种各样的特性和功能(甚至有些特性和功能是您在任何其他编辑器或者应用程序中可能从未听说过的),它也因此赢得了“编辑器之王”的美名。
  尽管还有更多的 Emacs 概念和特性需要了解,但您已经掌握了 Emacs 的一些更高级的文本操作方法,您应该可以成为一位充满信心的 Emacs 用户,并且准备好了在您的日常工作中使用它。当使用它时,您将会发现它带来了高效、事半功倍的体验。
         
         
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/16015/showart_2149853.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP