Emacs 编辑环境,第 1 部分: 学习 Emacs 的基础知识

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

精通 Emacs 编辑器,并深入研究它赖以成名的最先进的编辑命令。开放源代码的 Emacs 编辑器(UNIX® 计算系统中最强大的功能之一)是一个复杂的大型应用程序,从编辑文本到作为一个完整的开发环境,它几乎无所不能。它具有丰富的功能,而且与您见过的任何程序都不一样,尤其是在指定和输入命令方面。这篇教程是本系列的第一篇,它提供了一份简明、可供亲手实践的介绍,让您了解最重要的 Emacs 编辑概念和功能。

开始之前

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

关于本系列

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

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

关于本教程

本教程的第一部分将重点介绍 Emacs 的历史和起源,并在稍后的部分中阐明如何:

  • 启动和停止 Emacs
  • 操作并读文件,以便编辑它们
  • 使用基本的编辑键
  • 在文档间移动
  • 使用强大的 Emacs 文件标识例程
  • 用鼠标进行编辑和选择

目标

本教程的主要目的是带您初步了解 Emacs 编辑器,并简要地介绍该应用程序及其设计原则,告诉您如何在这个编辑环境中高效地工作。

在完成本教程后,您将了解在用 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 的编辑环境

您首先应当知道的是,在 UNIX 中最流行的两种编辑器是 Emacs 和 vi,两者都有超过 30 年的历史。不过,它们都是很难过时的工具。和 UNIX 一样,这些编辑器的基本设计已有几十年之久,但是在最先进的开发中,它们仍然得到了广泛的应用。

Emacs 是历史上最早的开放源代码和免费软件工程之一。它的发明者 Richard Stallman 建立了 GNU 工程及其父组织—自由软件基金会(请参阅参考资料)。甚至在 Stallman 发布 GNU 公共许可(GNU GPL,一种许可条款,如今的大多数开放源代码软件都是在该条款下发布的)之前,他就已经在类似的免费 copyleft 软件许可(被称为 EMACS 公共许可)下发布了 Emacs 的源代码。

Emacs 这个名字已经成为专有名词,但它最初是一个首字母缩写词,代表 Editing MACros;Stallman 最初实现的是用 TECO 语言写成的一组宏。Emacs 现在是用 Emacs Lisp 编写的,后者是一种优雅的高级编程语言。

GNU 工程的简要介绍中称 Emacs 是一种自身配备了相关说明文档的可扩展文本编辑器 (the extensible self-documenting text editor)。Emacs 是可扩展的,这意味着可以在已有功能的基础上添加或构建新功能。之所以有这种可能,是因为它是用 Lisp 编写的,您可以编写新的 Emacs Lisp 例程以添加新功能。您甚至能在 Emacs 会话还在运行时运行这些新功能。它自身配备了相关说明文档,因为每个按键都有相应的即时帮助,即使在键入一个命令时也能显示帮助信息。这样,您可以单击 Help 按钮,弹出各种可能情况的列表。

Emacs 被称为一个编辑环境,因为它不仅仅是一个普通意义上的、用于纯文本编辑的编辑器。许多管理员和开发人员在各种平台上用它来编译和调试程序、管理电子邮件、在系统中操作文件、运行 shell 命令,以及完成很多其他工作。人们甚至用它在 Usenet 新闻组中进行交流,还用它来浏览网页。扩展包和内置插件可以处理从 Internet 中继聊天 (Internet Relay Chat, IRC) 和发送消息到网络通信的各种情况。一个流传很久的 UNIX 笑话是这样说的:“如果 Emacs 环境里有一个好的编辑器的话,它就不至于这么糟糕了。”

因为很多任务都可以用 Emacs 来完成,所以它也有自己的词汇表,当您在这一部分中深入了解典型的 Emacs 窗口时,您将学到这些词汇。这一部分还介绍了如何启动和停止 Emacs,以及如何键入各种命令。

启动 Emacs

要从 shell 中启动 Emacs,键入:

emacs

如果您在控制台或终端中启动 Emacs,您会看到它打开后充满了整个终端窗口,如图 1 所示。

图 1. 终端窗口中的 Emacs
终端窗口中的 Emacs

