Emacs 入门

作者:Charles Curley

本文是对 Emacs 的旋风式介绍,假设您已经安装并运行了 Emacs(在大多数 Linux 发行版上都很容易)。它还假设您已经使用过 Emacs 的内置教程。Emacs 中的程序开发不是本文的主题,因为这已在我 2002 年 6 月的 LJ 文章“Emacs:自由软件 IDE”中介绍过[可在 www.linuxjournal.com/article/5765 获取]。

要从 xterm 启动 Emacs,请输入 emacs &。& 符号将 Emacs 放入后台。由于 X 为 Emacs 提供显示,因此这种设置很好。

您也可以通过在控制台中输入 emacs (不带 & 符号) 来运行 Emacs。要在不打开新窗口的情况下在 xterm 中运行 Emacs,请使用 emacs -nw 启动它。这些控制台和 xterm 模式非常适合您没有 X 的情况,例如与远程服务器的 SSH 连接。但是,如果您已设置 SSH 以转发 X,则可以远程运行 Emacs(和其他 X 应用程序)。

如果您还没有学习 Emacs 教程,现在是时候学习了。按下 Ctrl-H,然后按下 T 即可进入教程。该教程在计算机领域算是古老的(1985 年),因此它忽略了光标键和其他现代便利功能。Emacs 支持这些功能,但教程没有考虑它们。最好了解(即使不学习)一些 Emacs 击键。您可以将 bash 和许多其他 GNU 程序设置为使用它们。因此,例如,Ctrl-B 和 Ctrl-N 在 Emacs 中的作用与在 bash 中的作用完全相同。实际上,Emacs 风格的按键绑定是 bash 中的默认设置。

教程应该教您基本的光标移动、如何中止 Emacs 命令、Emacs 窗口、缓冲区和文件之间的关系等等。可能从教程中记住的最重要的事情是,移动键通常是给定的键(F 代表向前),不同的修饰符用于不同的范围。例如,Ctrl-F 向前移动一个字符,M-F 向前移动一个单词(M- 是 Emacs 中 Meta 的表示法,在大多数键盘上表示 Alt 键)。

Emacs 早在 Web 浏览器之前就存在了,因此它使用术语 frame 来表示 X 称之为窗口的东西,并使用 window 来表示 frame 内的部分。由于这是一篇关于 Emacs 的文章,因此本文使用 Emacs 术语。要显示带有水平分割的新窗口,请使用 Ctrl-X 2。要显示带有垂直分割的新窗口,请使用 Ctrl-X 3。Ctrl-X 5 1 为您提供一个全新的 frame 来操作,而 Ctrl-X 0 和 Ctrl-X 5 0 分别关闭当前窗口和 frame。

教程的另一个亮点是对 Emacs 的增量搜索命令的介绍。它们使生活更轻松,因此请学习并记住它们。

Ctrl-H 是 Emacs 帮助系统的入口。按下 Ctrl-H ? 会为您提供帮助系统不同部分的菜单。Info 系统 (Ctrl-H I) 使您可以访问 FSF 文档的 FSF Info 格式。它是一种早于万维网的超文本形式,以树状结构排列。您还可以使用 Ctrl-H Ctrl-F 转到 Emacs 函数的 Info 节点。本节提供有关当前主要和次要模式(稍后详细介绍)、Emacs 提供的保修和许可以及其他信息。由于 Emacs 的帮助系统由 Emacs 显示,因此您在教程中学习的光标移动按键也适用于帮助系统。

进入模式

根据 Emacs 顶级信息页面,Emacs 是可扩展、可自定义、自文档化、实时显示的编辑器。它是可扩展的,因为它使用 Emacs Lisp 或 elisp 编写,elisp 是 Lisp 的一种方言,专门为 Emacs 和文本处理定制。因此,您可以通过用 elisp 编写代码来扩展 Emacs。此外,您可以通过更改现有 elisp 变量的值来定制它。自文档化可能有点夸大其词,但 elisp 确实鼓励程序员编写文档。正如我们所见,有广泛的帮助可用。

用户还可以通过使其适应特定应用程序来定制 Emacs。通过切换到所谓的major mode(主模式)来做到这一点。一次只能在一个缓冲区中激活一个主模式,但您可以动态切换主模式。例如,在编写 CGI 脚本时,在 Perl 模式和 HTML Helper 模式之间切换很有用。

要识别缓冲区中当前活动模式,请查看模式行。在括号中,您会找到一个或多个模式,当前主模式列在第一位。并非所有次要模式都在模式括号中标识自己,但它们的动作是显而易见的,例如列号模式。

主模式

主模式通常与文件扩展名相关联。Lisp 变量 auto-mode-alist 执行此关联,我们将向您展示如何添加到它。Emacs 还识别脚本第一行中 shebang 条目的关联,例如 Perl 的这个条目

#! /usr/bin/perl

您始终可以通过用 -*- 包围它来在文档的第一行强制模式,如下所示

# -*- shell-script -*-
要手动从一个主模式切换到另一个主模式,请使用 M-X mode-name。例如,M-X perl-mode 将 Emacs 置于编辑 Perl 的主模式。

