LinuxDoc+Emacs+Ispell-HOWTO 中文版 作者: Philippe MARTIN ( [1]feloy@wanadoo.fr) 英译者: Sebastien Blondeel ( [2]Sebastien.Blondeel@lifl.fr) 中译者:李安珊 An-Shan Lee ( [3]anshan@hello.com.tw) v0.4, 27 February 1998 _________________________________________________________________ 这份文件主要是提供给 Linux HOWTOs 的作者与译者及其他参与 Linux 文件计划 (Linux Documentation Project) 者参考使用。从本文大家可以找到一些有关使 用Emacs 与 Ispell 工具的提示。 _________________________________________________________________ 1. 前文 * 1.1 版权 * 1.2 铭谢 * 1.3 评论 * 1.4 版本 2. 简介 * 2.1 SGML * 2.2 LinuxDoc 型态定义 * 2.3 SGML-Tools 3. 您的第一份文件 * 3.1 从一份纯文字档文件开始 4. 设定 Emacs * 4.1 重音文字 (Accented Characters) * 4.2 SGML 模式 (SGML mode) * 4.3 PSGML 模式 (PSGML mode) * 4.4 其他相关模式 5. Ispell * 5.1 选择您的预设辞典 (default dictionaries) * 5.2 为特定文件设定个别的辞典 * 5.3 文件的拼字检查 * 5.4 个人辞典与个别档案辞典 (local file dictionary) 的比较 * 5.5 键入时的拼字检查 6. 一些投机的技巧 * 6.1 自动插入页首 (header) Appendix 7. Insert-sgml-header程式之□例 _________________________________________________________________ 1. 前文 1.1 版权 版权属於 Philippe Martin 1998 只要您遵守第二版或之後版本的 GNU 通用公开授权 (General Public License) 的条件,您可以重新散布 及/或 修改这份文件。 1.2 铭谢 特别感谢 Sebastien Blondeel。 Sebastien 是个非常罗哩吧嗦的人,不停的问 我一大堆有关 Emacs 安装的问题。:-) 但也由於他所问的问题都很有意义,才使 我能更深切的了解 Emacs,并将我所学到的知识发表出来,提供给大家参考。 1.3 评论 如果您有任何建议可以改善本文,请不要犹豫尽快的告诉我,我会仔细的参考您 的意见。 对於此文件所探讨的主题,如果您有任何问题的话,也请尽快的告诉我,我会非 常乐意的回答您,因为您的发问或许也能帮助我改善此文件。 英译者注:假如大家认为这文件的英文很难懂的话,那就怪我翻译的不好。 中译者注:那如果大家对这中文文件有疑问的话,那还是怪罪英译者罗,因为 我是照他的英文翻译过来的。:-P 开玩笑的,如果大家认为这份文件中文翻的 不好,请多多包涵,并提供意见给我,以便我改善它,谢谢。 1.4 版本 这份文件与下列版本相关: * Sgml-tools 版本 0.99, * Emacs 版本 19.34, * Ispell 版本 3.1, * 本文举例内相关的 Emacs 程式库都与上列的 Emacs 版本一起发行, iso-sgml 则与 XEmacs 一起发行,而 psgml 则是独自发行的程式库。 2. 简介 2.1 SGML Standard Generalised Mark-up Language,或称为 SGML,是一种可以定义文件 形态的语言。 譬如,您可以定义食谱的文件型态,第一部先呈现其主成分,第二部介绍佐料, 第三部则一步一步的指示如何烘烤蛋糕,之後一幅好看的图画就可表现其可口美 味了。 这就是所谓的文件形态定义 (Document Type Definition)。它并没有定义最後的 产品应是什麽样子,它只说明文件的内容大约包括了什麽。 以此类推,您在读了我这食谱的型态定义的举例之後,您的脑子里就会有您自己 类似的食谱,或者您想的正是您最喜欢的厨子所呈现给您的,对吧?然而,他们 其实看起来都是不同的:在我的想像里,我的成果照片是放在浴室柜子的左上角 ,而主成分的表单是在後花园里,介於游泳池与烤肉区之间。您的呢? 多谢 SGML 的标准定义,我们可以按照其所提供的格式轻松的写一份文件,而不 用担心最後读者会看不懂我们在写些什麽。 2.2 LinuxDoc 型态定义 正如您可能猜到的,这型态适用於写作关於 Linux 的文件。 此种文件通常建构如下:文件的开始是标题,接著是作者的名称,文件的版本号 码与日期。再来是摘要(这样读者就不用在浏览过整篇文件之後才知道这并不是 他们想看的文件),之後是目录,显示文件结构,这样一来那些急於想知道某一 特定内容的人就可直接跳到那部分去读。 然後就是一系列的章节,段落等。在这部分,您可以插入部分程式,改变字体来 强调某个字眼或句子,或插入列表 (lists),以导引读者至文件的另一部份读取 相关资料,等等。 要写这种文件,您只需要正确的详细说明文件的标题,作者,日期,版本,章节 部分,及大约说明何时将插入某一列表 (list),其包含的元件是什麽等等即可。 2.3 SGML-Tools SGML-Tools可以将一文件的特殊规格转换成您所想要的格式。假如您要将此文件 存在您个人的程式库,您可以选择转成 PostScript 格式。假如您要将它透过网 路与世界分享,可将它转成 HTML 格式。假如您必须在 Windows 下读取此份文件 ,您可以把它转成 RTF 格式,并使用文书软体读取。或者您也可以将之转成上述 所有格式,以便您任何时候使用。 您可从这 FTP 站 [4]ftp://ftp.lip6.fr/pub/sgml-tools/ 取得 SGML-Tools。 3. 您的第一份文件 3.1 从一份纯文字档文件开始 假如您要将一纯文字档文件转成 SGML 以便再将之转成其他的格式,做法如下: 1. 再最开头时加上下列字句与标签:
标题 (Title) 放此 作者,作者的电子邮件帐号,等等。 版本及日期 2. 如果您要在开头时摘要此文件的内容,请将下列标签用於此段落的头尾: 。 3. 之後插入这 标签, SGML-Tools 自会显示文件的目录 (Table Of Contents)。 4. 再来,在每一章 (chapter) 的开始,以下列字句与标签取代每一章的号码及 标题: 这一章的标题 (The Title Of The Chapter) 再於这一章的结尾加上此 标签。 注 : 您不需放上这一章的相对号码, SGML-Tools 自会帮您加上。 5. 以相同的方法用於接下来的分节 (section)。您必须删除每一节的号码,并 以此 标签标於每一节开头的标题,及在每一节的结尾标上 。 6. 在每一节中,您也可以使用 标签,将之分层多达 4 个层次,每一层使用同样的标签,其中 n=2,3, 或 4,依此类推。 7. 之後,在每一段落 (paragraph) 的开始,插入