如果您是在 X 客户端,Emacs 一般会在属于它自己的窗口中打开,如图 2 所示。您还可以指定让它在某个终端窗口打开(如图 1 所示),方法是使用 -nw 选项。乍一看,Emacs 的这两个视图似乎是不同的应用程序,但两者只有表面的差别。它们仅有的真正不同之处在于缺省的颜色、X 客户端显示的图形徽标,以及 X 客户端顶部附近的图标组(包含某些最常用命令的快捷方式)。两者的文本功能和 X 版本是一模一样的。

图 2. Emacs,X 客户端
Emacs,X 客户端

Emacs 窗口剖析

这个屏幕的有些部分需要现在就解释一下。我们从顶部开始,向下介绍。

菜单栏

在 Emacs 屏幕顶部是一个突出显示的条,上面有一些单词。这被称为菜单栏,您可以在菜单中选择常用的 Emacs 命令。您能用键盘访问这些菜单;在 X 客户端中,您还可以用鼠标展开菜单。

专家们通常会配置他们的 Emacs,使它关闭菜单栏,好在屏幕上留出更大的编辑空间。但是在您学习 Emacs 时,菜单栏是帮您熟悉其丰富功能的好方法。

此外,如果您在 X 中打开了 Emacs,您会看到顶部有一组特殊的图标(请参见图 2);它们是某些最常用的菜单选项的快捷方式。

要用键盘访问菜单栏,请按 F10。现在就试试,看看终端中是如何打开一个新的窗口并显示菜单列表的,如图 3 所示。

图 3. 从 Emacs 菜单栏中进行选择
从 Emacs 菜单栏中进行选择

您可以使用向上或向下的方向键,在菜单选项中移动,然后按 Enter。如果您选择的项目有一个子菜单,它会显示在屏幕上。您可以用同样的方法在新的子菜单中选择一个项目,直到您选中了要运行的命令为止。

如果您想终止这一过程,可以随时按下 Ctrl-G。这个特殊的键盘输入会使计算机发出一声蜂鸣声,并退出当前正在执行的任何命令。如果没有正在执行的命令,按下这个键盘输入只会使计算机发出蜂鸣声。请现在尝试一下。

您会看到 Emacs 窗口恢复成在您选择菜单之前的样子。

窗口

屏幕中央大片的主要区域被称为 Emacs 窗口,它是您进行编辑工作的地方。当您打开一个要编辑的文件时,这里将显示该文件的内容。当文件或文档中的内容显示在 Emacs 窗口中时,它被称为缓冲区。您可以随时在 Emacs 中同时打开多个缓冲区(即使它们不会显示在主窗口中也一样)。在编辑会话中,虽然只有一个缓冲区会显示在窗口中,但您一般仍会打开多个缓冲区。

在 X 客户端中,在窗口的左边会显示一个滚动条。(终端的版本也会出现,但它仅在打开某个缓冲区时显示。)滚动条显示 Emacs 窗口中的文本与缓冲区剩余部分的位置关系与大小关系。

模式行

在每个 Emacs 窗口中都有一条横贯底部的高亮条,它被称为模式行,您可以把它看成是状态栏。它将为您提供有关 Emacs 会话和当前缓冲区(在上面的窗口中显示)的信息,包括您做出的最新修改是否已被保存到磁盘、光标所在行的行号、屏幕底部显示的内容在缓冲区中的位置(用占总体的百分比表示),以及当前有哪些 Emacs 功能和设置处于活动状态。

迷您缓冲区 (minibuffer)

在模式行下面和屏幕(或 X 客户端窗口)底部的一片小空间被称为迷您缓冲区 (minibuffer)。这是 Emacs 用来显示与操作相关的消息的地方。当 Emacs 要求您输入某种内容(如某文件的名称)时,将在此处显示。

与 UNIX shell 类似,迷您缓冲区使用制表符作为提示符。按下 Tab 键,可获得一个可能情况的列表。

学习如何键入 Emacs 的键绑定

一个用来调用特定命令的 Emacs 组合键被称为一个键绑定。这些都可以自定义,但 Emacs 也附有缺省的绑定。

一眼看去,为数众多的 Emacs 键绑定似乎很复杂,让人不知所措,不过请务必记住,它们是为了提高您的速度和便于记忆而专门设计的。通常每个绑定都有一个记忆的方法,如 S 键就是用来保存 (save) 的。在您尝试使用它们时,请想想这一点。