主模式提供许多有用的功能。它们通常提供适合手头主题的自定义缩进和漂亮的打印选项。通常有一些方法可以使用短按键序列插入注释。可以使用 M-X comment-region 注释掉文本区域。将 Emacs 用于所有编辑的一个优点是,在一个主模式中可用的功能(及其按键和菜单项)往往在另一个主模式中也可用,因此如果您知道如何在 Emacs 中编辑 C,您可能也可以在 Emacs 中编辑 SQL(图 1)。

Getting Started with Emacs

图 1. Emacs 中的 C 模式,显示字体锁定(彩色语法突出显示)。缩进是 C 模式的功劳。

主模式通常提供 Emacs 称之为字体锁定的功能,其他人称之为语法着色。它自动将语法与颜色关联。例如,注释以红色显示,数据类型以绿色显示,字符串以浅红色显示。使用 Emacs 进行编辑的另一个优点是,颜色关联跨模式运行,因此无论您是在汇编程序还是 XML 中工作,注释都是红色的。

主模式重新定义了按键的操作方式,通常是 Tab 键和 Delete 键。此外,主模式还具有使用前缀 Ctrl-C 访问的特定于模式的命令。例如,要在 PSGML 模式下验证 SGML 文档,请使用 Ctrl-C Ctrl-V。

周围最强大的主模式之一是 Lennart Staflin 的 PSGML 模式(请参阅资源)。它有助于插入 SGML 或 XML 标签,并提供与 C 模式相当的自动漂亮打印。PSGML 模式具有字体锁定和其他优点,但它也读取 DTD 并使用它来强制执行正确的标签嵌套。例如,在 DocBook 中,它不允许您将 <sect4> 直接插入到 <sect1> 中。它也是验证器的前端(图 2)。

Getting Started with Emacs

图 2. 在 Emacs 中编辑 DocBook SGML DTD 中的 Linux 文档项目文档。字体锁定为您突出显示标签和实体。

几乎任何人都会发现有用的其他主模式是 Dired 模式、Ediff 模式、W3 以及日历和日记。Dired 模式用于编辑目录。您可以从一个目录导航到另一个目录,访问文件并编辑文件元数据,例如权限和所有权。Dired 模式更强大的功能之一是 grep 多个文件并让 Dired 标记命中。然后,您可以按顺序访问每个命中并对其进行编辑。这使您可以 批量 操作文件,包括重命名或删除它们。

已被证明非常有用的一个模式是日历/日记。日历模式不仅仅是一个日历工具,它允许您在公历和儒略历、科普特历、希伯来历和伊斯兰历之间进行日期操作和转换。并且,对于完全不同的东西,以波斯历或玛雅历日期您的下一个办公室内部备忘录。或者,以法国革命历将您的下一个错误报告发送给自由软件基金会(图 3)。

Getting Started with Emacs

图 3. Emacs 的日历和日记

日记比晦涩的日历更有用。使用日记,您可以设置约会、周年纪念提醒、周期性事件(例如“每月第三个星期四”)和其他类型的事件。如果您指定事件时间,Emacs 会在时间临近时提醒您。这个日记系统不仅有用,而且它在 Emacs 中运行,因此它可以在 Emacs 运行的任何计算机上运行——而这几乎是所有计算机。日记文件也具有可移植性。

Ediff 模式对于选择性地应用补丁很有用。您也可以使用它来更新多台计算机上的文件,例如我的 .emacs 和日记文件。由于它是选择性的,因此 ediff 允许您在两个方向上传播更改。如果您在笔记本电脑上设置约会,而您的秘书在您的台式机上设置约会,这可能很重要(图 4 和 5)。

Getting Started with Emacs

图 4. 比较两个文件。Emacs 不仅显示哪些行被更改,还显示更改是什么。

Getting Started with Emacs

图 5. Ediff 模式的控制窗口。

如果浏览万维网是您的事,请仔细查看 William M. Perry 的 W3 模式。它是一个用 Emacs Lisp 编写的网络浏览器。

次要模式

附加组件,称为次要模式,是对主模式的补充。大多数次要模式都与主模式无关地运行,因此它们可以在不同的文档中运行。例如,Show Paren 模式为您匹配括号。即使在文本模式下,它也对 C 程序员很有用,并且对于 Lisp 程序员来说是天赐之物。

可以根据需要打开和关闭次要模式。例如,在编程时,自动填充模式(用于填充或换行段落)在注释中很有用,但在注释之外很麻烦。

一些次要模式是全局的;当它们处于活动状态时,它们会扩展到所有缓冲区。其他次要模式是本地缓冲区。要激活给定的模式,请在其名称后附加 -mode 并执行该命令。因此,要激活括号模式,请按 M-X,然后键入 show-paren-mode。要停用它,请再次运行该命令。

几个有用的缓冲区本地次要模式是 Abbrev 模式(动态自动更正)、自动保存模式、字体锁定模式(颜色突出显示)、Flyspell 模式(动态拼写检查)和覆盖模式。适用于所有缓冲区的两个有用的次要模式是行号模式和列号模式。这些模式在模式行中打印当前点的位置,通常在右侧。