标签。 8. 在段落中,如果您需要强调某些部分,就使用 (斜体), (粗体),或 (打字体) 标签。 9. 若要插入列表 (list),请依下列方式: 例子:这是一个四行的列表: - 第一行放在这里 - 跟著第二行 - 再来第三行 - 第四行。 请以下列方式来标明上列列表: 这是一个四行的列表: 第一行放在这里 跟著第二行 再来第三行 t第四行。 10. 当您要在段落中放进某程式的一部分,或者需要突显某些地方,请依下列方 式: 10 REM 喔,老天!这是什麽? 20 REM 我以为这东西早就不见了! 30 PRINT "我回到..."; 40 PRINT "拯救世界。" 50 INPUT "你从哪得知的? ",M$ 60 IF M$="阿呆" THEN PRINT "你很聪明。":GOTO PARADISE 70 ELSE PRINT "虽然你仍是傻呼呼的。":GOTO RICHMOND 11. 到目前为止,您所学到的 SGML 格式技术已经相当够用。假如您想再加强您 的文件,您可以参考 SGML-Tools 的使用指引,里面详尽的介绍了有关 LinuxDoc 文件型态的应用。 4. 设定 Emacs 4.1 重音文字 (Accented Characters) 假如您需要以法文或其他西欧语言来写文件,您必须使用 8-bit 文字 (8-bit characters),才可显示其有重音的文字。这样的设置才可以令 Emacs 接受这些 文字。 显示 8-bit 文字 要令 Emacs 显示 8-bit 文字,您必须将下列指令加入您的 .emacs 档案: (standard-display-european 1) (load-library "iso-syntax") 假如您在一个不支援 8-bit 的终端机上使用 Emacs,您可以使用 iso-ascii 程 式库 ((load-library "iso-ascii")),它会指令 Emacs 以最相似的形式来显示 这些文字。 8-bit 文字的键入 假如您的键盘允许您键入有重音的文字,那就没有问题,要不然也可照下列方式 来补救: Iso-acc 程式库 Emacs iso-acc 程式库可以让您使用 7-bit 的键盘键入 8-bit 的文字。 只要将下列指令加入您的 .emacs 档案: (load-library "iso-acc") 然後在使用 Emacs 时,开启您所需要编辑的档案,键入 Meta-x iso-accents-mode。 这样您若要键入法文 cafe 的 e 的话,您就可以先键入 ' 然後再键入 e。总之 ,您需先键入那个文字的重音,之後再键入相对的字母(不论大写或小写)。以 下是一些您可以使用的重音: ' : Acute ` : Grave ^ : Circumflex " : Dieresis ~ : Tilde, cedilla, 与其他特别的例子 (cf iso-acc.el). / : 在一字母上加线,等等。 如果您只需要这些重音符号之一,但不是相对的重音字母,那就在符号之後键入 一空白键。例如,要输出 l'elephant,就键入 l ' 空白 ' e l ' e ... 即可。 您可以在 iso-acc.el 档案内找到所有您需要的重音组合。 Meta 键 您可以在某些终端机上使用 Meta (或 Alt) 键来键入 8-bit 文字。例如,您可 以键入 Meta-i 来输出 e 这个字。 但是就我所知, Emacs 将 Meta 键用於其他场合,其他的程式库似乎也不提供这 种重音输入方式。 不过我们还是可以以下列方式来补救: (global-set-key "\ei" '(lambda () (interactive) (insert ?\351))) _ ___ 只要将上列指令加入您的 .emacs 档案内,您就可以用 Meta-i 来输出 e。您也 可以重新定义您要的组合,只要您用您要的字键 (key) 取代 i,用正确的编码 (code) 取代 351,再配对起来,就可以得到您要的重音字母。您可参考 ISO-8859-1 character set 取得您要的编码。 注意! 某些 local modes 或许会重新定义您的字键组合。 8-bit SGML 文字的显示 使用 SGML 时,您可以利用巨集 (macros) 来输入重音文字。例如,要输入 e 就 可用 é。但通常,需要读取 SGML 的应用软体都可以读取 8-bit 文字, 所以一般都用不到这种巨集。或许有些软体仍然无法读取 8-bit 文字,那麽这时 您就可以利用上述巨集了。 一般时候,在使用 Emacs 时,您可以利用 iso-sgml 程式库来输入重音文字。当 您要将文件档案存到磁碟时,它也会帮您把 8-bit 文字转成 SGML 的格式,以方 便您读取。 所以有了这个程式库,您就可以在使用 Emacs 时,轻松的输入或读取 8-bit 文 字,甚至一个不接受 8-bit 文字的软体,也可以读取您编写的 8-bit 文件。 您只要将下列文字加入 .emacs 档案内,您就可以使用上述程式库: (setq sgml-mode-hook '(lambda () "Defaults for SGML mode." (load-library "iso-sgml"))) 4.2 SGML 模式 (SGML mode) 当载入 .sgml 相关文件时, Emacs 通常会自动进入 sgml 模式。 假如没有的话 ,您可以键入 Meta-x sgml-mode 来驱动它进入 sgml 模式。或者将下列指令加 入 .emacs 档案内来设定它自动进入: (setq auto-mode-alist (append '(("\.sgml$" . sgml-mode)) auto-mode-alist)) 在 sgml 模式下,您可以选择要如何输出 8-bit 文字。比如,使用 Meta-x sgml-name-8bit-mode (或是选单项目上的 SGML/Toggle 8-bit insertion), 您可以选择直接输出 8-bit 文字的格式,或是输出 SGML 的格式(即 &...; 格 式)。 在此模式下,您也可以使用 Meta-x sgml-tags-invisible(或是选单项目上的 SGML/Toggle Tag Visibility) 来选择是否要隐藏或显示 SGML 标签。 4.3 PSGML 模式 (PSGML mode) PSGML 模式对於在使用 Emacs 下编辑 SGML 文件很有助益。 这份文件 [5]psgml-linuxdoc 解释了如何安装这个模式,及如何将之应用在 LinuxDoc。 4.4 其他相关模式 Auto-fill mode 在一般模式下,当您打完一个段落,您通常会键入 Return 以便换到下一行,否 则您文章的段落就会相连,无法分清楚。但当您使用 Return 以便换到下一行时 ,您的段落的右边通常是参差不齐的。 但假如您不换到下一行而继续键入文字,在某些编辑器下,您就无法看到右边边 界外的文字是什麽。 在这情形下,auto-fill 模式可以帮您改正这情况。当您键入超过预设值的第70 列时,在这模式下,您就会自动换到下一行。 下列是执行 auto-fill 模式的指令,并可将一行的宽度调整为80列: (setq sgml-mode-hook '(lambda () "Defaults for SGML mode." (auto-fill-mode) (setq fill-column 80))) 5. Ispell 如果您要在使用 Emacs 时作拼字检查,您可以使用 Ispell 套件及其 Emacs 模 式。 5.1 选择您的预设辞典 (default dictionaries) 您可以设定 Emacs,使之在开始载入某一文件时,便自动选择所需的辞典(您可 以选择好几个)。预设辞典 (main dictionary) 即主要辞典,是与 Ispell 一起 发行的辞典。您可以选择您所需要的语言。第二个即是您的个人辞典 (personal dictionary),您可以设定要 Ispell 将您在主要辞典里所找不到的字放到这里。 假如您要将 Ispell 里的法文辞典设为预设辞典,并想用您主目录 (home directory) 下的 .ispell-dico-perso 档案作为个人辞典,可以在 .emacs 档案 里加入下列指令: (setq sgml-mode-hook '(lambda () "Defauts for SGML mode." (setq ispell-personal-dictionary "~/.ispell-dico-perso") (ispell-change-dictionary "francais") )) 5.2 为特定文件设定个别的辞典 如果您没有用同一语言来检查整份文件的拼字,那麽您可能会遇到一些困难。但 当您在翻译文章时,您很有可能经常交换使用不同的语言与辞典。 不管是自动设定的或是手动的,我并不清楚 Lisp 是如何选择所需的主辞典和个 人辞典。(如果您知道的话,请来信告诉我!) 不过呢,在每一个档案的结尾,只要将下列指令加入作为注释,您都可以指定您 现行的档案要使用哪一辞典。 Ispell 开始拼字检查时即可应用所指定的辞典: 假如您在 .emacs 档案里已经设定了预设辞典为法文,那您可以将上述指令加入 您所写的英文文件的结尾,以便使用英文辞典。 5.3 文件的拼字检查 若要检查整份文件,可在文件内任一处使用 Meta-x ispell-buffer 指令。您也 可以检查文件某些部分的拼字: * 将要检查拼字的部分之开头用 Ctrl-Spc 标注 (mark) (即所谓的 mark-set-command), * 然後标注到那部分的结尾, * 再键入指令 Meta-x ispell-region. Emacs 就会开始执行 Ispell。当遇到辞典里所没有的字时,程式会显示这个字( 通常以反白显示),并要求您输入下列指令: * spc accepts the word, this time only, * i accepts the word and inserts it in your personal dictionary, * a accepts the word for this session, * A accepts the word for this file, and inserts it in the local file dictionary * r allows you to correct the word by hand * R allows you to correct all the occurrences of the misspelled word, * x stops the checking, and puts the cursor back in place, * X stops the checking and leaves the cursor where it is, letting you correct your file; you will be able to continue the spell-checking later if you type Meta-x ispell-continue, * ? gives you online help. 如果 Ispell 找到类似的词汇,它会将这些文字显现在一小视窗内,每一个文字 前都有号码标明,只要键入您要的那个字汇的号码, Ispell 就会以您所选的字 取代错字。 5.4 个人辞典与个别档案辞典 (local file dictionary) 的比较 i 键让您可以在您的个人辞典内插入一个新字,而 A 键让您在个别档案辞典内插 入新字。 个别档案辞典其实是一档案结尾所插入一系列的字或评论, Ispell 每次检查此 档案的拼字时都会重新读取这个辞典。如此,您就可以键入一些只在这特定档案 能接受的字,而其他档案则可不受此辞典影响。 在我看来,我认为个人辞典最好是用来储存一些主辞典所没有的字,尤其是那些 属於各国语言的字(像是有连字符号 hyphenated 的字),及一些通用的特定名 词(像是 Linux),但在个人辞典内加入太多像是姓名的单字也不太好,因为这 些字就会被当作一般字使用了(您可以想像如果您把 Tof 加入个人辞典内, Ispell 可能就会在下列的例子里,忽略这个错字: `When the going gets tof, the tof get going.' Tof 是法文 Christophe 名字的缩写。 ) 5.5 键入时的拼字检查 当您在键入文字时,只要您在这 ispell-minor-mode 模式下, Ispell 就会自动 帮您检查拼字。要启动或关闭这模式,请键入这指令 Meta-x ispell-minor-mode。每当有 Ispell 查不到的字时,它就会哔一声来提醒您。 假如您觉得哔一声很烦人,只要键入指令 Meta-x set-variable RET visible-bell RET t RET ,您就可以改用萤幕的闪烁来提醒您。您也可以在 .emacs 档案里加入下列指令来关掉 Emacs 的声音: (setq visible-bell t) 6. 一些投机的技巧 6.1 自动插入页首 (header) 在 Emacs 下,您可以将任何事件外挂 (hook) 任何的动作(像是打开一个档案, 储存,或执行一个新的模式,等等)。 您也可以利用 autoinsert 程式库来执行一些特别的动作:当您在 Emacs 下开新 档案时,这个程式库就会根据档案的属性来插入相符的标准页首。 就我们的情形,这标准页首就是我们说明文件型态 (LinuxDoc),标题,作者,及 日期的地方。 接下来我会描述两个如何插入这种页首的方法。您可以插入一个含有相关资讯的 模板 (template) 档案,或者您也可以跑一跑 elisp 程式。 藉由插入一个档案 当您开启一份档案时,首先您必须告诉 Emacs 执行自动插入,然後再读取 autoinsert 程式库的资料来宣告我们要改变的 auto-insert-alist 表单。这表 单定义了不同档案型态所要插入的页首。它的预设值是要插入的档案必须在 ~/insert/ 目录下,但如果您要重新定义其 auto-insert-directory 也是可行的 。 每一次您开启一份新的 SGML 档案时,只要在 .emacs 档案内加入下列指示,您 就可以插入 ~/emacs/sgml-insert.sgml 档: (add-hook 'find-file-hooks 'auto-insert) (load-library "autoinsert") (setq auto-insert-directory "~/emacs/") (setq auto-insert-alist (append '((sgml-mode . "sgml-insert.sgml")) auto-insert-alist)) 那您就可以在 ~/emacs/sgml-insert.sgml 档写入您自订的页首,然後再重新执 行 Emacs 来开启某一 foobar.sgml 档案,之後 Emacs 会询问您确认这自动插入 的指令来插入您要的页首。 藉由执行一个程式 这方法跟上述大同小异,但不同的是您必须设定 auto-insert-alist 表单,告诉 它要插入的是一个执行程式,而非一个档案。只要在 .emacs 档案内加入下列指 示,就可以自动执行,不过当然您得先把这程式写在一个叫做 ~/emacs/sgml-header.el 的档案里才可以。(鉴於这函式可能会过长,您不需要 将它放在 .emacs 档案里): (add-hook 'find-file-hooks 'auto-insert) (load-library "autoinsert") (add-to-list 'load-path "~/emacs") (load-library "sgml-header") (setq auto-insert-alist (append '(((sgml-mode . "SGML Mode") . insert-sgml-header)) auto-insert-alist)) 您可以参考 [6]附录里有关 Insert-sgml-header 程式的例子。 Appendix 7. Insert-sgml-header程式之□例 读者在撰写一份 Linux Documentation Project 文件时,可以使用下列程式来启 动自动插入自订的页首。 透过一 mini-buffer,上述程式会要求读者提供一些或许必要的资讯。 它会先询问要输出的标题是什麽,若您没有提供,则页首就不会显现标题。再来 是日期,作者,作者的电子邮件帐号与 home page (最後两项可随意填入)。 接著它会询问翻译者的名字。若无,请直接键入 Return。若有,程式就会接著询 问译者的电子邮件帐号及 home page (同样也是随意填入)。 再来它会把您的输入存入 current buffer,包括任何您输入的资讯格式,及摘要 和第一章的标签。之後它会将游标导向您要键入摘要的的地方。 (defun insert-sgml-header () "Inserts the header for a LinuxDoc document" (interactive) (let (title author email home translator email-translator home-translator dat e starting-point) (setq title (read-from-minibuffer "Title: ")) (if (> (length title) 0) (progn (setq date (read-from-minibuffer "Date: ") author (read-from-minibuffer "Author: ") email (read-from-minibuffer "Author e-mail: ") home (read-from-minibuffer "Author home page: http://") translator (read-from-minibuffer "Translator: ")) (insert "\n

\n") (insert title) (insert "\n\nAuthor: ") (insert author) (insert "\n") (if (> (length email) 0) (progn (insert "\n"))) (if (> (length home) 0) (progn (insert "\n"))) (if (> (length translator) 0) (progn (setq email-translator (read-from-minibuffer "Translator e-mail : ") home-translator (read-from-minibuffer "Translator home pa ge: http://")) (insert "Translator : ") (insert translator) (insert "\n") (if (> (length email-translator) 0) (progn (insert "\n"))) (if (> (length home-translator) 0) (progn (insert "\n"))))) (insert "\n\n") (insert date) (insert "\n\n\n\n") (setq point-beginning (point)) (insert "\n\n\n\n\n

\n\n\n\n\n\n") (goto-char point-beginning) )))) References 1. mailto:feloy@wanadoo.fr 2. mailto:Sebastien.Blondeel@lifl.fr 3. mailto:anshan@hello.com.tw 4. ftp://ftp.lip6.fr/pub/sgml-tools/ 5. http://www.linux-france.com/article/psgml-linuxdoc 6. file://localhost/tmp/zh-sgmltools.25528/LinuxDoc+Emacs+Ispell-HOWTO.txt.html#insert-sgml-header