总的说来,Emacs 命令可分为两大类:一类要使用 Ctrl 键,而另一类使用 Meta 键。

学习如何键入 Ctrl 组合键

许多 Emacs 命令是由某个 Ctrl 组合键指定的。.在 Emacs 的符号中,Ctrl 键写成“C-”,后面则是与第二个按键对应的字符。例如,在 Emacs 符号中,Ctrl-X 组合键写成 C-x

要输入一个 Ctrl 组合键,请按住 Ctrl 键,然后按第二个键,然后将两个键同时松开。大多数命令都有一个 Ctrl 组合键,在按下此组合键后要再输入一个单词或第二个 Ctrl 组合键。

例如,可以尝试运行 C-x C-s 命令,将当前的缓冲区保存到磁盘。因为您没有作出更改,所以也无需进行保存,但这个组合键值得一试。现在,请尝试进行以下操作:

  1. 按住 Ctrl 键。
  2. X 键,然后把两个键同时松开。
  3. 再按住 Ctrl 键。
  4. S 键,然后把两个键同时松开。

这个键盘输入将运行 save-buffer 命令。在迷您缓冲区中,Emacs 会报告“(No changes need to be saved)”。

Emacs 用户在按这些组合键时,在第二个步骤中往往不会松开 Ctrl 键,这样可以省去第三个步骤,加快键入速度。请尝试一下。

学习如何键入 Meta 组合键

