【校译】Emacs-Beginner's-HOWTO中文版

笔者为一两年多emacs经验的菜鸟,因始终无法进阶高手行列,想系统学习emacs,多方推荐下始读此书。本想顺手翻译,不小心搜到繁体版本,便转来整理校对简体化一并分享,只希望更多人可以喜爱emacs。

本文秉持了原译者mode、buffer、window等英文术语的使用,修正及补足了部分翻译、文字错误,以及部分原文已失效的http链接,但由于http链接时常变化,如遇404等失效错误,请读者根据阅读时实际情况自行搜索对应网址。

原文地址:http://jeremy.zawodny.com/emacs/
原译文地址:http://www.linux.org.tw/CLDP/OLD/Emacs-Beginner-HOWTO.html
简体版校译时间:2013年5月

以下为正文:

  Emacs Beginner's HOWTO
  作者: Jeremy D. Zawodny: Jeremy@Zawodny.com
  版本: v1.12, 2001-03-25 
  译者: 王世渠(Wang, Shyh-Chyu): shyhchyuwang@gmail.com
  校译: 姜孟冯(Jiang, Mengfeng): jhpx@hotmail.com

  本文向Linux使用者介绍Emacs编辑器,假设读者已经有稍许vi或类似编辑器的
  经验。本文件的最新版本通常能由 http://www.wcnet.org/jzawodn/emacs/取
  得。