另一个有用的模式是 Ispell,它允许您拼写检查缓冲区。它具有用于检查电子邮件消息、编程语言注释和字符串以及其他特殊用途的特殊子模式。

您的 .emacs 文件

定制 Emacs 的关键是初始化文件 ~/.emacs。管理员通常提供全局初始化文件。如果您不喜欢它,您可以告诉 Emacs 在您自己的初始化文件中忽略它。并且,您可以使用 emacs -q 启动 Emacs 而不使用任何初始化文件,这对于调试很有用。初始化文件只不过是一些 elisp,用于按照您(或您的管理员)喜欢的方式设置 Emacs(图 6)。

Getting Started with Emacs

图 6. 在 Emacs 中编辑作者的 .emacs,这是 Emacs Lisp 的一个示例。

您还可以在初始化文件中设置变量。我通过设置一些模式变量来定制 HTML Helper 模式

(setq html-helper-do-write-file-hooks t)
(setq html-helper-build-new-buffer t)
(setq html-helper-address-string "<a href=
\"mailto:ccurley@trib.com\">Charles
Curley</a>")

简短的有用函数或宏也进入 .emacs。例如,以下函数在点插入今天的日期

(defun insert-date ()
  "Insert the current date according to the variable
\"insert-date-format\"."
  (interactive "*")
  (insert (format-time-string insert-date-format
                              (current-time))))
按键和按键序列也可以绑定到函数。这允许您使用按键序列来激活函数。例如,在编写了函数 insert-date 之后,我可以使用以下行将其绑定到 F3 功能键
(global-set-key [f3] 'insert-date)
您还可以使用此功能来重新映射键盘。如果您不喜欢 Emacs 中的某些长按键序列,则可以重新绑定它们。

定制 Emacs 的另一种方法是使用“定制”菜单,可以通过 M-X customize 或从“选项”下拉菜单访问该菜单。这个广泛的菜单系统允许用户更改变量并将更改存储在您的初始化文件中。

Emacs 作为服务器

许多程序(例如 crontab 和 mutt)调用外部程序作为其编辑器。要让它们运行 Emacs,请将 Emacs 设置为作为服务器运行,方法是将以下行放入您的 .emacs 文件中

(server-start)

接下来,将环境变量 EDITOR 或 VISUAL 设置为 emacsclient。在 Bash 中,将其添加到您的 /etc/bashrc 或您的 ~/x.bash_profile 中

export VISUAL=emacsclient
现在,当您执行 crontab -e 或在 mutt 中编辑消息时,您将在现有 Emacs 会话中进行编辑,而不是等待新的 Emacs 启动。要完成编辑并使 emacslient 退出,请使用 Ctrl-C # 而不是 Ctrl-X K 结束该缓冲区中的会话。

为了使 emacsclient 工作,Emacs 必须在外部程序调用它时正在运行。这与使用 Emacs 的首选方式一致,即在您登录时启动 Emacs 并使其运行直到您注销。使用 emacsclient 的一个结果是您在任何时候只有一个 Emacs 实例在运行。虽然如今内存很便宜,但并非总是如此。即使在今天,如果您想在笔记本电脑或旧电脑上运行 Linux,节约内存始终是一个好主意。

您可能希望 Emacs 在邮件模式下编辑您的邮件。如果您使用 mutt,请将此添加到您的 .emacs 文件中

;; Automatically go into mail-mode if
filename starts with /tmp/mutt
(setq auto-mode-alist (append (list (cons
"^\/tmp\/mutt" 'mail-mode))
                                  auto-mode-alist))

当然,为了遵守关于网络礼仪的 RFC,您需要在编辑邮件时激活自动填充模式。大多数主模式都有一个在进入模式时执行的钩子,以及另一个在离开模式时执行的钩子。以下是如何让邮件模式调用自动填充模式

(defun my-mail-mode-hook ()
  (auto-fill-mode 1)
  )
(add-hook 'mail-mode-hook 'my-mail-mode-hook)
当您完成编写电子邮件后,如果您想惹恼 NSA,请使用 Spook。要抗议《通信规范法案》(一件体面的事情)并惹恼许多美国政客,请参阅 Bruce。

最后,在我们告别这个狂野而粗犷的编辑器之前,让我提请您注意 etc 目录(在 Emacs 目录树中)。它包含许多有用的文档,例如 Emacs 英语语言参考卡,以源文件 (refcard.tex) 和 postscript (refcard.ps) 形式存在。参考卡的其他语言翻译版本也可用。还有一些关于 Emacs 和 GNU 项目的背景资料,以及 GPL 的副本。

在专有软件中很少见(至少不是故意的)的东西在 Emacs 中是存在的:幽默。查看来自 2199 年的错误报告、Spook 模式的单词列表、Emacs 代表什么的某些解释等等。如果您真的想锻炼您的字体服务器,请访问文件“HELLO”。

资源

电子邮件:ccurley@trib.com

Charles Curley (w3.trib.com/~ccurley) 撰写并教授 Linux。自然地,他使用 Linux 上的 Emacs 撰写了这篇文章。

加载 Disqus 评论