Emacs 键盘输入中的第二种主要类型是 Meta 键;在 Emacs 符号中,Meta 按键被表示为 M-。如果您从未听说过 Meta 键,那是因为目前的大多系统并没有这个键。输入 Meta 组合键,有三种方法:

  1. Meta 键常被绑定到 Alt 键,使用方法与 Ctrl 键类似。如果您的设置就是这样,请使用该设置,这是最简单、最常见的方法。
  2. 通常您可以使用 Esc 键完成一个 Meta 按键序列,但您的操作与输入一个 Ctrl 按键序列时不同。按下 Esc,然后松开,再按第二个键。
  3. 您可以用 Ctrl-[ 代替 Esc 键。如果您通过网络线路运行 Emacs,无法使用 Esc 和 Alt 键,这种方法会很方便。

请尝试输入 M-b 命令,这会把光标向回移动一个单词,有三种操作方法:

  1. 按住 Alt 键,然后按一下 B
  2. 按下 Esc,然后松开,再按一下 B
  3. 按住 Ctrl 键,再按 [,同时松开两个键,然后再按一下 B

您运行的每个 Emacs 命令都是一个函数,由 Emacs Lisp 定义,并有一个函数名。甚至连用向上方向键将光标向上移动一行也是一个函数(previous-line)。您可以使用 M-x 命令,然后再输入函数名,运行任意一个函数。

请尝试以下操作:

  1. 按住 Alt 键。
  2. X 键。
  3. 同时松开两个键,您会注意到迷您缓冲区中会出现“M-x”字样。
  4. 键入 previous-line 并按 Enter

当您这样操作时,光标会向上移动一行。当然,您平常是不会这样运行这个函数的,因为使用向上方向键比这容易多了,不过这是个好例子。函数为数众多,而且由于 Emacs 是可扩展的,您可以编写自己的函数以扩展其功能。

与通过向上方向键运行 previous-line 类似的是,许多函数都分配了快捷键。当您输入这样的一个键或组合键时,将运行相应的函数。您还可以使用 C-p 运行 previous-line 函数。现在,请尝试下面的操作:

  1. 按住 Ctrl
  2. P 键。
  3. 再按方向键,将光标移到窗口的顶部。

作为总结,表 1 列出了您可以在 Emacs 键绑定中使用的主要按键前缀类型。和 Emacs 中的其他东西一样,这些都是可以自定义和重新定义的。

表 1. 常用的缺省 Emacs 按键前缀
按键前缀描述
C-c当前编辑模式特有的命令
C-x文件和缓冲区命令
C-h帮助命令
M-x函数名称

停止 Emacs

要退出 Emacs,请键入:

C-x C-c

如果有未保存的缓冲区,这个命令会使您有机会保存它们。

这是退出 Emacs 的一般方法。请现在就试着操作一下,然后在 shell 的提示符下键入 emacs,重新启动 Emacs。


缓冲区和文件

在这一部分中,将介绍最重要的 Emacs 缓冲区和文件命令:如何将文件载入缓冲区,如何将缓冲区保存到文件,如何在缓冲区间切换,以及如何“杀死”缓冲区。

从头创建一个新文件

当您用普通的方式启动 Emacs 时,它将向一个名为 scratch 的缓冲区开放,该缓冲区的用途显示在缓冲区顶部的一条消息中:

;; This buffer is for notes you don't want to save, 
   and for Lisp evaluation.
;; If you want to create a file, visit that file with C-x C-f,
;; then enter the text in that file's own buffer.

模式行左边的区域始终用来显示当前缓冲区的名称。在此处,您可以看到这个缓冲区的名称,即 *scratch*。如果是 Emacs 自动创建的特殊缓冲区,其名称两边会有星号。

试着输入一行文本:This is a practice file. 然后再按 Enter,将光标向下移到一个新行。当您开始输入时,您会看到模式行的左侧出现两个星号,这表明当前的缓冲区中有未保存到磁盘的文本。

创建新文件的方法之一是将 scratch 缓冲区写到某个文件中。组合键 C-x C-s 会运行 save-buffer 命令,将当前的缓冲区保存到某个文件。正如您先前看到的,当您在一个无需保存的缓冲区中运行此命令时,Emacs 会显示相应的信息。但如果在您运行该命令的缓冲区中有未保存的更改,且该缓冲区与磁盘上的某个特定文件相关联时,缓冲区的内容会被写入该文件。如果您是在新缓冲区或某个没有与文件关联的缓冲区(例如您现在所在的 scratch 缓冲区)中运行该命令,Emacs 将提示您指定用来保存该缓冲区的文件名称。

现在,请尝试下面的操作:键入 Ctrl-x Ctrl-s。看看在迷您缓冲区中是如何要求您给出要保存的文件名称的,如图 4 所示。现在键入 practice

图 4. 保存 scratch 缓冲区
保存 scratch 缓冲区

在您按下 Enter 后,Emacs 会在迷您缓冲区中报告,有一个名为 practice 的新文件已被写入磁盘。键入 C-x C-c,退出 Emacs,然后查看目录,找到您的文件:

$ ls
practice
$

关于 scratch 缓冲区,还有一件事是需要记住的。如果 Emacs 中没有打开其他缓冲区,那么 scratch 缓冲区会一直存在,当它是打开的唯一缓冲区时,是无法被关闭的。

利用文件名启动 Emacs

要使 Emacs 启动时将某个特定的文件的内容放进一个新的缓冲区中以便编辑,请提供此文件的名称作为参数。如果您提供了多个文件,则每个文件会在属于它自己的缓冲区中打开。如果您提供的文件名在磁盘上不存在,Emacs 会为该文件创建一个新的缓冲区,并说明(在模式行中)这是一个新文件。这是您在启动 Emacs 并编辑一个新文件时所做的。当您将缓冲区保存到磁盘时,Emacs 将其写入文件,并使用您提供的参数做为它的文件名。

请试着用您的文件“practice”启动 Emacs:

$ emacs practice

您仍会看到 Emacs 的欢迎屏幕,但如果您按下一个键,如 C-g(或等足够长的时间),您会在 Emacs 窗口中看到您文件。没错,欢迎屏幕是另一个可供配置的选项。

打开一个文件

Emacs 不会对文件的内容进行直接操作。它会把文件内容的副本读取到您编辑的缓冲区中。使用 C-x C-f,即 find-file 命令,以便用文件的内容打开一个缓冲区。

现在,请试着用这个命令打开您的文件:

  1. 键入 C-x C-c,退出 Emacs。
  2. 再次启动 Emacs,但这一回不指定您的文件:
    $ emacs
  3. 键入 C-x C-f,当迷您缓冲区中有相应要求时,请您提供文件的名称 (practice)。

访问缓冲区

C-x b 命令可以从当前缓冲区切换到您指定的另一个缓冲区。迷您缓冲区中始终会提供一个缺省的缓冲区选项。如果您按下 Enter 且没有指定缓冲区的名称,您会切换到上述的缓冲区。缺省值一般是您上次访问的缓冲区。如果您之前没有访问任何缓冲区,则缺省值通常为 scratch 缓冲区。

现在键入 C-x b,注意 scratch 缓冲区会作为建议项显示在迷您缓冲区中。键入 Enter,您的 practice 文件将从窗口中消失,代之以您熟悉的 scratch 缓冲区中的内容。(在缺省情况下,scratch 缓冲区会包含三行消息,但有时该缓冲区为空白。)再次键入 C-x b,然后按 Enter,切换回 practice 缓冲区。

在 Emacs 中,如果您希望创建一个新的缓冲区,请切换到您要指定名称的那个缓冲区。

再次键入 C-x b,不过要将该缓冲区命名为 mybuffer。注意,窗口是空的,这是一个全新的缓冲区。键入一行文本,然后按 Enter

On what wings dare we aspire?

键入 C-xC-s,将这个缓冲区保存到磁盘。注意,现在 Emacs 会要求您指定一个文件名。如果您创建的新缓冲区没有与磁盘上的某个文件关联,您可以在决定保存它时指定一个文件名。您指定的文件名不必与缓冲区名称相同,可以把它命名为 practice.b,请注意,Emacs 会改变缓冲区的名称,使之与新文件相符。

杀死缓冲区

请使用 C-x k 命令杀死某个缓冲区,或将其排除在您的 Emacs 会话之外。您将被提示键入要杀死的缓冲区的名称,当前的缓冲区是缺省缓冲区,如果您直接按下 Enter,会将它杀死。

现在试着杀死旧的 practice 缓冲区:键入 C-x k,然后当 Emacs 在迷您缓冲区中要求输入一个缓冲区名称时,键入 practice,然后按 Enter。practice 缓冲区会被杀死,而 practice.b 缓冲区则像刚才一样留在窗口中。

将缓冲区保存到磁盘

您已经知道了如何通过运行 C-x C-ssave-buffer 命令,将缓冲区的内容保存到磁盘。您需要了解这一过程的更多信息。

模式行的前几个字符描述了缓冲区的状态。现在,在您的 practice.b 缓冲区中键入另一行文本,然后按 Enter

What the hand dare seize the fire?

注意,模式行中的两个破折号会变成两个星号。破折号说明缓冲区的内容与磁盘中的相同,而星号则表示缓冲区中有未保存的编辑内容。

保存更改并退出 Emacs:键入 C-x C-s C-x C-c。您的目录中会多出几个新文件:

$ ls
practice
practice.b
practice.b~

practice 和 practice.b 文件是您创建的,但 practice.b~ 则是一个由 Emacs 自动创建的文件。这是 Emacs 的备份文件,当您每次在 Emacs 中编辑一个已经存在的文件时都会创建这个备份文件。当您将编辑内容保存到文件时,Emacs 会写到一个新文件中以制作备份,这个新文件的名称与原先的文件相同,只是多了一个波浪符号。旧的 practice 文件没有备份,因为您在创建它之后从未对其进行编辑。如果您此后在 Emacs 中编辑了它,Emacs 会将内容写入相应的 practice~ 备份文件。

Emacs 还会写入另一种文件,被称为 autosave 文件,它与原先的文件名称相同,但是在名称前后会各添加一个英镑符号。在您操作缓冲区期间,Emacs 会按设置的间隔向 autosave 文件写入内容。在缺省情况下是每输入 300 个新字符就向 autosave 文件写入一次。通常,在您杀死缓冲区时是不会见到 autosave 文件的。这是因为与缓冲区关联的 autosave 文件被删除了。如果您的系统崩溃,或您在编辑会话中失去连接,autosave 文件很有用,它为您提供了一个选择,使您可以在目录下找到这个文件以恢复丢失的编辑内容。

缓冲区和文件命令总结

表 2 包含的是某些最常用的缓冲区和文件命令列表,在您学习 Emacs 的过程中将用到这些命令。该表提供了命令绑定的键盘输入和命令的函数名。请记住,您总能使用相应的键绑定,或将相应的函数名作为 M-x 的参数,以运行某个命令(请参考学习如何键入 Meta 组合键)。

表 2. 常用的 Emacs 缓冲区和文件函数
绑定函数名描述
C-x C-ssave-buffer将当前的缓冲区保存到磁盘。
C-x ssave-some-buffers要求将所有未保存的缓冲区保存到磁盘。
C-x C-csave-buffers-kill-emacs要求将所有未保存的缓冲区保存到磁盘,并退出 Emacs。
C-x C-zsuspend-emacs挂起 Emacs 并使之成为一个后台进程。
C-x C-blist-buffers列出所有缓冲区。
C-x kkill-buffer杀死一个缓冲区(缺省情况下为当前的缓冲区)。
C-x C-qvc-toggle-read-only切换当前缓冲区的可读状态(如果适用还可以执行版本控制)。
C-x iinsert-file插入点插入某个文件的内容。

在 Emacs 中编辑文本

在缓冲区中输入和更改文本,以及在文本中进行导航,是您在 Emacs 中最重要的操作,无论您是在编辑文件,创建新文件,还是仅仅想研读某个文件,都要用到它们。

在此部分,您将学习用来完成下述工作的基本按键序列和命令:如何在缓冲区中输入文本,如何在文本中导航,以及如何对文本进行基本的编辑,如删除字符和单词。

键入文本和在缓冲区中移动

正如您在从头创建一个新文件这一部分看到的,在 Emacs 缓冲区中输入文本是很容易的,您只要动手打字就行。您可以键入字母字符,将其输入某个缓冲区中。

Emacs 有时会被称为无模式编辑器,常被拿来与模式编辑器如 vi 等作比较。这意味着编辑器的行为以及您可以键入的键盘输入和命令在您的会话中是保持不变的,与 vi 等编辑器不同,后者的击键会根据您是在命令模式还是在输入模式而有不同的含义。Emacs 没有这类模式;不过,它确实有一种不同的模式,可以用来更改其行为或扩展其功能,这将是本系列的下一篇教程的主题。

在进行普通的输入时,有些事是您必须记住的。

在插入点插入文本

在 Emacs,有一个重要的概念,被称为插入点,它表示字符的插入位置。这是缓冲区中一个想像的位置,处于光标所在字符和前一个字符之间。

每当您在缓冲区中输入文本时,该文本都会在这个点插入。在缺省情况下,所有文本都在同一行,在这个点之后的文本会向右推移,为您插入的内容让出空间。按 Enter,移到下一行,然后再按一下 Enter,插入一个空白行。

请试着在 practice.b 的开始处插入一段文本。

  1. 启动 Emacs 时打开该缓冲区:
    $ emacs practice.b
  2. 在每一行的末尾按 Enter,以输入一个段落,然后在结尾再按一下 Enter,创建一个空白行。
    Tyger! Tyger! burning bright
    In the forests of the night,
    What immortal hand or eye
    Could frame thy fearful symmetry?

注意:这是 The Tyger! 这首诗的第一节,作者是 William Blake。本文作者在教程中多次引用本诗的某几个小节。

现在您的 practice.b 缓冲区应如图 5 所示。

图 5. 插入一个段落
插入一个段落

移动插入点

您会看到,在您键入时光标会一直跟随,插入点保持不变:从您键入第一个句子开始,您键入的一切内容都被插入字母 O 之前。

要移动插入点,您可以使用方向键,而且正如您预期的那样,所有其他与光标动作有关的键都可供使用,如 PgUp、PgDn、Home 和 End。但 Emacs 自带用来移动光标的键绑定,而且因为您不必将手移到键盘的基准键之外就能使用它们,所以您在打字时会觉得它们非常有用。

正如您在学习如何键入 Meta 组合键部分中看到的,您可以使用 C-p 将光标向上移动到一行;类似地,C-n 将光标向下移动到一行。C-f向前移动到下一个字符,而 C-b向后移动到上一个字符。

如果不想用 PgDn 和 PgUp 键向上和向下移动一屏,请使用 C-vM-v 这两种键盘输入,它们可起到与前两个键相同的作用。要转至当前行的开始处,请使用 C-a;使用 C-e,转到当前行的结尾

通常 Meta 键会被绑定到某个命令,这与相应的 Ctrl 键类似,对于移动命令,这条规则也同样适用。当使用 Meta 来代替 Ctrl 时,F 和 B 键可以向前和向后移动一个单词 而不是一个字符,而 A 和 E 键可以移动到当前句子的开头和结尾。(在缺省配置中,没有定义 M-nM-p 键盘输入。)

表 3 列出了各种移动和导航的键,以及它们的函数名和描述。试着用它们移动到缓冲区的开头、结尾,和中间的某些位置。

表 3. 有用的 Emacs 键盘输入(用于移动和导航)
键盘输入函数描述
C-p,
UpArrow
previous-line将插入点向上移动到上一行。
C-n, DownArrownext-line将插入点向下移动到下一行。
C-f, RightArrowforward-char将插入点移动到下一个字符。
C-b, LeftArrowback-char将插入点移动到上一个字符。
M-fforward-word将插入点移动到下一个单词。
M-bbackward-word将插入点移动到上一个单词。
C-v, PgDnscroll-up将文本向上滚动一屏。
M-v, PgUpscroll-down将文本向下滚动一屏。
Homebeginning-of-buffer将插入点移到缓冲区的开始处。(在某些版本中,这个键被缺省定义为移动到当前行的开始处。)
Endend-of-buffer将插入点移到缓冲区的末尾。(在某些版本中,这个键被缺省定义为移动到当前行的末尾。)
C-abeginning-of-line将插入点移到本行的开始处。
C-eend-of-line将插入点移到本行的结尾。
M-abeginning-of-sentence将插入点移到句子的开始处。
M-eend-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 所示。

图 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-DelM-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
Built the fire of thine eyes?

键入 C-x C-s,保存您的缓冲区,现在的显示结果如 图 7 所示。

图 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,它列出了重要的编辑命令和执行这些命令时用的缺省键盘输入。

表 4. 常用 Emacs 编辑命令
键盘输入函数描述
Insoverwrite-mode切换改写模式(缺省为关闭)。
Backspace
Del
delete-backward-char删除插入点前的字符。
C-ddelete-char删除插入点处的字符。
M-dkill-word从插入点开始向前删除字符,直到单词末尾。
M-Backspace,
M-Del
backward-kill-word从插入点开始向回删除字符,直至单词的开始处。
C-_undo撤消您的上一次键入或操作
C-q字符XXXquoted-insert在插入点插入按键本身代表的字符或由八进制数字(XXX)表示的字符。
C-u次数命令universal-argument按总的次数(缺省为 4 次)连续执行命令

标记和鼠标

您正在顺利地学习关于 Emacs 编辑的所有基本知识,但还有一些重要的概念是您需要知道的:如何标记文本区域并在这些区域上执行操作,以及如何使用鼠标。

标记、移除、删除

Emacs 有一项标记文本区域的功能,您可以将这个区域作为一个整体进行编辑:表 5 中对这些命令进行了描述和简要介绍。

标记一个区域

移动到缓冲区的顶部,即诗的第一节的开始处,然后键入 C-Space,方法是按住 Ctrl,再按空格键。这被称为设置标记;迷您缓冲区中会出现一条消息,告诉您已经设置了标记。

插入点和您设置标记的位置之前的部分被称为区域

将插入点由开始处移动到小节后的空白处,将整个第一小节设置为区域

删除和恢复文本

有些特殊的命令可用来操作区域,包括 C-w,它能删除区域。

键入 C-w,删除您刚才定义的区域。

每次您删除文本时,这些文本都会保存在 Emacs 的 kill ring 中。您可以用 C-y 把它们恢复到插入点。移动到缓冲区的末尾,按 Enter,插入另一个空白行,然后将这个小节移回去。

您不仅能删除区域;使用 C-k 还可以删除从插入点到行末的所有文本。向上移到以 Tiger 开头的一行,然后用 C-k 删除它。注意,这一操作不会删除空白行;还要第二次使用 C-k。按此操作,然后使用 C-y 将整行移回去。如果您用多个删除命令连续进行删除,它们会叠加在一起,只返回一个移除内容。

您可以将某一行恢复任意多次。移动到缓冲区的顶部,然后再次使用 C-y 把它移回去。

您还可连续多次使用 C-k 键盘输入进行删除,删除的内容会被移到一起。请试试一次删除多行,然后使用 C-y 将它们移回原先的位置。

复制文本

如果您是想复制区域,不必删除它。如果要将区域保存在 kill ring 中而不是删除它,请使用 M-w(而不是 C-w)。

尝试下面的操作:

  1. 将插入点移到最后一节第二行的开头。
  2. 键入 C-Space,设置标记。
  3. 将插入点移到这一节的下面。
  4. 键入 M-w,将这三行复制到 kill ring,而不是删除它们。
  5. 将插入点向上移到缓冲区中第一行下的空行。
  6. C-y 移除这三行。

此后您的缓冲区将如 图 8 所示。

图 8. 移除多行
移除多行
表 5. 用来标记和删除文本的 Emacs 函数
键盘输入函数描述
C-Spaceset-mark-command在插入点设置标记。
C-kkill-line删除从插入点到行末的所有文本。
C-wkill-region删除区域。
M-wkill-ring-save将区域保存在 kill ring 中,但不删除它。
C-yyank恢复来自 kill ring 的文本。

用鼠标进行标记和移动

虽然 Emacs 是为了用键盘快速操作而设计的,但是您也可以使用鼠标,这对文本操作来说有时是很方便的。

要将插入点移到缓冲区的任意位置,请把鼠标指针移到该位置,然后单击一下鼠标左键。试着用鼠标移动到诗的第二节和第三节之间的空白处,然后键入新的一节。

When the stars threw down their spears,
And watered heaven with their tears,
Did he smile his work to see?
Did he who made the Tiger make thee?

左键双击一个单词以选中它。双击您刚刚键入的 Tiger,它将突出显示,然后按 Del 将它删除。现在键入 Lamb,将这个单词插入插入点处。

要用鼠标选择一整行,请用鼠标左键三击该行。请在顶行尝试此操作,然后按 Del 将该行删除。键入 C-_ 恢复删除的内容。

在缓冲区的中间单击鼠标左键,然后再输入两段,完成这首诗:

What the hammer? what the chain?
In what furnace was thy brain?
What the anvil? what dread grasp
Dare its deadly terrors clasp?

And what shoulder, and what art,
Could twist the sinews of thy heart?
And when thy heart began to beat,
What dread hand? and what dread feet?

您可以单击鼠标左键,然后拖动指针,以选择一个区域。您还可以按一下鼠标左键(将指针设置在某个位置),选择一个区域,然后在别处单击右键(将标记设置在此处)。当您这样操作时,您选择的文本无需删除就会被放置在 kill ring 中,您可以使用 C-y 或鼠标中键将文本复制到插入点处。要将突出显示的区域放在 kill 缓冲区中并删除它,请双击鼠标右键以设置区域。

试着调换您刚才键入的两节诗的次序:

  1. 在两节诗中间的空行的开头单击鼠标左键
  2. 在您刚刚输入的第二节下面,双击鼠标右键
  3. 在以 What the hammer? 开始的小节前的空行行首,单击鼠标中键

键入 C-x C-s,将您的缓冲区保存到磁盘。您的 Emacs 会话应如图 9 所示。

图 9. 用鼠标插入
用鼠标插入

表 6 描述了 Emacs 中的各种鼠标操作。

表 6. Emacs 中的鼠标操作
鼠标命令描述
B1这一命令将设置插入点位置;拖动鼠标左键以设置区域。
B1-B1这一命令标记一个单词。
B1-B1-B1这一命令标记一行。
B2这一命令插入最近被杀死的内容,并把光标移动到插入内容的末尾。
B3这一命令会设置并突出显示区域,然后无需删除就将其放在 kill 缓冲区中。如果某个区域已经被突出显示并设置,该区域的末尾将移动到您单击的位置。
B3-B3这个命令将突出显示区域,然后删除它。如果某个区域已经被突出显示并设置,该区域的末尾将移动到您单击的位置,此后该区域将被删除。

总结

总结

祝贺您!您已经完成了学习使用 Emacs 系列中的第一篇教程。您已经了解了有关 Emacs 编辑环境的所有基本知识:如何打开新缓冲区,并将它们保存到文件;如何在缓冲区中移动,输入和编辑文本,标记和操作文本区域;甚至包括如何使用鼠标进行文本操作。

虽然此教程涉及的内容很广,但您还有许多东西要学。本系列的后续教程将带您了解 Emacs 中复杂的编辑功能以及如何在工作中使用它们。

参考资料

学习

获得产品和技术

  • 最新的 GNU 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=246499
ArticleTitle=Emacs 编辑环境,第 1 部分: 学习 Emacs 的基础知识
publish-date=08092007