______________________________________________________________________

  内容索引

  1. 简介

     1.1 版权
     1.2 目标读者与期待
     1.3 Emacs是什麽? 
        1.3.1 版本
        1.3.2 取得Emacs

  2. 运行Emacs

     2.1 启动及退出Emacs
       2.1.1 Emacs的外观
          2.1.1.1 菜单栏
          2.1.1.2 状态栏及Mini-buffer
     2.2 专业术语
        2.2.1 Buffer及File
        2.2.2 Point及Region
        2.2.3 Window
        2.2.4 Frame
     2.3 键盘基本概念
        2.3.1 命令键 (Meta、Esc、Control以及Alt)
        2.3.2 在Buffer中移动
        2.3.3 必要的命令
        2.3.4 Tab自动完成功能
     2.4 快速指南、帮助文档及使用手册 

  3. Emacs的mode

     3.1 主要及次要mode
     3.2 编程mode
        3.2.1 C/C++/Java
        3.2.2 Perl
        3.2.3 Python
        3.2.4 其它
     3.3 文字工作
        3.3.1 拼写检查 (
        3.3.2 HTML (
        3.3.3 TeX (
        3.3.4 SGML (
     3.4 更多Mode
        3.4.1 版本控制 (
        3.4.2 Shell Mode
        3.4.3 Telnet及FTP
        3.4.4 Man
        3.4.5 Ange-FTP

  4. 自定义Emacs

     4.1 暂时性自定义
        4.1.1 变量赋值
        4.1.2 文件关联
     4.2 使用.emacs文件
     4.3 Customize组件
     4.4 X Windows显示 

  5. 常用package

     5.1 VM (Mail)
     5.2 Gnus (Mail以及News)
     5.3 BBDB (关系网)
     5.4 AucTeX (另类 TeX mode) 

  6. 其余资源

     6.1 书藉
        6.1.1 Learning GNU Emacs
        6.1.2 Writing GNU Emacs Extensions
        6.1.3 Programming in Emacs Lisp: An Introduction
        6.1.4 The GNU Emacs Lisp Reference Manual
     6.2 网站
        6.2.1 EMACSulation
     6.3 新闻组
     6.4 邮件列表
     6.5 Emacs Lisp代码库 

  7. 致谢



______________________________________________________________________

  1. 简介

  1.1 版权

  Copyright © 1998 - 2001 Jeremy D. Zawodny. 依据GNU Geneal Public
  License你可以修订以及散布本文。版权文件的在线版位于
  http://www.gnu.org/copyleft/gpl.html

  1.2 目标读者与期待

  这篇文章面向于那些对emacs有一点点兴趣并且想试用一番的linux用户。这一
  切其实开始于我在Toledo Area Linux User Group会议
  (http://www.talug.org/)上的一个简短教程。随着社区里各种各样有意义的
  反馈,后来一点一点儿演化为现在出现在这篇文章上的成果。欲知详细请读
  ``致谢''一节。

  说了这么多, 其实本文实质上并没有什么"Linux向"的东西. 它实际上可以应用
  到所有Unix系操作系统甚至是Microsoft Windows上的Emacs. 但仅仅因为本文
  是Linux Document Project的组成部分,我说它是为Linux用户准备的--原因仅
  仅如此。

  最后,对于那些更喜欢GNU/Linux而非``Linux''的人 (读一下
  http://www.gnu.org/gnu/linux-and-gnu.html 来看看为什么会这样),很欢迎
  你们精神上把本文中所有出现的Linux自行替换为GNU/Linux。尽管我绝非不理
  解你们这么做的理由与你们背后的精神,但我也不觉得写文章必须强迫到每个
  单词都写成GNU/Linux的程度。

  1.3 Emacs是什麽?

  对不同的人而言,Emacs 代表不同的东西。因人而异,Emacs可以代表如下的各
  种事物:

   o  文本编辑器
   o  邮件客户端
   o  新闻阅读器
   o  文字处理器(Word Processor)
   o  一种信仰
   o  集成开发环境(Integrated Development Environment)
   o  你想要它成为的任何东西

  但是就本文而言,我们先说它是个文本编辑器,一个具有惊人扩展性的文本编
  辑器,我们会在后文中逐步深化这一点。Emacs是由Richard Stallman(自由软
  体协会:http://www.fsf.org/ 以及GNU计划: http://www.gnu.org/的创办人)
  所开发,而且至今仍在维护更新。

  Emacs是Linux(及Unix)中几支最常用而且功能最强大的文本编辑器之一, 常
  用的程度仅次于vi。它以具有功能组合众多、易于自定义和鲜少程序bug而闻名。
  其中,功能组合众多与易于自定义两条,都是由Emacs最初的设计与实现决定的。
  撇开细节,我只想指出Emacs``不只是个文本编辑器''。Emacs最基本最底层的
  核心是一个以C语言开发的全功能Lisp语言解释器,除此以外,其余大部分都是
  以Lisp语言开发。结果,Emacs就感觉像是一个内嵌了Emacs-Lisp语言的``程序
  解释执行系统'',用户能够用这种内嵌语言来自定义、延伸设计以及改变它的
  行为。

  Emacs是现在最古老的文本编辑器之一。在最近20(?)年有千千万万的程序设计
  师使用过,就代表已经有很多扩展(add-on)可供使用。这些扩展让你能使用
  Emacs做到Stallman刚开始开发时想都没想过的事,后面的章节会加以介绍这些
  事。

  有许多其他网站、文档对Emacs的概述、历史及其余相关事物有更详细的介绍,
  与其把它们拿进来重述一遍,还不如让你到本文中``其余资源''列出的地方去
  看看。

  1.3.1 版本

  应该一提的是,Emacs有两种版本:GNU Emacs以及XEmacs。两者代码源流相同,
  大部分的功能相同。本文主要以GNU Emacs(尤其是20.3版)为重心,但是许多所
  说的内容都可以运用在XEmacs以及更早期的GNU Emacs版本。只需记住这一点,
  在本文中我便会把它们都统称为Emacs。

  1.3.2 取得Emacs

  Emacs很容易取得。如果你使用比较常用的Linux版本,如Debian、RedHat、
  Slackware或其它版本,Emacs可能就已经在安装媒体里面了。否则,也可以去
  下载Emacs的源代码,自行编译。拜访一下GNU的网站
  http://www.gnu.org/software/emacs/emacs.html,可找到源代码的位置。


  2. 运行Emacs

  2.1 启动及退出Emacs

  当第一次启动Emacs时,你可能只想玩一玩、试一试Emacs,一旦跑起来之后,
  你可能会找不到退出的方法。如果从没玩过Emacs,那现在就先试一下。只要在
  shell提示列键入emacs,再按enter,Emacs就会跑起来,否则可能是还没安装
  好,不然就是path设置有误。

  看到Emacs起来后,你还会想知道要如何退出它。退出Emacs的组合键为C-x
  C-c,其中C-x代表按住Ctrl键后再按x,在这个例子里,你还要再按住Ctrl后再
  按c。

  Emacs的键绑定好像很怪、很漠生,而且一开始无法适应--尤其对vi的使用者而
  言,感受更深。因为跟vi不同,Emacs并没有分文本编辑和下命令两种模式。

  复习: emacs 是用来启动Emacs;而C-x C-c是用来退出Emacs。

  2.1.1 Emacs的外观

  Emacs一跑起来,就会占掉整个X window(如果你不是使用X window,而是
  console,就会占掉整个萤幕),此时还会看到视窗最上方有一行菜单栏,视窗
  的主要部分有一些文字,最底下还有两行栏位。

  它看起来就像下述ASCII画出的图示:

  +----------------------------------------------------------------------+
  |Buffers Files Tools Edit Search Mule Help                             |
  |                                                                      |
  |Welcome to GNU Emacs, one component of a Linux-based GNU system.      |
  |                                                                      |
  |                                                                      |
  |                                                                      |
  | ...                                                                  |
  |                                                                      |
  |---1:---F1  *scratch*         (Lisp Interaction)--L1--All-------------|
  |For information about the GNU Project and its goals, type C-h C-p.    |
  +----------------------------------------------------------------------+

  注意: Emacs经常会占满整个萤幕或视窗,我为了节省这里的空间压缩了一下
  上面的例子。在第一次启动Emacs时,你还会看到大段欢迎的信息,在上图中我
  用``...''省略了。欢迎的信息只是简单地标示Emacs的版本、给出一些在线帮
  助以及相关资讯。

  2.1.1.1 菜单栏

  Emacs最上面一行是菜单栏。如果是在X window中,可以把它看成是传统的下拉
  式菜单栏,可以以滑鼠操作;否则,就要用键盘快捷键(非本文范畴)操作。

  2.1.1.2 状态栏及Mini-buffer

  Emacs最底下两行栏位中上面的那一栏是状态栏,其中包括使用中buffer的资讯,
  Emacs在什麽模式,以及一些其它的资讯,暂时只要知道有这个栏位就够了。

  下面那一栏称为mini-buffer,它跟主要buffer之间以刚刚介绍的状态栏隔开。
  可以把mini-buffer视为Emacs的``命令行'',因为你对Emacs下命令会在其中显
  示,而且程序对命令的回馈信息也是透过这一栏显示。

  在Emacs相关文档中,你会发现上述的状态栏被称为mode line。Emacs以此显示
  现在使用中的mode、现在日期时间、所在行号、文件大小以及几乎任何想显示
  出来的资料。

  2.2 专业术语

  本章介绍Emacs最基本的术语,在未来使用Emacs或研读相关资料时,你可能会
  一再遇见。

  2.2.1 Buffer及File

  不像其它类的编辑器,当你用Emacs打开一个文件时,这个文件并非``一直开
  着''。事实上,Emacs只是把文件内容读进内存中的一块``buffer''中。当编辑
  处理buffer的资料,硬盘内完全没有任何改变,只有当你储存buffer时,硬盘
  中的文件才真正更新。这种设计有优点也有缺点,重点是你要知道内部是这样
  运作的。

  总之,Emacs文档、mode、package中会看到``buffer''一词,只要知道buffer
  代表``文件在内存中对应的一份复制''就好了。对了,还有buffer并不一定必
  然对应到硬盘中的某个文件,常常Emacs会产生一些Buffer来表示你所下的命令
  的结果,包括命令的直接结果、可以选择的选项等等...。

  2.2.2 Point及Region

  你或许会听到如point这样的行话,简单说point就是光标。对初次使用Emacs的
  人而言,point和光标的差异并不重要。但是非要追根究底不可的话,光标代表
  point视觉的呈现方式,因为光标的位置是现在buffer中的``一个字元上'',而
  point的位置是``介于现在buffer中两个字元间''。举例言之,如果光标在
  ``the''中的`h'上,point就在`t'和`h'之间。

  如许多编辑器一般,Emacs能在buffer上执行一些操作(缩进、拼写检查、更新
  格式、剪切、复制、粘贴、等等...)。可以以键盘和滑鼠选中(或``mark'')
  文中一块区域,然后只针对这区域的文字实施操作。Emacs称这区域的文字为
  region。

  2.2.3 Window

  这个术语对使用过一般图型使用者界面的人而言,会有一点混淆,只要知道
  Emacs是远在图形用户界面以及视窗管理等流行之前就已经开发出来了,就不会
  觉得这样的结果太奇怪。

  Emacs中的window是萤幕上显示一个buffer的区域(译者按:window系指萤幕上
  显示一个主要buffer的区域,mini-buffer并不算数)。当Emacs一启动,萤幕
  上只有一个window,一些Emacs功能(如帮助和文档)往往[暂时]在Emacs萤幕
  中开启更多window。

  Emacs的window跟图型使用者界面中所说的X window完全无关。例如说,你可以
  用两个X window开启两个Emacs的buffer,并列以比较两个文件,此时的第二个
  X window,以Emacs的术语,系称为frame。

  2.2.4 Frame

  以Emacs的术语,frame是在一个X window独立显示的一个buffer。它们同属于
  一个Emacs的活动(session)。这有一点像(也不完全像)使用Netscape
  Navigator时按Alt+N一般(译者按:Netscape Navigator曾经是最盛行的一个
  浏览器,按Alt-N会产生一个新的Netscape Navigator视窗)。

  2.3 键盘基本概念

  本章介绍Emacs键盘的基础观念。就如每一个强有力的编辑器,Emac能做的事,
  就是响应一串串的组合键。

  如果你用vi,k、j、l、h键是用来上移、下移、前移一字元以及后移一字元,
  你要费一些时间才能熟练。事实上,要能自在的用几个按键的组合,在vi中游
  走一个文件,可能要花费数小时甚至数日的练习。

  Emacs也是一样,有一套不同的组合键和命令要熟习。就如vi,一定要锻炼基本
  功,然而才能完成许许多多的工作。日复一日,逐渐累积知识,找到做好工作
  的最快途径。

  2.3.1 命令键(Meta、Esc、Control以及Alt)

  很快你就会发现,Emacs大量使用多键组合命令,因为Emacs并非如vi一般的模
  式编辑器,移动光标或下命令前不需要想一下你是在``命名模式''还是``编辑
  模式'',只要按下一串正确的按键,Emacs(通常)就会正确无误的动作。

  C(代表Control或Ctrl)以及M(代表Meta)是Emacs最常用到的键。大部分现代个
  人电脑的键盘都有一个或两个标示为Ctrl的按键,但鲜有标示为Meta的按键,
  因此往往你要以Esc或Alt取代Meta。在大部分标准的设定,Esc和Alt的效用实
  质上相同。

  因此,当你读Emacs相关的参考资料时,其中若有C-x f即代表``按Ctrl-X键再
  按f键''。又如果看到M-x shell即代表``按Alt-x键再键入shell''。

  对新手最有用的命令是M-x apropos或C-h a,它会从Emacs在线文档中搜索所有
  的功能或一般的命令表示法。例如说键入C-h a再键入frame就是一个很好的方
  式找到所有跟frame相关的命令。

  2.3.2 在Buffer中移动

  既然已经知道所有这些迷人的简写的意义,以下让我们看一下要在buffer中移
  动光标的常用组合键:

  组合键       动作
  -----------------------------------
  C-p         上移一行
  C-n         下移一行
  C-f         前移一个字元
  C-b         倒退一个字元
  C-a         移动到一行的最前面
  C-e         移动到一行的最后面
  C-v         下移一页
  M-v         上移一页
  M-f         前移一个字
  M-b         倒退一个字
  M-<         移动到buffer的最前面
  M->         移动到buffer的最后面
  C-g         中断一个命令的进行
  -----------------------------------

  而且,如你所期待的,方向键(或arrow键)依旧有效,Backspace有时无效,
  这又与本文无关了。:-(

  2.3.3 必要的命令

  好,既然已经知道了如何在buffer中移动,那如何打开和保存文件?如何搜索?
  以下是一些基本的命令。

  在深入介绍前,还要先说明命令运作的机制。

  所有Emacs中的``命令组合键''(如M-x 某某 或 C-某某)事实上都是Emacs中
  一些函数的热键。要调用任何这类函数,只要键入M-x 函数名称再键入Enter即
  可。如果一个函数已经预设有热键,也可以以热键执行这个函数。

  举例而言,Emacs把保存buffer至硬盘的函数称为save-buffer。Emacs已经预设
  它的热键为C-x C-s,所以你可以用这个热键来保存一个buffer,或者也可键入
  M-x save-buffer来达到相同的效果。

  所有最常用的函数,Emacs已经预设都已经预设好它们的热键,表列如下。

  组合键                函数名称               描述
  ----------------------------------------------------------------------
  C-x C-s               save-buffer        将现有的buffer存入硬盘
  C-x u                 undo               撤消前次命令
  C-x C-f               find-file          从硬盘打开一个文件
  C-s                   isearch-forward    向下搜索一个字符串
  C-r                   isearch-backward   向上搜索一个字符串
                        replace-string     搜索以及替换
                        replace-regexp     以正则表达式的方式搜索以及
                                           替换
  C-h t                 help-with-tutorial 打开快速指南教程
  C-h f                 describe-function  显示一个函数的帮助说明
  C-h v                 describe-variable  显示一个变量的帮助说明
  C-h x                 describe-key       显示说明一串组合键的功效
  C-h a                 apropos            搜索一个字符串/正则表达式的
                                           说明
  C-h F                 view-emacs-FAQ     显示Emacs的FAQ
  C-h i                 info               阅览Emacs的文档
  C-x r m               bookmark-set       设定书签(搜索时很好用)
  C-x r b               bookmark-jump      跳到一个书签的位置
  ----------------------------------------------------------------------

  许多的函数会提示你进行输入,它们都一定要从mini-buffer读取这些输入,这
  很像使用vi时的:命令或许多Unix shell的命令。

  Emacs附有上百个内置函数,上述只是其中我时常使用的一小部分例子。要知道
  所有的函数以及比上述更完整的说明,请参考在线帮助文档。

  2.3.4 Tab自动完成功能

  就像许多常用的Unix shell(bash、csh、tcsh...),Emacs可以以Tab键提供
  自动完成功能。事实上是先有Emacs的自动完成功能,才有bash的自动完成功能,
  如果你已经用了bash的自动完成功能,应该会觉得很熟悉。

  举例而言,键入M-x search再敲一下Tab,Emacs会在后面补一个连词符(-),
  这就代表还有许多可能的命令,它们的下个字元都是连词符。再敲一下Tab,
  Emacs会列出一串可能符合的命令,但是是在一个新的window中列出,Emacs暂
  时将视窗切成两半:其中一个包括正在编辑的文件,另一个列出可能符合
  ``serach-''的命令。也可以敲C-g取消接下来的选择动作,它还会关闭新产生
  的那一个window。

  2.4 快速指南、帮助文档及使用手册

  Emacs本身也提供快速指南教程,从基本编辑功能开始,一步一步带着你去了解
  所有使用者都该知道的功能,同时也会说明如何使用Emacs的其它帮助功能。

  如果你真的想好好学Emacs,极力建议你花时间看看这个快速指南教程。如上表
  所述,键入C-h t就可以开始这个教程,它为初次接触Emacs的人设计成能够自
  学的形式。

  如果是在X window中执行Emacs,在菜单栏上最右边,可以看到一个标为Help的
  菜单,当点进Help菜单后,就可以看到菜单上有一些以热键标示的项目。

  最后,如果想看Emacs附带的使用手册,可键入M-x info或C-h i,就会开启
  Emacs的文档浏览器--Info。


  3. Emacs的mode

  Emacs的mode是预设的一组行为与功能的集体开关(当然你也可以自定义),能够
  在某些特定编辑环境下的成组的开启使用。Mode的这个设计让单一个编辑器
  (Emacs)能够用来编写文章、编写各种语言的程序(C、C++、Perl、Python、
  Java等等...)、编写网页、发送E-Mail、读Usernet新闻、追踪约会、甚至玩
  电子游戏。

  简单的说,Emacs的mode只是一些扩展、修改或加强Emacs功能的Lisp函数库。

  3.1 主要及次要mode

  基本上,有两类mode:主要mode及次要mode。除非亲手试试开关一些mode,不
  然很难轻易了解它们的差异,所以要试一下。

  Emacs一次只能打开一个主要mode,但同时能打开许多次要mode。一个主要
  mode是用于一种语言或一种工作,次要mode是支援各种工作的一些较小、较无
  针对的的附属工具。

  这样说好像还是太抽象,所以还是举个实例好了。当书写旧式文本文件时,我
  常用一个mode,称做text-mode。它设计用来编写如README文件一样的无格式限
  制的文字文章。当我运用按键在文章间跳字、跳行时,这个mode能分辨英文单
  词和英文段落执行我想要的动作。

  当写文章给一般人看时,我会想要把它的格式修得好看一点,因而英文换行位
  置要修得恰如其分。此时,就会打开auto-fill这个次要mode。当写入一段文字
  到一行的右端时,它会``正确地''处理换行的动作。它所以属于次要mode,是
  因为它能支援数个不同的主要mode。当编写到一行的右端时,在text-mode和
  java-mode各别会有不同的换行的规则,所以说它能``正确地''处理换行的动作。
  编写Java程序不会想让它像英文文本一样自动换行,但是又希望Java程序中的
  注解又能有类似的换行效果。auto-fill mode就是能够聪明地弄清楚其间的差
  异。

  Emacs的各类mode版本的开发者都能好好地把所有该是次要mode的归类为次要
  mode。

  看一下上述以ASCII画出的图示,就可以发现其中的mode line中显示有Emacs所
  在的(所有)mode。在上例中的mode是预设的``Lisp Interaction'' mode,它事
  实上只有在撰写Lisp程序时才会用到。(但是因为Emacs是以Lisp开发的,所以
  就很当然了。)

  3.2 编程mode

  首先,Emacs是程序设计师为程序设计师设计的,所以对各种常用的(甚至不常
  用的)程序语言都有些高品质的mode,在此将只简略介绍其中的一部分。

  大部分程序mode都有一些共存的特徵,通常会做到以下全部或部分的事:

  o  对各种语言提供以颜色强调语法的功能。
  o  提供自动缩进和代码格式化功能。
  o  提供上下文(语言)相关的帮助文档。
  o  自动接入对应的调试器。
  o  在菜单栏置入与语言相关的菜单。

  在许多语言的程序开发中一些共通的工作,还可以以一些非针对语言的mode解
  决。比如,版本控管、自动附加注解、产生Makefile、更新修改记录等等...。

  这些mode组合起来,与一些针对特定语言例如C++或Java的商业性集成开发环境
  (Integrated Development Environment;IDE)相比,Emacs的成熟度和稳定
  度就显的相当不错。而且,理所当然的,它是免费的。

  3.2.1 C/C++/Java

  因为C、C++和Java极其相似,Emacs有一个mode同时支援这三种语言(以及
  Objective-C和IDL),它相当成熟、完整而且已经整合到Emacs发行的发行版中,
  称为cc-mode或者CC Mode。

  欲了解mode细节以及下载新版本,请至 http://cc-mode.sourceforge.net/.

  3.2.2 Perl

  在Emacs中编辑Perl有两种mode。第一种(当然)称为perl-mode,第二种称为
  cperl-mode。我没有深入了解为何会有两种mode(文档中也没写),但是显然
  perl-mode是最早用来以Emacs编辑Perl的,但是功能比cperl-mode少又无法分
  辨一些新的Perl语法。

  个人建议使用cperl-mode,它好像维护的较积极,而且我想用的每一个功能它
  都有。 它最新的版本可以从以下网页取得:
  https://github.com/jrockway/cperl-mode.

  但是这只是个人的建议,两种都试一试,试着找到符合你真正需要的。

  3.2.3 Python

  Emacs也有个mode用在Python(另一种相当常用的脚本语言)上,就我所知,它
  并没有搭配 GNU Emacs发行,而是搭配XEmacs发行,但是在这两支程序上,都
  跑得很顺畅。

  python-mode可以从Python官网 http://www.python.org/emacs/python-mode/
  取得。

  3.2.4 其它

  还有很多其余的mode,都对程序设计师有帮助,例如:

  o  Shell Scripts (Bash, sh, ksh, csh, ...)
  o  Awk, Sed, Tcl, ...
  o  Makefiles
  o  Change Logs
  o  Documentation
  o  Debugging

  还有更多其余的mode,欲知这些mode和add-in的详情,请参考后文``其余资
  源''一章。

  3.3 文字工作

  有趣的Emacs mode不只是给编写程序的那些人享用,一些(各类)撰写文档的
  人也可以享用广泛的各种Emacs mode。

  3.3.1 拼写检查(ispell mode)

  许多文章的作者有时候会需要单词拼写检验。如果安装GNU ispell,只要键入
  M-x ispell就能检验当前buffer内的单词拼写。当遇到一个未知的拼写,就像
  很多付费软件包一样,ispell会罗列一些可能的拼法,供你选择。

  3.3.2 HTML (html-helper mode)

  当你发现你要写一小会儿(或者甚至更长时间)的HTML文件时,你就可能想试试
  html-helper-mode。这个mode、资料文档和相关资讯都可以从
  http://www.nongnu.org/baol-hth/取得。

  就如其名,对以人工(老方法)撰写HTML的人,html-helper-mode可以提供许
  多的帮助。

  3.3.3 TeX (tex-mode)

  当以Tex撰写文档时,Emacs可以帮忙颜色强调语法符号,例如倒斜线、大括号
  (braces)以及其它符号。这些都可以交给tex-mode。

  虽然我不常使用TeX,但是一旦使用到,这个mode能让Tex程序的可读性更高。

  3.3.4 SGML (sgml-mode)

  本文(译者按:最开始写的时候)是以SGML写的,也许最后会转换成你所读的
  格式。 sgml-mode提供SGML文件的基本所需:验证、强调字、向前标签、向后
  标签等等... ,它也是Emacs的标准附件。

  3.4 更多Mode

  当然,还有许多其它好用的mode,以下只是一些常用的范例:

  3.4.1 版本控制(vc mode)

  vc mode是个前端,可以配合大多版本控制的后端程序(RCS、SCCS、CVS),让
  check in文件、check out文件、发行管理及其它功能变得更容易。它是Emacs
  的标准组件,在Emacs的资料文档中也有记载。

  3.4.2 Shell Mode

  要执行一些shell命令,何必切换到其它X window或虚拟console?你可以省省
  事,直接 在Emacs中执行。:-)

  键入M-x shell能以一个Emacs buffer开启一个shell,在shell命令行中能做的
  事,大部分都可以在其中做到(除了如vi或pine等用到全萤幕的程序外),因
  为Emacs会替你去跟真正的shell交互。

  这也是Emacs的标准附件,所以可以在Emacs的资料文档中看到。

  3.4.3 Telnet以及FTP

  要执行telnet或FTP,何必切换到其它X window或虚拟console?省省事,直接
  在Emacs中执行吧!(注意到这种说话方式了吗?)

  就像在Emacs中执行shell,你也可以在Emacs中执行telnet和ftp。要体验一下,
  可以键入M-x telnet 或M-x ftp。要知道它们细节有多好,请参考它们的资料
  文档。

  3.4.4 Man

  要阅读手册页(manual page),何必切换到其它X window或虚拟console?省
  省事,直接 在Emacs中执行吧!(我保证不会再重复下去。)

  就像在Emacs中执行shell,你也可以在Emacs中阅读手册页。要体验一下,可以
  键入 M-x man。要知道更多细节,请参考它们的资料文档。

  3.4.5 Ange-FTP

  以下引自于ange-ftp的文档:

      本组件尝试让在Emacs中以FTP协议读写文件和目录时能尽可能简单又透明,
      一部分惯用的本地文件处理函数会被扩展到远程FTP文件读写上。

  也就是说,可以把远程电脑的文件当做本机文件来使用。所以,如果你需要编
  辑另一台电脑的一个文件,只要让Emacs打开它(只是路径有一点不同),
  Emacs就会帮你处理登入和抓取文件的细节。当以C-x C-s命令保存时,
  ange-ftp又会拦截这个命令,把文件存写回那台远程机器。

  有一点不同的路径像这样。例如在称为``my.host.org''的一台主机上,一个
  ``user''用户的主目录中,有一个称为``myfile''的文件,则它能以以下的文
  件路径来打开(C-x f):

      /user@my.host.org:~user/myfile

  这也是Emacs的标准附件,所以可以在Emacs的资料文档中看到它。

  感谢Etienne Grossmann ( etienne@anonimo.isr.ist.utl.pt)提供以上的范例。


  4. 自定义Emacs

  实质上,所有Emacs的自定义功能都是以Lisp代码来实现。你可以修改一个影响
  Emacs操作的变量值或者为Emacs新写一个函数 (或覆盖既有的函数--代之以你
  写的)。

  4.1 暂时性自定义

  当试着自定义Emacs时,也许你只想暂时试一下,一旦出差错,可以键入 C-x
  C-c离开Emacs重来一次。一旦确定出要固定改变的内容,你就可以把这些内容
  加到你自己的.emacs文件中,之后每次开启Emacs时,改变的内容都可以生效。
  这将在下一节加以讨论。

  4.1.1 变量赋值

  最简单的自定义就是改变Emacs变量的值。Lisp代码的写法如下:

  (setq variable-name new-value)

  其中,variable-name为变量名,new-value为将要赋予的值,(以Lisp术语,
  称为把变量绑一个值)。Lisp中的setq函数可比喻为其它程序语言中的赋值运
  算(一般为=)。

  NOTE: 为简化说明,在此我忽略掉许多细节。你可能还会看到我或其他人用到
  其它如set甚至setq-default等函数。如果有兴趣,请参考Emacs Lisp 的参考
  资料。

  请看我的.emacs文件的一行代码

  (setq-default transient-mark-mode t)

  当我把一段文字标示出时,transient-mark-mode这个变量控制它是否要呈现出
  强调色。许多GUI应用程序中,如果以点选以及拖拽鼠标的方式选取一段文本时,
  这段文本可能会以反色或一些不同的颜色强调。如果transient-mark-mode被设
  定(成non-nil值),Emacs也会有相同效果。

  你说什么值?

  好,简单说一句。大部分程序语言有些如true/false的值。在C/C++中,非零的
  值就当做是true。在Perl中,非null或非零的值就是true。在Lisp中,观念相
  同,只有名称和符号不同。

  true通常写成t而false(或null)写为nil。就如其它程序语言, 任何
  non-nil值都当成是true。

  想知道transient-mark-mode功能的完整描述,可以使用在线帮助文档,只要先
  键入C-h v或M-x describe-variable,再键入transient-mark-mode 即可。如
  果像我一样怕麻烦,可以利用Tab键辅助补完变量名,只要先键入变量名的一部
  分,再敲Tab键就可以了。如果你第一步键入的部分够长,以至于Emacs够用来
  判断出唯一的一个名称,此时就可以直接补全得到完整的变量名了。

  另一个常设定的变量是fill-column,它告诉Emacs自动换行(以
  auto-fill-mode 设定)时萤幕的宽度。要设定它,需键入:

  (setq fill-column 20)

  这样还没开始,你还要告诉Emacs去运行刚刚键入的表达式。做法是先把point
  (光标)置于这个表达式的后端,键入C-x C-e,在这个范例中,就会调用函数
  eval-last-sexp。此时可以看到在萤幕底部的mini-buffer中,会回显一个值
  20(或你所设的值),这就是表达式的返回值。

  想试试是否有效,先写一两句句子,如果auto-fill-mode开启的话(可能你没
  开),就会发现文章在标为第20列的地方自动换行。或者,在键入一些东西后,
  再键入M-q, 就会调用fill-paragraph,就会执行换行。

  4.1.2 文件关联

  当开启一个某种格式的文件时,Emacs可以设定成自动做某些事(就如在一些
  GUI中, 如果点选特定文件的图标时,会自动开启特定的应用程序)。举例而
  言,如果我想在每次打开有.txt扩展名的文件时,要Emacs自动切换到
  text-mode。 愕,这已经设好了!:-)那就要求Emacs在开启``README''时也自
  动切换到 text-mode。

  (setq auto-mode-alist (cons '("README" . text-mode) auto-mode-alist))

  呃?

  为了不要钻进你没必要去了解(要了解也无伤)的Lisp程序设计,先说明一下
  auto-mode-alist变量涵括一个以一群pair组成的list。每个pair都包含了一个
  正则表达式和一个mode名。如果你开启的文件恰好匹配了其中一个pair里的正
  规表达式(此例中为``README''字符串),Emacs就会启动该正则表达式相对应
  的mode。

  本范例语法妙的地方是我事实上给原来的pair列表加了一个pair,因为若不确
  定auto-mode-alist中原来包含哪些东西,最好不要随便给它重新设定一个值。
  又如果想在每次开启以.html或.htm结尾的文件时要Emacs自动切换到
  html-helper-mode,我就会在我的.emacs文件中加入:

  (setq auto-mode-alist (cons '("\\.html$" . html-helper-mode) auto-mode-alist))
  (setq auto-mode-alist (cons '("\\.htm$" . html-helper-mode) auto-mode-alist))

  这样好像就会没完没了。

  4.2 使用.emacs文件

  在Emacs上花了些时间,了解了自定义有哪些功效后,你也许想永久保留一些自
  定义(或保留到改天你不想要的时候)。当你的Emacs变成每日必用时,你
  的.emacs文件的大小也会日增一日。这是好现象,这代表你知道如何让Emacs能
  配合你。很不幸,很多软体产品无法让你这样使用。

  不确定你是否猜过,但是每当开启Emacs时,它就会检查你的home目录中一个称
  为.emacs 的文件,所有自定义想执行的Lisp代码都应该放在你的.emacs文件中。

  我的.emacs文件中的另一个例子:

  (setq inhibit-startup-message t)

  inhibit-startup-message变量控制Emacs开启时要不要显示欢迎信息。有一天
  ,我开始受不了看到这个信息(因为我已经知道如何去找帮助文档及诸如此类
  的东西),于是开始研究如果关掉它。

  作个实验,试着创建你自己的.emacs文件,加上这一行表达式,然后关闭
  Emacs,再次启动它,就会发现欢迎信息不见了。

  往往当你去读一个Emacs mode(或package)的文档,它会建议你在.emacs文件
  中加些东西 以让这个mode或package以某种方式生效。

  GNU Emacs FAQ (C-h F)有些项目跟.emacs文件有关,你也许会用到。

  4.3 Customize组件

  当Emacs越来越常用而且持续发展,于是有人说:“应该有更好的方法让初学者
  也能自定义Emacs。”Customize应运而生。

  Customize组件提供直观的方法自定义部分的Emacs。如果想试用这项功能,可
  试用Help菜单(或Options菜单)中的Customize子菜单,或键入M-x
  customize即可。

  Customize将自定义的工作分成逻辑群,如``Editing''、``Programming''、
  ``Files'' 等等...。有些逻辑群更细分为次群。

  如果用Customize界面做了一些修改,Emacs会把修改放进.emacs文件。如此就
  很方便, 因为你能轻易地检查(以及改变)它的改变。

  我平时没使用Customize界面,所以无法多加叙述。

  4.4 X Windows显示

  就像正确工作的 X 应用程序,Emacs遵守 X 资源的标准,也就是说,就如使用
  xterm、 nxterm和其它应用程序一般,你可以控制它初始的颜色、几何形状和
  其它X指定的项目。

  以下为我的~/.Xdefaults文件的相关项目:

  emacs*Background: DarkSlateGray
  emacs*Foreground: Wheat
  emacs*pointerColor: Orchid
  emacs*cursorColor: Orchid
  emacs*bitmapIcon: on
  emacs*font: fixed
  emacs.geometry: 80x25

  X 资源的细节,请参考X手册。

  Chris Gray ( cgray4@po-box.mcgill.ca) 说过:

      “在Debian中,~/.Xdefaults似乎没用。但是Debian使用者如果把相同的值
      放入 /etc/X11/Xresources/emacs中,就可以得到和在RedHat中所拥有的
      精彩颜色。 ”


  5. 常用package

  Emacs除了有各式各样的mode外,还有许多附加组件。我称它们为package,因
  为它们不只是新的mode,它们往往包含外加的附属程序或太大以致称为mode很
  不搭调,有时它们是其它mode扩充版或整合版。分法不是很清楚,但是不重要。

  5.1 VM (Mail)

  VM FAQ的引言:

      “VM (View Mail)是Emacs的子系统,可用以在Emacs中阅读和处理电子邮件。
      具备一些常用命令,来做到电子邮件客户端程序通常都能做到的事,如回
      信、把邮件信息储存在各类文件夹中、删除邮件等等...。它还具备其它进
      阶的功能,如载入与创建news文摘、转信、以及依据设定的标准组织信息
      的表示方式。”

  当我首次使用Emacs时,曾经试用VM一段日子,发现可以取代Pine、Elm或其它
  电子邮件程序 ,只是我不想用不同的程序读信和news。如今,VM持续积极地发
  展,并且有很好的支持。

  可以从此处取得: http://www.nongnu.org/viewmail/.

  5.2 Gnus (Mail以及News)

  GNUS手册引文:

      “Gnus是信息阅读实验室,它可以用来看几乎任何东西。可以用来读信、可
      以浏览目录、可以执行ftp--甚至还可以用来读news!”
    
      “就如Emacs强化人们编辑文章一般,Gnus强化人们读news。Gnus不限制使
      用者如何使用它,并且鼓励使用者扩展它的程序,改成具有他们想要的功
      能。程序不应该控制人类;相反的,人类应该被赋予使用(甚至滥用)程
      序的方式的权力。”

  我现在即是用GNUS来使用电子邮件和news(如前所述)。如今,GNUS也是持续
  积极地发 展,并且有很好的支持。

  可以从此处取得: http://www.gnus.org/.

  5.3 BBDB (通讯录)

  BBDB是个Insidious Big Brother数据库,是Emacs的一种通讯录程序,可用于
  最常用的Emacs电子邮件package(含VM及GNUS)。

  可以从此处取得: http://bbdb.sourceforge.net/.

  5.4 AucTeX (另类 TeX mode)

  AucTeX是编辑TeX文件的另一个mode。

  AucTeX网站的引文如下:

      “AUC TeX是个扩展组件,支持大部分Emacs撰写和格式化TeX文件。支持很
      多不同的宏包,如AMS TeX、LaTeX以及TeXinfo。”

  可以从此处取得: http://www.gnu.org/software/auctex/.


  6. 其余资源

  本章涵盖可用于找到更多有关Emacs的资讯的书籍、网页、新闻组、邮件列表、
  及其它地点。

  6.1 书藉

  有些很好的书可以学习Emacs,另外许多Linux和Unix书籍也会含盖一两个章节
  介绍Emacs(和vi)。

  6.1.1 Learning GNU Emacs

  作者: Debra Cameron, Bill Rosenblatt, Eric S. Raymond

  出版商:O'Reilly 及 Associates - http://www.ora.com/

  评语:这可能是最好的初阶书籍。读过本HOWTO以及FAQ,这本书会提供完整而
  且相当平易近人的教学。

  6.1.2 Writing GNU Emacs Extensions

  作者:Bob Glickstein

  出版商:O'Reilly 及 Associates - http://www.ora.com/

  评语:这本书是为那些使用Emacs一段时间,想尝试开发自己的mode或尝试高阶
  自定义的人。虽然它不是以教授Lisp为宗旨,但其中确实简略介绍了这个语言。

  6.1.3 Programming in Emacs Lisp: An Introduction

  作者:Robert J. Chassell

  以下引自该书的README文件:

      “本书是以Emacs Lisp开发程序的初级课程,适用于非程序员、对程序设计
      不一定感兴趣但是想自定义或扩展他们电脑环境的人。”

  可以以匿名(anonymous)登入GNU FTP服务器取得这本书的完整内容:
  ftp://prep.ai.mit.edu/gnu/emacs/.

  评语:Emacs Lisp的极佳入门手册--即使你不是专业程序设计师

  6.1.4 The GNU Emacs Lisp Reference Manual

  作者:Richard Stallman

  出版商:The Free Software Foundation - http://www.fsf.org/

  可以以匿名(anonymous)登入GNU FTP服务器取得这本书的完整内容:
  ftp://prep.ai.mit.edu/gnu/emacs/.

  评语:Emacs Lisp程序设计的终极指引。

  6.2 网站

  6.2.1 EMACSulation

  EMACSulation是Eric Marsden在Linux Gazette线上杂志的专栏,网址是
  http://www.linuxgazette.com/。 最新一期的网址是
  http://www.linuxgazette.com/issue39/marsden.html。 其中最底下有链接指
  到前一期。

  6.3 新闻组

  如果搜索newsgroup中含有``emacs''字眼的供稿点(news feed),可能会找到
  很多, 以下是我的服务器搭载的供稿点:

  o  comp.emacs
  o  comp.emacs.sources
  o  gnu.emacs
  o  gnu.emacs.bug
  o  gnu.emacs.help
  o  gnu.emacs.sources

  6.4 邮件列表

  自由软体协会也为GNU Emacs主持个邮件列表。欲知更多资讯,请参考网址
  http://mail.gnu.org/mailman/listinfo/help-gnu-emacs。

  就我所知,现今唯一专门讨论Emacs的邮件列表是NT-Emacs列表。这是使用
  Micro$oft Windows版Emacs的人的列表。欲知更多资讯,请参考网址
  http://www.cs.washington.edu/homes/voelker/ntemacs.html。

  6.5 Emacs Lisp代码库

  以下引自Emacs Lisp代码库的README:

      “ftp.cis.ohio-state.edu网址上的Emacs Lisp代码库包含Emacs Lisp代码
      的各个片段和package。Emacs Lisp是用以扩展自由软体协会开发的GNU
      Emacs编辑器的语言。虽然GNU Emacs的发行版本中已经包括很多Emacs
      Lisp代码,但是有很多人或为了和其它系统对接、或为了新增功能、或为
      了改变Emacs的默认行为而编写了一些package。这个代码库的大部分内容
      都是由个人编写,并且经由info-emacs或info-gnu-emacs邮件列表或
      comp.emacs、gnu.emacs、gnu.emacs.sources等newsgroup公开。”

  这个代码库可以以匿名(anonymous)登入
  ftp://ftp.cis.ohio-state.edu/pub/emacs-lisp/的网址取得。

  注:据我所知,Emacs Lisp代码库越来越过时了。虽然我知道有很多新的
  package,但是那里几乎没有新的(或更新的)package。新的package事实上都
  贴在comp.emacs.sources newsgroup。(如果所言有误,请不吝赐教。)


  7. 致谢

  下列的一些人对本文完成都帮了许多忙。

   o  Craig Lyons Craig.Lyons@compaq.com
   o  Robert Vollmert rvollmer@gmx.net
   o  Larry Brasfield larrybr@seanet.com
   o  Etienne Grossmann etienne@anonimo.isr.ist.utl.pt
   o  Thomas Weinell kf6mli@amsat.org
   o  Adam C. Finnefrock adam@bigbro.biophys.cornell.edu
   o  Chris Gray cgray4@po-box.mcgill.ca
   o  Robert J. Chassell bob@rattlesnake.com
   o  Isaac To kkto@csis.hku.hk
   o  Matteo Valsasna valsasna@elet.polimi.it
   o  Tijs van Bakel smoke@casema.net