1.
这是关于学习 Emacs 的系列教程中的第 4 部分(请参见参考资料)。本系列文章主要介绍 Emacs 编辑器的使用,前面的教程向您介绍了一些基础知识;这一部分将介绍有关选项、寄存器和书签的特殊主题,并以此圆满结束到目前为止所学习的内容。与许多应用程序一样,Emacs 提供了许多命令行选项,通过这些选项可以改变它的功能;在本教程中,您将了解如何以及何时使用它们,并且还将了解寄存器和书签这两种特殊的 Emacs 工具,它们是为当前和以后编辑会话存储位置及其他重要信息的有效方法。
本教程的主要目标是向您介绍如何使用 Emacs 命令行选项、寄存器和书签工具。假定您已经完成了本系列文章中的前三部分教程(请参见参考资料),并对各种文本编辑技术有基本的了解。
在完成本教程的学习之后,您将掌握许多用于控制您的 Emacs 会话的技巧:您将了解如何使用各种命令行选项(包括那些用于以非交互的方式运行 Emacs 的选项)修改和自定义您的 Emacs 编辑环境,以及如何使用寄存器和书签为以后的恢复工作保存位置和数据。
本教程建立于本系列文章前三部分教程中所介绍的一些概念的基础之上,所以您应该在完成前三部分教程的学习之后再开始本教程(请参见参考资料)的学习。本教程中的示例再次使用了您在第 1 部分教程中生成的、并且在第 3 部分教程中使用过的练习文件(请参见下载,如果您还没有该文件的话)。
在本系列文章第一个教程(“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 操作的图形元素)特别涉及到 X Window System。为了完成这些部分的学习,您应该拥有一台正常运行的 X 服务器。
2.
了解 Emacs 运行时和显示选项
Emacs 提供了许多可以影响其行为的命令行选项。您通常在启动 Emacs 时没有使用任何选项——或许是一个或两个文件名参数——但是使用选项您可以执行许多高级操作,包括以批处理模式对文件运行 Emacs Lisp 代码。在很多时候,使用这些选项既方便又实用,它们非常适合许多特定的情况,在这一部分中将对这些情况进行描述。(从带命令行选项的命令行中调用 Emacs,这种特定的情况非常有用并且十分常见,特别是在 Shell 脚本或者启动文件中。)
Emacs 使用 GNU 风格的“长”选项,这种选项以两个破折号开头,可以带一个传统的空格字符,或者在选项及其参数之间使用一个等号。这些长选项旨在易于理解和记忆,例如,以反转显示方式启动 Emacs 的长风格的选项是 --inverse-video
,但是作为结果,与大多数其他工具和应用程序中的选项相比,要键入更长的选项。然而,大多数 Emacs 选项都具有一个传统的单连字符等效部分。本教程在稍后的内容中将给出一个完整的选项列表 表 2,其中包括了这两种类型。
一些最常见且最有用的 Emacs 选项是那些用于修改或者指定文件的选项。您可以使用这些选项执行许多非常方便的技巧。
Emacs 所接受的唯一参数是一个文件规范。当您给定一个文件、一个文件列表或者另一个文件规范作为参数时,Emacs 将启动并打开指定的文件到它们各自的缓冲区中,就如同您通过调用一系列 find-file
功能(C-x C-f
),并依次指定其中的每一个文件:
$ emacs /usr/local/share/newdev/inputs/*.txt |
这个命令启动 Emacs,打开 /usr/local/share/newdev/inputs/ 目录中具有 .txt 文件扩展名的所有文件,并将其放入到它们自己的新的缓冲区中。每个缓冲区的名称都与其相应的文件名相同。
如果存在某些始终需要进行编辑的文件,如任务列表、日程安排或者首要任务文件,可以将它们添加到您的启动文件中所使用的emacs
命令行中,这样做是非常有意义的。通过将它们放入到启动文件的命令行中,在 Emacs 启动时,就会自动地打开这些文件,并将其放入到相应的缓冲区中:
emacs plans tasks |
Emacs 按照给定的顺序打开文件,所以您最后指定的文件总是当前缓冲区。在前面的示例中,当 Emacs 启动时,名为 tasks 的文件是当前缓冲区。如果您指定了多个文件,那么 Emacs 将窗口从中间分成两半,在其顶部显示一个文件的缓冲区,在其底部显示另一个文件的缓冲区。键入 C-x 1
以删除第二个窗口,以便使得整个 Emacs 窗口只显示一个缓冲区。
如果您指定三个 或者更多的文件,那么 Emacs 将在顶部的窗口中显示最后的文件,并将其作为当前缓冲区;它在其下的第二个窗口中显示一个缓冲区列表,该列表显示了所有打开的缓冲区的名称、它们的大小、它们的主要模式以及与它们相对应的文件的名称。同样,您可以键入 C-x 1
以删除这个窗口。
您还可以在文件规范的前面使用长的 --visit
和 --file
选项。例如,清单 1 中的命令行是等价的。
emacs myfile emacs --visit myfile emacs --visit=myfile emacs --file myfile emacs --file=myfile |
当您在为批处理操作构造长的 Emacs 命令行时(请参见执行批处理操作部分),这些长选项有时是非常有用的。
如果您所给定的文件在文件系统中并不存在,那么 Emacs 将打开一个新的缓冲区,并在模式行中指出它是一个新的文件。例如,如果当前目录是一个名为 /usr/local/src/projx/inputs/ 的空目录,并且您键入 emacs README
,那么您将打开一个名为 README 的新缓冲区。如果您将该缓冲区保存到磁盘,则写入到一个名为 /usr/local/src/projx/inputs/README 的文件。
尝试在您的 home 目录中生成一个新的文件:
$ emacs myfile |
请注意,Emacs 如何告诉您(在迷你缓冲区中)myfile 是一个新的文件。
在该缓冲区中键入一些文本:
Enough! or Too much! |
现在,将该缓冲区保存到磁盘:键入 C-x C-s C-x C-c
,以便将缓冲区保存到您的新文件,然后退出 Emacs。请注意,您没有必要给出文件名(如果您访问一个新的文件,您通常会这样做),正如在前面的教程中所描述的,这是因为作为命令行参数您指定的是一个文件 的名称,而不是一个缓冲区。当该文件不存在时,Emacs 会创建它。(如果您退出而不保存该文件,那么 Emacs 将要求您进行确认,尽管该文件将不复存在,但仍然会将您所编辑的内容写入到一个自动保存文件。)
如果您在一个文件名参数之前使用 +number
,那么 Emacs 将打开该文件,并将光标移动到 number 相对应的行。当您启动 Emacs 并希望对文件中的某个特定位置进行编辑的时候,这种方法是非常有用的。例如,假设您正在调试一个 C 程序 myprog.c,并且编译器已经向您发出了警告,告诉您在第 315 行存在一个错误;为了在编译器发现错误的准确行上进行编辑,您可以键入 emacs +315 myprog.c
,以便打开源文件到一个缓冲区中。
如果您已经阅读了本系列文章中的这些教程,并键入了所提供的示例,那么您应该拥有一个名为 practice.b 的示例文件,该文件中包含 William Blake 的“The Tiger”;如果您没有保存它,或者在前面教程的文本操作已经毁坏了副本,那么在本教程的下载部分中提供了可用的副本。
尝试打开 practice.b,并使光标定位到第十五行:
$ emacs +15 practice.b |
(使用 C-x C-c
退出。)
对于在文件的结尾 处打开一个缓冲区,这一选项同样是非常合适的。要完成这项任务,可以给出一个相对于该文件的长度来说非常大的数字。
尝试打开 practice.b,并使光标定位于文件的结尾处,:
$ emacs +999 practice.b |
(使用 C-x C-c
退出。)
您还可以指定在文件中的水平位置。如果您将垂直的行看作是行,那么跨越每行的水平位置就是列,并且通过在行编号(行位置)后面加上一个冒号字符(:
)和表示列的数值,就可以指定水平位置。
尝试打开 practice.b,并使光标定位于第三行上的第十二个字符(第十二列):
$ emacs +3:12 practice.b |
当您执行这个操作时,光标应该定位于 immortal 中的 a 字符上。(然后,使用 C-x C-c
退出。)
如果指定行所拥有的列比您指定的列要少,那么光标不会绕到下一行,而是停留在该行的结尾处。
如果您指定了多个文件,那么您可以在每个文件的前面加上各自的选项,以指定希望光标定位到的行和列。对于每个文件,缺省的行为是在一个缓冲区中打开它,并使光标定位于该文件的第一行和第一列,这与在每个文件名的前面加上 +1:1 是等价的。
使用 --insert
选项插入 您作为参数给出的文件的内容。在您希望插入到的文件参数之后,给出这一选项;如果它的前面不使用任何文件参数,那么该选项会将给定的文件插入到一个临时缓冲区内。
尝试下面的操作:
$ emacs --insert myfile |
这个操作将使用一个临时缓冲区启动 Emacs,该缓冲区应该与图 1 中所示类似,其中插入了新的文件 myfile,并且光标定位于缓冲区的开头处。
(使用 C-x C-c
退出。)
现在,尝试将您的新文件插入到 practice.b 中:
$ emacs practice.b --insert myfile |
这个操作将启动 Emacs,同时在一个新的缓冲区中打开 practice.b 文件,并且在其开头处插入 myfile 的内容。
(使用 C-x C-c
退出,键入 n
,然后键入 yes
以确定执行退出操作,而不进行保存。)
您可以将一项插入操作与一个位置选项组合在一起,并且您可以同时给出一些附加的参数。尝试下面的操作:
$ emacs +10:5 practice.b --insert myfile anotherfile |
这个操作将启动 Emacs,同时使 practice.b 的内容处于一个新的缓冲区中,在第十行的第五列插入 myfile,然后在一个新的缓冲区中打开名为 anotherfile 的新文件,并将其作为当前缓冲区。
(使用 C-x C-c
退出,键入 n
,然后键入 yes
以确定执行退出操作,而不进行保存。)
除了指定文件操作的选项之外,其次最常用的 Emacs 选项可能就是那些与 X Window System 相关的选项。您可以使用这些选项更改 Emacs 在 X 中的显示方式。这些选项中的大多数是标准的 X Window System 选项,它们适用于所有的 X 客户端。
与 X 相关的最有用的 Emacs 命令行选项之一是 -nw
,您在本系列文章的第 1 部分教程(请参见参考资料)中曾看到过该选项的示例。这个选项在当前终端中打开 Emacs,而不是创建一个它自己的新的 X 客户端窗口。在许多情况下,该选项是非常有用的,例如,当您正通过一个慢速的连接运行远程终端窗口,并且不希望启动本地的 X 客户端窗口时;或者当您正在一个终端中进行许多操作,并且希望对一个文件进行快速编辑,而不启动一个新的窗口以打开 Emacs 时。
如果您的 X 正在运行,那么请在一个终端窗口中尝试执行下面的操作:
$ emacs -nw |
当您键入这一命令时,Emacs 将以终端模式启动,并且出现在该终端中,而不是产生一个新的 X 客户端窗口。(键入 C-x C-c
以退出。)
使用 --display
选项,以指定应该在什么位置显示 Emacs X 客户端窗口。它接受 X 服务器的主机名作为一个参数,后面紧跟着一个冒号和显示编号,这个显示编号表示该主机上特定的 X 服务器的编号(它通常是 0,但根据运行多个 X 服务器的系统的不同,它的值也有所不同)。
例如,这一命令在本地主机的缺省服务器上显示客户端,并且它与不给出任何选项的操作是等价的:
emacs --display :0 |
要在名为 rs6000 的远程主机的缺省服务器上打开 Emacs 窗口,请键入:
emacs --display rs6000:0 |
--geometry
选项是另一个标准的 X 选项。采用以下格式,给出客户端窗口的宽度、高度以及可选的 X 和 Y 偏移量:
WIDTHxHEIGHT[{+-}XOFFSET{+-}YOFFSET] |
从屏幕的左上角开始计算偏移量,它既可以是正值,也可以是负值。
如果您正在一个 X 服务器上运行本教程,那么现在您可以尝试它。要在您的桌面的左上角打开一个 25 个字符宽和 250 个字符高的长窗口,请键入:
$ emacs --geometry 25x250+0+0 |
(使用 C-x C-c
退出。)
您可以使用其他的标准 X 选项以便使用指定的文本字体、颜色(前景),以及其后的空白区(背景)启动 Emacs。
要指定一种字体,可以给出一种 X 字体名作为 --font
选项的引号括起来的参数。可以通过大量的选项(请参见表 1)来指定颜色。
选项 | 描述 |
---|---|
--foreground-color color -fg color |
设置前景颜色为 color。 |
--background-color color -bg color |
设置背景颜色为 color。 |
--border-color color -bd color |
设置边框颜色为 color。 |
--cursor-color color -cr color |
设置光标颜色为 color。 |
--mouse-style color -ms color |
设置鼠标指针颜色为 color。 |
您还可以组合使用字体和颜色选项。尝试一次设置所有这些选项:
$ emacs -fn "-misc-fixed-medium-r-normal-ja-13-120-75-75-c-120-iso10646-1" / -bg "sea green" -fg "white" -cr "brown1" -ms "royalblue1" practice.b |
这一命令在一个 X 客户端窗口中启动 Emacs,它与图 2 中所示类似。
您可以使用哪些特别的字体和颜色,这取决于您的 X 服务器及其配置。
Emacs 允许您运行一个启动文件,该文件也称为初始化文件,它可以包含要执行的 Emacs Lisp 代码,并且通常用于设置各种属性和变量,您可以使用它来自定义您的编辑环境。它是一个名为 .emacs 的隐藏文件,位于您的 home 目录中。(自定义您的 .emacs 文件是本系列文章中后续教程的一个主题。)
通过给定 -q
选项,您可以指定 Emacs 不运行任何现有的启动文件。当您希望运行一个 Emacs 会话,而不使用任何已有的自定义设置时;当您正在使用一个新的 Emacs 功能时;当某处出现了奇怪的行为时;或者您不确定是否您自己的某个自定义设置是导致问题的原因时,对于调试新添加到您的启动文件中的内容,这个选项是非常有用的:
emacs -q |
因为每个人的 .emacs 文件是不同的,所以您可能希望尝试使用其他人的启动文件,以实现相应的更改,并观察其他人如何自定义他们的编辑环境。您可以使用 -u
选项来完成这一任务,给定该用户的名称作为这个选项的参数。这对于试验本地 Emacs 向导的自定义设置是非常有用的,例如用户 joe
:
emacs -u joe |
只要这个 .emacs 启动文件对您来说是可读的,那么该命令将使用用户 joe
的 home 目录中 .emacs 启动文件来启动 Emacs。如果用户 joe
并不存在,且没有这个 .emacs 文件,或者该文件是不可读的,那么 Emacs 在启动时将不使用任何初始化文件。
Emacs 还有一个全局启动文件 site-start.el,它通常保存在 /etc/emacs/ 目录树中。--no-site-file
选项将启动 Emacs,而不执行该文件中的 Emacs Lisp。
最后,--debug-init
将启用 Lisp 调试器,以便检查您的启动文件,当您正在向它添加某些内容并且出现了问题时,这一操作是非常有用的。您甚至可以使用它来调试另一个用户的启动文件:
emacs -u joe --debug-init |
Emacs 提供了一些用于 Lisp 代码执行的命令行选项;当您正以批处理模式运行 Emacs 时,这些选项特别有用,如下所述。
使用 -l
加载一个 Lisp 文件,给出该文件的名称作为参数。Emacs 首先在当前目录中查找该文件,然后在 EMACSLOADPATH
环境变量(如果设置了的话)中的任何目录中查找。要从文件系统的其他地方加载一个 Lisp 文件,可以给出完整的路径名作为参数。
要从命令行运行 Emacs Lisp 函数,可以使用 -f
选项,并给出 Lisp 函数的名称,以将其作为一个选项来执行。如果该函数带有任何参数,那么请确保提供这些参数。
例如,尝试启动 Emacs,并运行 phases-of-moon
函数:
$ emacs -f phases-of-moon |
当您在执行这一操作时,您的 Emacs 会话应该与图 3 中所示类似,在 Emacs X 客户端中有两个窗口:一个临时缓冲区和一个包含当前月相的日期的窗口。(使用 C-x C-c
退出。)
要启动 Emacs 并执行 一个 Lisp 表达式,可以使用 --eval
选项;并在其后紧跟一个用引号括起来的 Lisp 表达式。
例如,尝试使用您的新文件启动 Emacs,移动到缓冲区的末尾,并执行 Lisp 代码 (insert (current-time-string))
,它会将当前时间和日期插入到当前缓冲区中:
$ emacs +999 myfile --eval "(insert (current-time-string))" |
(使用 C-x C-c
退出,键入 n
,然后键入 yes
以确定执行退出操作,而不进行保存。)
您可以采用批处理模式运行 Emacs,以实现非交互处理。当您给出 --batch
选项时,Emacs 将不对标准输出进行写操作,并且它将从标准输入(而不是迷你缓冲区)中获得输入。(它仍然会对标准错误进行写操作。)
通常,您可以使用 -l
或者 -f
选项,正如刚才所介绍的,使用 --batch
以执行 Lisp 代码或者以非交互方式运行相应的函数。如果您使用 --batch
调用 Emacs,并且没有使用任何其他选项,那么 Emacs 将立刻退出。
否则,Emacs 将执行给定的命令,直到一个导致退出的命令、或者直到它碰到一个 --kill
选项,该选项将立刻退出 Emacs,可以将它放在命令行的结尾,以便在完成批处理操作时退出 Emacs。
尝试采用批处理模式运行 Emacs,以便将 myfile 的内容插入到 practice.b的第三十五行,使用 save-buffer
函数保存它,然后退出:
$ emacs --batch +35 practice.b --insert myfile -f save-buffer --kill |
现在,查看您的 practice.b 文件,它应该包含额外的一行内容。
您可以简单地使用另一个 Emacs 单行程序删除该行。尝试下面的操作:
$ emacs --batch +35 practice.b -f kill-line -f save-buffer --kill |
不要忘记查看 practice.b,并确保已经删除额外的行。
表 2 总结了到目前为止所介绍的众多 Emacs 命令行选项,给出了它们的长、短选项名(如果适用的话),并描述了它们的功能。
选项 | 描述 |
---|---|
--visit=filespec --file=filespec filespec |
打开 filespec 到各自的缓冲区,以进行编辑。 |
+row[:column] |
将光标移动到该文件中的 row 行和(可选的)水平位置 column 列(缺省值是 +1:1)。 |
--insert file |
将文件 file 插入到缓冲区的开头。 |
--debug-init |
对 .emacs 启动文件使用 Lisp 调试器。 |
--no-init-file -q |
不运行任何 .emacs 启动文件。 |
--no-site-file |
不运行全局 site-start.el 文件。 |
-u user --user user |
使用用户 user 的 .emacs 启动文件。 |
--funcallfunction -f function |
执行 Emacs Lisp 函数。 |
--eval expression --executeexpression |
执行 Emacs Lisp 表达式 expression。 |
--load file -l file |
执行文件 file 中的 Emacs Lisp 指令。 |
-batch --batch |
使用批处理(非交互)模式。 |
-kill --kill |
当处于批处理模式时,退出 Emacs。 |
--name name |
使用 name 作为 Emacs X 客户端窗口的名称(缺省值是“emacs”)。 |
-T title --title title |
使用 title 作为 Emacs X 客户端窗口的标题(缺省值是 name@FQDN,其中 FQDN 是该主机的完全限定域名)。 |
--reverse-video -r |
使用反向显示方式,交换前景和背景的颜色。 |
--iconic -iconic |
启动 Emacs,并将其作为一个图标,而不是一个活动窗口。 |
--icon-type -i |
当图标化 Emacs 窗口时,使用 Emacs 图标(通常是 /usr/share/emacs/version/etc/gnu.xpm),而不是窗口管理器的任何缺省值。 |
-fn name -font name |
使用 name 作为 Emacs 窗口字体。 |
--border-widthwidth -bw width |
将窗口边框设置为 width 像素。 |
--internal-borderwidth -ib width |
将窗口内部边框设置为 width 像素。 |
--g dimensions --geometrydimensions |
根据给定的 X 窗口尺寸 dimensions(生成窗口的缺省值是 80x40 个字符)设置窗口的宽度、高度和位置。 |
--foreground-color color -fg color |
将前景色设置为 color。 |
--background-color color -bg color |
将背景色设置为 color。 |
--border-colorcolor -bd color |
将边框颜色设置为 color。 |
--cursor-colorcolor -cr color |
将光标颜色设置为 color。 |
--mouse-colorcolor -ms color |
将鼠标指针颜色设置为 color。 |
-d name --display name |
在与 name 相对应的 X 显示器上打开 Emacs 窗口。 |
-nw --no-windows |
在 X 中,不使用 X 客户端窗口,而是在当前终端窗口中打开。这一选项不影响控制台会话。 |
-t file --terminal file |
file,而不是终端。
|
3.
使用 Emacs 寄存器
您已经知道,使用您在本系列文章的上一个教程中所学的技术(请参见参考资料),您可以返回到标记处,并且您可以返回到标记环中的任何位置。但是除此以外,您还可以通过另一种 Emacs 工具,在缓冲区中设置任意多个位置,并在任何时候移动到这些位置:寄存器。
Emacs 寄存器 是通用的存储机制,它可以存储很多内容中的一项,包括文本、矩形区块、缓冲区中的位置,或者某些其他值或设置。每个寄存器都有一个标签,您可以使用单个字符来引用寄存器。可以重定义寄存器,但是它一次只能包含一项内容。一旦您退出 Emacs,将清空所有的寄存器。
您可以插入保存在寄存器中的文本。当您重新获得寄存器的设置或者配置时,我们称其为恢复 该寄存器;如果寄存器包含一个您希望返回的缓冲区中的位置,我们称其为跳转 至该寄存器中保存的位置。
所有的 Emacs 寄存器命令都是以 C-x r
开头的。
本文接下来的部分将向您介绍用于设置、查看、恢复和跳转至寄存器的命令。
要在一个寄存器中保存当前光标,可以运行 point-to-register
功能,它与 C-x r space
进行了绑定,同时给出寄存器的名称,它可以是任何字母数字字符。寄存器的名称是区分大小写的,x 和 X 指的是两个不同的寄存器。
要将一个区域 复制到寄存器,可以使用 copy-to-register
功能,它与 C-x r s
进行了绑定。
要将一个矩形区块复制到寄存器,使用 copy-rectangle-to-register
功能,它与 C-x r r
进行了绑定。
尝试将当前光标保存到寄存器 X 中:
-
启动 Emacs,并使光标定位于练习文件的第二行的第九个字符,即单词 forests 中的字符 o 处:
$ emacs +2:9 practice.b
-
键入
C-x r space X
以便在寄存器 X 中保存光标位置。
使用 view-register
功能查看寄存器中的内容。
尝试查看寄存器 X 中的内容:
-
键入
M-x view-register
并按 Enter。 -
当在迷你缓冲区中提示您时,键入
X
作为要进行查看的寄存器。寄存器的名称始终是单个字符,所以您无需按 Enter。
当您运行这一功能时,将打开一个新的窗口,以显示寄存器 X 中所包含的内容,在这个示例中,是您的 practice.b 缓冲区中的一个光标位置。键入 C-x 1
以关闭该窗口。
要跳转至您保存在一个寄存器中的光标,或者要恢复一个窗口或框架配置,可以使用 jump-to-register
功能,它与 C-x r j
进行了绑定。
尝试跳转至您已保存在寄存器 X 中的光标位置:
-
键入
M->
,以移动到缓冲区的末尾,远离您已经保存的光标位置。 -
键入
C-x r j X
以跳转至保存的光标位置。现在,您返回到了 forests 中。
从一个寄存器恢复文本,无论是区域还是矩形区块,其操作方式是不同的。要从寄存器插入一个文本区域或者矩形区块,可以使用insert-register
功能,它与 C-x r i
进行了绑定。它在光标处插入寄存器中的文本,并保持光标位于插入的内容之前。如果您给出的寄存器是一个光标位置,那么将在光标处插入该位置编号(缓冲区中字符的数目)。
尝试下面的操作:
-
单击并拖曳鼠标
左键
,选中 and what art,以便将这三个单词标记为一个文本区域。 -
将该区域保存到寄存器 q:键入
C-x r s q
。 -
移动到缓冲区尾,并插入一个空白行:键入
M->
并按 Enter。 -
插入您刚刚保存的寄存器的内容:键入
C-x r i q
。请注意,光标设置到您所插入的文本的开头,而不是该文本的结尾。 -
插入早些时候保存的寄存器 X 中的内容,其中包含光标的位置:键入
C-x r i X
。
如果您已经执行了本教程中的所有示例,那么您的 Emacs 会话应该与图 4 中所示类似。
所恢复的编号 38 表示 forests 中的 o(寄存器 X 的光标位置)是缓冲区中的第三十八个字符。通过在该文件中从第一个位置开始将光标向前移动 37 个字符,您可以验证它:
M-< M-3 M-7 C-f |
表 3 列出了使用 Emacs 寄存器的各种命令和键,给出了它们的功能名,并描述了它们的含义。
键盘输入 | 功能 | 描述 |
---|---|---|
C-x r space X |
point-to-register |
将光标保存到寄存器 X。 |
C-x r s X |
copy-to-register |
将区域保存到寄存器 X。 |
C-x r r X |
copy-rectangle-to-register |
将选定的矩形区块保存到寄存器 X。 |
未定义 | view-register |
查看一个给定的寄存器的内容。 |
C-x r j X |
jump-to-register |
将光标移动到寄存器 X 中给定的位置。 |
C-x r i X |
insert-register |
在光标处插入寄存器 X 的内容。 |
4.
使用 Emacs 书签
Emacs 提供了保存缓冲区中位置的另一种工具。这些 Emacs 书签 的工作方式与寄存器相同,但是它们的标签可以超过一个字符长,而且它们比寄存器更为持久:如果保存了书签,那么您可以在两个不同的会话之间使用它们。它们将一直保留下来,直到您删除它们。正如它们的名称所表示的,对于保存您在缓冲区中的位置,以便您稍后可以返回到该位置(通常是在以后的 Emacs 会话期间),使用书签是非常方便的。
这个部分将向您介绍使用、设置、列出、保存和删除 Emacs 书签。
对于保存光标位置,书签与寄存器是很相似的,不同之处在于书签能够保持到当前会话之外。对于标记您在文件中的位置,并在稍后返回到该位置,书签是非常方便的,您可以为很多文件设置书签,并且您可以在单个文件中设置很多书签。
要在当前缓冲区中,为您正在访问的文件的当前光标设置一个书签,可以运行 bookmark-set
功能,它与 C-x r m
进行了绑定。
这一命令后面紧跟您的书签的名称;在缺省情况下,它就是当前缓冲区的名称。
现在,尝试保存一些书签:
-
启动 Emacs,并使光标定位于您的练习文件中的第 20 行:
$ emacs +20 practice.b
-
键入
C-x r m
以便将这个光标作为书签保存。 -
当 Emacs 请求为这一书签提供相应的名称时,可以按 Enter 以使用该缓冲区的名称 (practice.b)。
-
键入
M-<
以移动到缓冲区的顶部。 -
保存一个名为 top 的新书签:键入
C-x r m top
。
bookmarks-bmenu-list
功能可以列出一个由已设置的所有书签组成的菜单。通过键入 C-x r l
运行该功能,而您的会话应该与图 5 中所示类似。
您可以通过按 Enter 从该列表中选择一个书签。Emacs 将在一个新的缓冲区(如果尚未在一个缓冲区中打开它)中访问该文件,并将其作为当前缓冲区,同时将光标移动到该书签的位置。
现在,尝试运行这一功能,并使用箭头键选择您的“top”书签。
您可以通过直接跳转 至某个书签来访问它,而无需从您的书签主列表中选择它。要跳转至某个特定的书签,可以使用 bookmark-jump
功能,C-x r b
。这一命令将移动到特定文件中的给定位置;如果尚未在缓冲区中打开这个带书签的文件,那么这一命令将打开它。
在迷你缓冲区中会提示您输入要跳转到的书签。这个提示使用了自动完成功能,所以您只需键入该书签名前面足够的字母,以使其能够区别于其他的书签即可,然后按 Tab 以选择该书签。
尝试跳转到您的 practice.b 书签:键入 C-x r b prac
,按 Tab 键,然后按 Enter。
当您使用一个现有书签的标签来设置新书签(请参见设置一个书签部分)时,您将使用新的书签取代原来的书签。这是一种“删除”书签的方式,即使用新的值来取代其原来的值。当您在阅读一个大文件时,如果您仅仅保留一个书签以标记您的位置,上述方法是很常见的,因为您每次设置该书签时都替换了它先前的值。
但是您可以同时删除一个书签,那么该标签不再指向任何文件中的任何位置。要实现这一点,可以运行 bookmark-delete
功能,并在被询问时,给出要进行删除的书签的名称。
尝试删除您的“top”书签:
-
键入
C-x bookmark-delete
并按 Enter。 -
当被询问时,给出要删除的书签的名称:键入
top
并按 Enter。
通过使用 C-x r l
调出书签列表,您可以验证已经删除了该书签。
在 Emacs 的新版本中,一旦您生成了任何书签,那么您为当前 Emacs 会话所设置的书签将自动地保存到您的永久书签文件中。您的书签文件是您的 home 目录中的一个名为 .emac.bmk 的隐藏文件。
如果没有配置 Emacs 以使其自动保存您的书签,那么通过运行 bookmark-save
功能,可以将它们保存到您的 .emac.bmk 文件中。如果当您退出时没有保存任何新的书签,那么 Emacs 将询问您是否想要保存它们。
表 4 列出了使用 Emacs 书签的各种命令和键,给出了它们的功能名,并描述了它们的含义。
键盘输入 | 功能 | 描述 |
---|---|---|
C-x r m Bookmark |
bookmark-set |
设置一个名为 Bookmark 的书签。 |
C-x r l |
bookmarks-bmenu-list |
列出所有已保存的书签。 |
bookmark-delete |
删除一个书签。 | |
C-x r b Bookmark |
bookmark-jump |
跳转至名为 Bookmark 的书签中所设置的位置。 |
未定义 | bookmark-save |
将所有的书签保存到书签文件 ~/.emac.bmk 中。 |
5.
总结
本教程是关于使用 Emacs 编辑环境的系列文章的第 4 部分,在本教程中您了解了如何使用 Emacs 控制编辑会话某些方面的三个部分:启动 Emacs 时许多可用的命令行选项、功能强大的 Emacs 寄存器、用于设置和保存位置以及数据的书签工具。您还了解了许多功能强大的编辑技术,这些技术将使您成为一名工作效率更高的 Emacs 用户。
本系列文章的后续教程建立于您在本教程中所学到的知识的基础之上,并且将引导您更深入地掌握这一功能全面的编辑应用程序。
6.
附录
Tiger! Tiger! burning bright
In the forests of the night,
What immortal hand or eye
Could frame thy fearful symmetry?
In what distant deeps or skies
Built the fire of thine eyes?
On what wings dare he aspire?
What the hand dare seize the fire?
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?
What the hammer? what the chain?
In what furnace was thy brain?
What the anvil? what dread grasp
Dare its deadly terrors clasp?
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 Lamb make thee?
Tiger! Tiger! burning bright
In the forests of the night,
What immortal hand or eye
Could frame thy fearful symmetry?
---WILLIAM BLAKE