emacs .emacs_将Emacs用于XML文档

emacs .emacs

尽管Emacs是众所周知的功能强大的文本编辑器,受到UNIX开发人员的青睐,但是Emacs可以用于在非UNIX平台(例如Windows,MS-DOS和MacOS)中使用XML。 Emacs( 简而言之,请参见侧栏Emacs )是一个成熟的开发环境,用于处理文本,编写应用程序以及创建结构化信息(如XML和SGML),正如我将要讨论的那样。 我将其用作创建和管理一些编程项目,编写XHTML以及使用SGML和XML的通用编辑器。 实际上,我用它来写这篇文章。

本文介绍了如何安装Emacs以及扩展PSGML和OpenSP。 它还概述了如何自定义Emacs使其与各种DTD一起使用。 我一次展示了许多Emacs定制。 但是,您可以下载带有示例DTD和所有Emacs定制的zip文件(请参阅参考资料 )。 我的目的是通过为您提供足够的信息来使您开始使用Emacs,以了解发生了什么事情。 然后,您将能够添加DTD并根据您的需求和偏好自定义Emacs。

获取和安装Emacs

首先安装Emacs。 您可以从GNU网站或其镜像访问其他Emacs信息和发行版(请参阅参考资料 )。 Emacs随附了一些基于UNIX的发行版。 例如,我的Redhat Linux 7.1附带了已经安装的Emacs版本20.5.1(PSGML的旧版本)。

Linux和UNIX安装

因为大多数UNIX和Linux用户都足够精通,可以在没有我的任何指导的情况下获取和安装软件,所以我只将您带到GNU项目站点。 我在本文其余部分中描述的定制将适用于UNIX / Linux环境。

Windows安装

Windows用户可以从GNU FTP列表中列出的任何FTP站点的windows / emacs /目录中找到最新的二进制发行版。 emacs-20.7-bin-i386.tar.gz文件不包含Emacs Lisp源。 编者注:10月下旬发布了21.1版,而本文仍在生产中。 本文基于20.7版本,并将进行更新以包括有关新版本的详细信息。 如果您想对Emacs进行编程或了解如何实现特定功能,请下载emacs-20.7-fullbin-i386.tar.gz文件。 将.gz文件下载到本地硬盘驱动器。 使用WinZip或其他支持.gz的工具将内容提取到硬盘驱动器上的目录结构中(提取时请确保“保留文件夹信息”,以便创建适当的目录结构)。 如果解压缩到驱动器d :,并允许创建原始目录结构,则最终将得到基本路径d:\ emacs-20.7,其中d:是在其上分发发行版的驱动器。 对于本文的其余部分,我将此目录称为d:\ Emacs。 自述文件建议您在安装路径中避免空格。 我听了这个警告。

解压缩发行版后,主目录下将有许多文件和四个子目录:bin等,info和lisp。 README.W32文件包含有关获取未来发行版,设置Emacs等的信息。 (README文件还包括Windows 95/98 / ME和2000上GNU Emacs的FAQ的URL。)尽管不是必需的,但我建议您在bin子目录中运行addpm.exe文件来注册 Emacs,因此可从“开始”菜单访问它。 安装完成后,选择Start-> Gnu Emacs-> Emacs 。 如果您选择不注册Emacs,请通过双击d:\ Emacs \ bin目录中安装的runemacs.exe文件来启动它。

您可以通过启动Emacs并选择Help-> Emacs Tutorial来学习本教程 。 对于许多功能必须使用控制键序列的事实,不要气get。 您可以先学习一些常用的控制键序列,然后在需要时学习新的序列。 此外,在Emacs的GUI版本中,可以从菜单访问许多功能。 请参阅相关主题关于Emacs和PSGML其它教程的的建议。

自定义Emacs
下一步是根据需要开始自定义Emacs,例如:

  • 设置变量以控制各种行为
  • 添加包裹
  • 编写自己的Emacs Lisp代码

首先,我将介绍如何设置变量和添加包。

第一步是访问Emacs初始化文件。 Emacs在您的主目录中查找此文件。 在UNIX环境中,初始化文件通常名为.emacs,并且(默认情况下)位于您的主目录中。

在Windows上,我使用名为_emacs的文件,因为Windows通常不喜欢以句点开头的文件名。 在Windows上,您可以通过设置环境变量或设置注册表项来指定主目录。 作为最后的选择,Emacs在目录c:\中查找初始化文件。 (因此,现在,可以在c:\中创建此文件,或者参考Windows的GNU Emacs常见问题解答(请参阅参考资料 )以获取其他选项。)

要测试Emacs是否正在找到您的初始化文件,请使用您喜欢的文本编辑器添加清单1中的条目,该条目将打开Emacs状态栏中的时钟。 打开时钟并启动Emacs之后,请在状态区域中查找时间(在当前文件的名称之后)。 如果您看到时钟,一切都很好。

清单1.测试Emacs初始化文件
; Display the time in the Emacs status area (an easy way to test
; that we are picking up our Emacs customizations).
(display-time)

现在,您已经安装了Emacs,并为自定义它奠定了基础,我们将研究如何添加软件包,这些软件包为编辑和验证SGML和XML文档提供了环境。

为SGML和XML模式添加PSGML

GNU Emacs的当前发行版包括HTML和SGML的主要编辑模式。 通常,这些提供的功能仅限于协助元素/属性输入和元素之间的导航。 HTML支持基于HTML的早期版本。

在SGML开始在文档发布中流行的时候,Lennart Staflin创建了PSGML,这是一个用于向Emacs添加SGML主要编辑模式的软件包。 由于HTML和XML是SGML的子集,因此您也可以使用PSGML进行编辑。 实际上,最新的PSGML版本提供了XML编辑模式。

PSGML还包括DTD感知的内置SGML解析器。 如果您有自己的SGML或XML方言,则只需安装DTD。 通过安装新的DTD(或一组DTD)来处理HTML标准的更改。 PSGML提供了上下文相关的编辑,因此您可以根据您在文档中的位置添加元素或属性。 导航功能使您可以在元素之间移动,甚至可以移动到下一个故障点来查找与DTD不符的标记。 格式化功能可基于嵌套使元素缩进,或隐藏元素内容,以便您可以将视图限制为特定区域。 最后,您可以使用外部验证解析器来验证文档,本文稍后将对此进行讨论。

图1.安装了PSGML的Emacs(编辑DITA FAQ)
Emacs与PSGML

图1显示了PSGML添加到Emacs的一些结构化编辑功能,包括:

  • 彩色标记语法。
  • 根据嵌套级别缩进标记。
  • 元素折叠。 请注意如何将<prolog>和前两个<section>元素折叠到一行,以使其摆脱干扰,同时您可以在展开的Tips and Techniques <section>元素中看到子元素。
  • 使用外部解析器进行验证。 验证结果显示在文档缓冲区下方的缓冲区中。 在这种情况下,我使用OpenSP来验证文档。 如果验证导致错误,则可以使用Emacs next-error命令( [Ctrl]-x ` )在源中定位错误。

除了图1中可见的功能之外,PSGML还添加了许多功能,您可以通过下拉菜单,弹出菜单或控制键序列或命令来访问这些功能。

获取和安装PSGML

您需要下载最新版本的PSGML。 可从Source Forge获得最新的1.2.2版本(请参阅参考资料 )。 与Emacs一样,PSGML是作为.gz文件下载的; 使用可识别.gz的实用程序(例如WinZip)将其解压缩。 我将PSGML发行包解压缩到Emacs安装的site-lisp目录中。 同样,请记住指定要在解压缩时保留目录信息。 在我的安装中,我有d:\ Emacs \ site-lisp \ psgml-1.2.2。

解压缩后,请查阅README.psgml以获取一些基本信息,包括如何在UNIX版本的Emacs中安装它。

在Windows版Emacs中安装PSGML
要准备在Windows版本的Emacs中安装PSGML,请首先为其创建目录(我的站点为site-lisp),然后将.gz文件解压缩到其中,并保留目录信息。

接下来,您需要确保Emacs可以找到组成PSGML的文件。 您可以通过将清单2的内容添加到Emacs初始化文件_emacs文件中来实现。

清单2.将PSGML添加到Emacs初始化文件
;;; Set up PSGML
; Add PSGML to load-path so Emacs can find it.
; Note the forward slashes in the path... this is platform-independent so I 
; would suggest using them over back slashes. If you use back slashes, they 
; MUST BE doubled, as Emacs treats backslash as an escape character. 
(setq load-path (append (list nil "d:/Emacs/site-lisp/psgml-1.2.2") load-path))

; Use PSGML for sgml and xml major modes.
(autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t)
(autoload 'xml-mode "psgml" "Major mode to edit XML files." t)

现在,Emacs应该可以访问PSGML文件,并且只要您调用sgml-mode或xml-mode,它将使用PSGML。 稍后,我将展示如何根据正在编辑的文件的文件扩展名自动调用这些模式。

编译PSGML文件

无论您使用的是Linux还是Windows,都需要完成另一件事:编译PSGML文件。 在psgml目录中查找,找到一堆.el文件类型。 这些是Emacs Lisp文件。 如果编译它们,则PSGML支持运行得更快。 这是完成此操作的一种简单方法:

  1. 启动Emacs。
  2. 输入[Alt]-x
  3. 当提示您输入命令时,输入byte-force-recompile [Enter]
  4. 当提示您输入目录名称时,请更改PSGML文件的路径,例如d:/Emacs/site-list/psgml-1.2.2,然后按[Enter]。

应该编译大多数.el文件,并将结果显示在“ * Compile-log *”缓冲区中。 (在编译时,我收到了一些有关过时变量的警告,但我认为它们无害,因此可以忽略。)最终结果应该是psgml目录中大多数.el文件的.elc文件(不是所有文件将被编译,因此不要担心是否丢失)。

添加DTD

如果不使用DTD来描述您需要创建的文档类型,那么SGML和XML模式就没什么用。 因此,这里介绍了如何添加一些DTD和适当的配置以使其在PSGML中有用。

让我们从XHTML 1.0,这是HTML 4.01(见的XML化版本开始相关主题的XHTML的更多信息)。 XHTML DTD使您可以创建符合XML标准并且可以使用解析器进行验证HTML(稍后将对此进行详细介绍),从而提供更健壮和易于管理的文档。 (请参阅相关的主题为包含XHTML 1.0 DTD和目录文件我在本节讨论一个zip文件)。

以下是下载XHTML DTD和相关实体的方法:

  1. 为XHTML DTD创建一个子目录。 我将所有DTD保留在系统上的一个位置; 假设它们将驻留在与Emacs相同级别的DTDs文件夹下:d:\ DTDs。 在此处,为XHTML DTD创建一个文件夹d:\ DTDs \ xhtml1。
  2. 创建一个文件夹来保存它们之后,只需转到W3C的DTD站点(请参阅参考资料 )即可获得XHTML DTD。 有三种文档类型(严格,过渡和框架集)。
  3. 对于这三种文档类型中的每一种,在链接上单击鼠标按钮2,然后将目标另存为文件。 (您可能需要删除浏览器在保存文件时添加的额外.txt扩展名)。
  4. 将三个实体集(xhtml-lat1.ent,xhtml-special.ent和xhtml-symbol.ent)保存到与DTD相同的子目录中。

接下来,您需要创建SGML目录文件,PSGML可以使用该文件来查找这些DTD。

在与DTD相同的目录中,创建一个名为xhtml1.soc的文件。 内容应类似于清单3。

清单3. xhtml1.soc-XHTML的SGML目录文件
VERRIDE        YES

PUBLIC  "-//W3C//DTD XHTML 1.0 Strict//EN"        "xhtml1-strict.dtd"
PUBLIC  "-//W3C//DTD XHTML 1.0 Transitional//EN"  "xhtml1-transitional.dtd"
PUBLIC  "-//W3C//DTD XHTML 1.0 Frameset//EN"      "xhtml1-frameset.dtd"
-- added DTDDECLs for use with onsgmls --
DTDDECL  "-//W3C//DTD XHTML 1.0 Strict//EN"        "xhtml1.dcl"
DTDDECL  "-//W3C//DTD XHTML 1.0 Transitional//EN"  "xhtml1.dcl"
DTDDECL  "-//W3C//DTD XHTML 1.0 Frameset//EN"      "xhtml1.dcl"

PUBLIC  "-//W3C//ENTITIES Latin 1 for XHTML//EN"  "xhtml-lat1.ent"
PUBLIC  "-//W3C//ENTITIES Symbols for XHTML//EN" "xhtml-symbol.ent"
PUBLIC  "-//W3C//ENTITIES Special for XHTML//EN" "xhtml-special.ent"

DOCTYPE html "xhtml1-transitional.dtd"

请参阅相关主题关于SGML开放目录的背景。 对于本文,我将仅解释清单3中使用的特定功能。PUBLIC条目将所谓的正式公共标识符映射到文件系统实体,在这种情况下,文件系统实体是包含各种DTD的文件。 这将使我们能够引用这些DTD,而不必实际知道它们在文件系统中的位置。 他们要求您的文档具有<!DOCTYPE xxxxxx PUBLIC "yyyyy">文档类型声明,其中的“ xxxxx”与目录文件中的条目之一匹配。 PSGML实际不使用DTDDECL条目,但SGML解析器将使用它们(敬请期待!),它们指示应将具有相同正式公共标识符的DTML使用什么SGML声明。

最后,DOCTYPE条目使我们无需使用正式的公共标识符或实际文件名即可引用特定的DTD。 不利的一面是,对于XHTML,有多个DTD定义了相同的文档类型html ,因此您必须选择一个。 我只会选择您最希望使用的一种。 在清单3中,我选择了过渡DTD。 请记住,只要包含完整的!DOCTYPE声明,就可以使用任何XHTML文档类型。

您还需要进行另一项配置。 PSGML需要知道在哪里可以找到SGML目录文件。 如PSGML文档中所述,有两种方法可以实现此目的。 我使用的方法利用了环境变量SGML_CATALOG_FILES,因为SGML解析器也使用它(耐心,我将在本文的下一部分中介绍它)。 因此,现在您有了一组DTD和一个目录文件,请创建上述环境变量并将其设置为包括xhtml1.soc文件的路径,例如d:\ DTDs \ xhtml1 \ xhtml1.soc。 如果目录文件不止一个,则可以全部包含它们,并用路径定界符(在Windows中为“;”,在基于UNIX的系统中为“:”)分隔它们。

我将向您展示如何添加另外一组DTD:

  1. 如有必要,为新DTD创建一个子目录,例如d:\ DTDs \ dita。
  2. 下载完成后,使用您喜欢的实用程序将发行版解压缩到d:\ DTDs \ dita,再次保留目录信息。
  3. 将随附的目录文件添加到SGML_CATALOG_FILES环境变量中,因此您现在可能具有d:\ DTDs \ xhtml1 \ xhtml1.soc; d:\ DTDs \ dita \ dtd \ dita.soc。
清单4. dita.soc-DITA DTD的SGML目录文件
OVERRIDE        YES

-- For documents that don't include a DOCTYPE declaration --
DOCTYPE topic "topic.dtd"
--DOCTYPE topic "ditabase.dtd"--
DOCTYPE task "task.dtd"
DOCTYPE reftopic "reftopic.dtd"
DOCTYPE concept "concept.dtd"
DOCTYPE APIdesc "APIdesc.dtd"
DOCTYPE bctask "bctask.dtd"

-- There should probably be an entry here referencing the standard --
-- XML SGML declaration for example SGMLDECL or DTDDECL  --
-- (once we have public identifiers for the DTDs) --

如您所见,一旦开始设置,添加新的DTD相对容易。

使用PSGML编辑文件

现在,您已经安装了带有PSGML的Emacs,并且具有一组DTD可以使用,您可以开始使用PSGML编辑文档。 每当您编辑扩展名为.sgml或.xml的文档时,您都会注意到Emacs会调用SGML主模式(在状态区域中指示),并且菜单会更改为如图2所示的样子。

图2.带有SGML编辑模式的Emacs菜单
Emacs菜单

到目前为止,如果您编辑.html文档,则将调用旧HTML major模式。 稍后,我将向您展示如何解决该问题。 同时,您可以调用[Alt]-x并在xml-mode中键入以强制XML模式。

要尝试使用PSGML,请编辑一个名为test.html的测试文件,并插入开始和结束html标签:

<html>
</html>

通过调用[Alt]-x并键入xml-mode来打开XML 模式 。 接下来,单击菜单项DTD-> Info-> General DTD Info。 这使PSGML解析DTD并在文档下方的缓冲区中显示常规信息。 如果测试不成功,请检查目录文件或环境变量中是否有错误。 此外,此测试还假设您在一个SGML目录文件中具有DOCTYPE html条目,以便PSGML知道与“ html”的doctype相关联的DTD。 或者,您可以包括doctype声明,例如<!DOCTYPE html PUBLIC ...> ,其中PUBLIC标识符与您的SGML目录文件之一中的条目匹配。 如果正确设置了目录和环境变量,则应看到类似以下内容的内容:

Doctype: html
      Element types: 89
           Entities: 253
 Parameter entities: 63
         Files used: d:/DTDs/xhtml1/xhtml-special.ent
                     d:/DTDs/xhtml1/xhtml-symbol.ent
                     d:/DTDs/xhtml1/xhtml-lat1.ent
                     d:/DTDs/xhtml1/xhtml1-transitional.dtd

输出表明PSGML能够找到DTD并对其进行解析,包括所有引用的实体模块。

现在,PSGML知道您的DTD了,您可以开始使用PSGML的一些更强大的功能。 例如,将光标放在<html>标记之后,然后选择菜单项“ 标记”->“插入元素”。 系统将为您提供在文档中该位置有效的元素列表。 但是在进入更多的编辑功能之前,让我们做一些更多的自定义操作,以充分利用PSGML。

更多定制

现在您可以使用PSGML编辑文档,让我们探索更多的自定义项,这些自定义项将利用PSGML的更多功能并使其更易于使用。 清单5显示了更多可以自定义到您现有Emacs初始化文件的自定义项。

清单5. _emacs; PSGML的更多自定义项
;;; Set up file-extension/mode associations.   
; Note that I use xml-mode for html... that's because i'm writing 
; XHTML and I want my html to conform to XML.
(setq auto-mode-alist 
      (append '(
                ("\\.sgml" . sgml-mode)
                ("\\.idd" . sgml-mode)
                ("\\.ide" . sgml-mode)
                ("\\.htm" . xml-mode)
                ("\\.html" . xml-mode)
                ("\\.xml" . xml-mode)
                ("\\.xsl" . xml-mode)
                ("\\.fo" . xml-mode)
                )
              auto-mode-alist
              )
      )

;;; Set up and enable syntax coloring. 
; Create faces  to assign markup categories.
(make-face 'sgml-doctype-face)
(make-face 'sgml-pi-face)
(make-face 'sgml-comment-face)
(make-face 'sgml-sgml-face)
(make-face 'sgml-start-tag-face)
(make-face 'sgml-end-tag-face)
(make-face 'sgml-entity-face)

; Assign attributes to faces. Background of white assumed.

(set-face-foreground 'sgml-doctype-face "blue1")
(set-face-foreground 'sgml-sgml-face "cyan1")
(set-face-foreground 'sgml-pi-face "magenta")
(set-face-foreground 'sgml-comment-face "purple")
(set-face-foreground 'sgml-start-tag-face "Red")
(set-face-foreground 'sgml-end-tag-face "Red")
(set-face-foreground 'sgml-entity-face "Blue")

; Assign faces to markup categories.
(setq sgml-markup-faces
      '((doctype        . sgml-doctype-face)
        (pi             . sgml-pi-face)
        (comment        . sgml-comment-face)
        (sgml   . sgml-sgml-face)
        (comment        . sgml-comment-face)
        (start-tag      . sgml-start-tag-face)
        (end-tag        . sgml-end-tag-face)
        (entity . sgml-entity-face)))


; PSGML - enable face settings
(setq sgml-set-face t)

; Auto-activate parsing the DTD when a document is loaded.
; If this isn't enabled, syntax coloring won't take affect until
; you manually invoke "DTD->Parse DTD"
(setq sgml-auto-activate-dtd t)

;;; Set up my "DTD->Insert DTD" menu.

(setq sgml-custom-dtd '
      (
       ( "DITA concept"
         "<?xml version=\"1.0\"?>\n<!DOCTYPE concept SYSTEM \"concept.dtd\">" )
       ( "DITA task"
         "<?xml version=\"1.0\"?>\n<!DOCTYPE task SYSTEM \"task.dtd\">" )
       ( "DITA reftopic"
         "<?xml version=\"1.0\"?>\n<!DOCTYPE reftopic SYSTEM \"reftopic.dtd\">" )
       ( "DITA APIdesc"
         "<?xml version=\"1.0\"?>\n<!DOCTYPE APIdesc SYSTEM \"apidesc.dtd\">" )
       ( "DITA topic"
         "<?xml version=\"1.0\"?>\n<!DOCTYPE topic SYSTEM \"ditabase.dtd\">" )
       ( "HOD Script"
         "<?xml version=\"1.0\"?>\n<!DOCTYPE HASCRIPT SYSTEM \"HAScript.dtd\">" )
       ( "XHTML 1.0 Strict"
         "<?xml version=\"1.0\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 

Strict//EN\" \"xhtml1-strict.dtd\">" )
       ( "XHTML 1.0 Transitional"
         "<?xml version=\"1.0\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 

Transitional//EN\" \"xhtml1-transitional.dtd\">" )
       ( "XHTML 1.0 Frameset"
         "<?xml version=\"1.0\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 

Frameset//EN\" \"xhtml1-frameset.dtd\">" )
; I use XHTML now!
;       ( "HTML 4.01 Transitional"
;        "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">" )
;       ( "HTML 4.01 Strict"
;        "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">" )
;       ( "HTML 4.01 Frameset"
;        "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">" )
; An example of IBMIDDoc SGML DTD
;       ( "IBMIDDoc"
;        "<!DOCTYPE ibmiddoc PUBLIC \"+//ISBN 0-933186::IBM//DTD IBMIDDoc//EN\" [\n]>")
; An example of DOCBOOK XML DTD.
;       ( "DOCBOOK XML 4.1.2"
;        "<?xml version=\"1.0\"?>\n<!DOCTYPE book PUBLIC \"-//OASIS//DTD DocBook XML 

V4.1.2//EN\" \"http://www.oasis-open.org/docbook/xml/4.0/docbookx.dtd\" [\n]>")
       )
)

; From Lennart Staflin - re-enabling launch of browser (from original HTML mode)
(defun my-psgml-hook ()
  (local-set-key "\C-c\C-b" 'browse-url-of-buffer)
  )

(add-hook 'sgml-mode-hook 'my-psgml-hook)

清单5的第一部分告诉Emacs在加载具有特定扩展名的文件时调用哪种主要模式,类似于Windows根据文件类型关联应用程序的方式。 请注意,我已经将.htm和.html文件设置为使用xml-mode。 这是因为我实际上是在编写XHTML。

清单5的接下来的四个部分提供了基于语法的突出显示,这将导致不同的标记构造在编辑器中以不同的颜色显示。 默认情况下,PSGML仅定义标记以粗体显示和注释以斜体显示。 在这里,我将开始和结束标签设置为蓝色,将注释设置为紫色,将实体引用设置为蓝色,将PI设置为品红色,等等。 除了我修改过的结构之外,您还可以定义忽略的标记节的外观,标记节的开始和结束以及简短引用。 四个部分的目的是:

  • 定义脸
  • 设置脸部特征
  • 将面部与特定的标记类型相关联
  • 激活设置

清单5的下一部分sgml-auto-activate-dtd使得与文档关联的DTD在加载文档后立即被解析。 由于需要进行处理,默认情况下将其设置为false。 由于处理器的速度如此之快,因此不必担心。 另外,如果不设置为true,最初装入文档时,语法着色不会生效,直到你明确地解析DTD,即使用DTD->解析DTD菜单项或[Ctrl]键-c [Ctrl键] -p键序列。

下一节将修改DTD-> Insert DTD菜单项,以使您可以快速为新文档插入DOCTYPE声明。 我提供了多种文档类型,包括SGML和XML文档类型(有些已被注释掉)。 注意XML文档类型如何包括XML声明。 每当添加新的DTD时,您可能都希望更新sgml-custom-dtd变量,以将新的DTD添加到“ 插入DTD”菜单中。

最后一部分定义了my-psgml-hook,并将其挂接到SGML模式。 这使您可以针对正在编辑的当前文件启动默认浏览器。 这在编辑时方便查看HTML和XHTML。 当浏览器更完全支持XML和XSLT时,它将更加方便。

快速PSGML测试驱动

现在您已经有了一些自定义项,让我们快速测试一下以了解一些PSGML编辑功能。

  1. 启动Emacs并打开一个名为test.html的文件([Ctrl] -x [Ctrl] -f)。 这应该使Emacs进入XML模式,您可以通过查看状态行来进行验证。
  2. 从菜单中,选择DTD->插入DTD-> XHTML 1.0 Transitional。 这应该为默认名称为“ html”的文档插入XML声明和<!DOCTYPE html...>声明。 还要注意这两个条目的语法颜色。
  3. 接下来,将光标置于DOCTYPE声明之后,然后从菜单中选择“ 标记”->“插入元素” (或按Shift键和鼠标按钮2)。 您应该看到一个弹出菜单,其中列出了在文档中此时有效的元素列表,在本例中为html元素。 请注意,当您插入HTML元素时,还将插入其必需的元素headbody 。 此外,还会出现一条注释,提示您必须插入titlebase元素。 除非您习惯了特定的标记语言,否则此功能非常方便,此后它会变得烦人多于帮助。 您可以通过在Emacs初始化文件中将sgml-insert-missing-element-comment变量设置为false来禁用提示。
  4. 您可以使用相同的技术来添加或修改属性:将光标置于开始标签内,然后从菜单标记->插入属性中进行选择 (或按[Shift] mouse-button-2)。 出现一个弹出菜单,其中提供了所选元素的有效属性。 从弹出菜单中选择一个属性。
  5. 注意如何基于元素嵌套缩进结构。 如果将H1插入体内,则不会缩进。 这是因为默认设置不会缩进混合的内容元素(可能同时包含标记和文本的元素,或者以SGML / DTD的说法包含PCDATA )。 您可以通过在Emacs初始化文件中将sgml-indent-data设置为true来更改缩进假设。 在此之前,请考虑空格在XML应用程序中是否会很重要(请参阅参考资料 )。
  6. 如果您已经安装了外部验证器,请尝试验证文档:选择SGML-> Validate ,然后按Enter(可能会提示您保存文件),或按[Ctrl] -c [Ctrl] -v,然后按Enter。
    注意:如果验证不起作用,请安装外部验证器(如我在下一节中说明的操作),然后测试该功能。 如果验证有效,您应该收到一条错误消息,指出“头部”未完成。 如果按Ctrl-x`(请注意背景符号),您将被带到发生错误的源中的行号。 继续并插入标题元素。

使用SP或OpenSP进行SGML和XML验证

尽管PSGML包含SGML解析器,但它不是功能齐全的解析器。 但是,它确实提供了使用外部解析器来验证SGML和XML文档的能力。 这使您可以完全验证源并查找例如IDREF缺少与目标ID匹配的目标元素的元素。

当您从菜单或键盘上调用SGML-> Validate (Ctrl-c Ctrl-v)时,PSGML将封装一个进程以针对您当前正在编辑的文件调用SGML解析器。 它将验证结果显示在当前正在编辑的文件下方的缓冲区中。 如果遇到错误,请使用Emacs [Ctrl]-x ` (请注意背景符号),让Emacs将您带到源文档中错误的位置。

默认情况下,它被配置为调用nsgmls(SP的一部分),SP是最初由James Clark编写的SGML解析器。 SP不再受支持,而是OpenSP的基础,OpenSP现在作为OpenJade项目的一部分在SourceForge.net上维护。 (请参阅相关主题对SP和OpenSP的更多信息。)您也可以下载并使用SP或OpenSP的。 我之所以选择OpenSP,是因为它受到积极支持,并且包含对SGML目录的DTDDECL关键字的支持,而SP不支持(从OpenSP的1.4版本开始支持DTDDECL)。 如果仅处理XML,则只需要为XML定义一个SGML声明。 但是,如果您还将使用SGML,则您正在使用的DTD可能会引用其自己的声明。 由于PSGML允许您通过sgml-declaration (或XML模式的sgml-xml-declaration )仅指定要使用的一个特定SGML声明,因此DTDDECL目录功能会派上用场。 最后一个考虑因素是我无法找到Windows平台的OpenSP的二进制文件。 由于SourceForge.net仅维护源代码,因此您将需要自己构建二进制文件或通过比我更努力地搜索找到它们。

使用SP

如果您更喜欢使用SP,那么您真正需要做的就是下载SP(请参阅参考资料 ),解压缩它并更新两个环境变量。 您将需要附加PATH,以便在PSGML调用时可以找到nsgmls。 假设您将分发包解压缩到路径d:\ SP,则需要将d:\ SP \ bin添加到PATH。 另外,您将需要在SGML_CATALOG_FILES中添加一个条目,以便可以找到XML的SGML声明。 如果在验证XML时未选择正确的SGML声明,则可能会收到很多错误消息。 这是因为XML不支持SGML的OMITTAG功能,该功能要求DTD指定最小化信息(XML DTD不包含此信息,因为需要所有标签)。 同样,假设您在d:\ SP中安装了SP,则XML的SGML声明将在d:\ SP \ pubtext \ xml.soc引用的d:\ SP \ pubtext \ xml.dcl中(请参阅SGMLDECL条目) 。 因此,只需将d:\ SP \ pubtext \ xml.soc添加到SGML_CATALOG_FILES以便nsgmls可以找到此目录。 另外,您可以在Emacs初始化文件中设置Emacs / PSGML变量sgml-xml-declaration指向该文件,如清单6所示。

清单6. _emacs-启用SP进行验证
; Note the forward slashes in the path!!!! 
(setq sgml-xml-declaration "d:/SP/pubtext/xml.dcl")

使用OpenSP

如果您想使用OpenSP,则需要对PSGML进行一些小的修改,但是,所有这些操作都可以使用Emacs初始化文件来完成。

假设您已经构建并安装了OpenSP或找到了预构建的二进制发行版,那么您再次要做的第一件事就是更新PATH,以便可以找到可执行文件。 假设OpenSP安装在d:\ OpenSP中,则需要将d:\ OpenSP \ bin添加到PATH中。 请注意,您可以同时安装和访问SP和OpenSP,因为OpenSP中的可执行文件已被重命名。

接下来需要做的是更新Emacs配置,以更改用于验证的命令。 通常,这可以通过设置Emacs变量sgml-validate-command ,实际上,我们将设置此变量以处理使用OpenSp的onsgmls可执行文件以sgml-mode进行验证的情况。 但是,对于xml模式,这似乎无法正常工作:当我在Emacs初始化文件中设置此变量时,sgml-mode会接收更改,而xml-mode不会。 您可以通过提供模式钩子来解决此问题。 目标是覆盖默认的validate命令,该命令定义为nsgmls -wxml -s %s %s ,并将其设置为onsgmls -wxml -s %s %s 。 清单7中的Emacs初始化代码片段处理了这两个任务。

清单7. _emacs-启用OpenSP进行验证
; override default validate command to utilize OpenSP's onsgmls executable
(setq sgml-validate-command "onsgmls -s %s %s")

; override default xml-mode validate command to utilize OpenSP's onsgmls
; executable by using a mode-hook, since there appears to be no other means 
; to accomplish it.
(defun my-psgml-xml-hook ()
  (setq sgml-validate-command "onsgmls -s %s %s")
  (setq sgml-declaration "d:\OpenSP\pubtext\xml.dcl")
)
(add-hook 'xml-mode-hook 'my-psgml-xml-hook)

您真的不需要了解使PSGML与OpenSP配合使用的情况。 但是,如果您感兴趣,则模式挂钩基本上定义了一个Emacs函数,该函数将在模式初始化后调用。 这使您有机会覆盖由该模式建立的功能和设置。 在这种情况下,由于validate命令是硬连接在PSGML代码中的,因此您可以使用模式钩子覆盖该设置,而不必修改PSGML代码并重新编译(每次安装新版本时都需要这样做) PSGML)。

建议和提示

熟悉了我描述的基本功能后,请尝试浏览PSGML添加到Emacs菜单栏中的每个菜单:

  • 在SGML菜单上,尝试使用“ 文件选项”和“ 用户选项”可以使您很好地了解可以在PSGML中进行自定义的内容。 有关特定设置的更多信息,您可以参考在线文档或查阅PSGML随附的“使用Emacs和PSGML编辑SGML”文档。 您通过此菜单所做的更改仅在特定的编辑会话中保留。 如果您希望进行永久更改,则必须更新Emacs初始化文件。
  • 修改”菜单主要提供用于更改现有标记的功能。 其中一些功能(例如Normalize)可能会在尝试清理HTML并将其制成XHTML时派上用场。
  • 移动”菜单下的功能基本上可以更快地导航文档的结构。
  • 标记菜单提供菜单访问权限,用于插入元素,标签,属性,实体等。 我仅指出两点可能并不明显。 标记区域允许您使用PSGML的内部解析器确定哪些元素对于突出显示的位置有效,从而将现有文本包装在元素内。 插入实体允许您插入DTD中定义的常规文本实体。 如果在文档的开头在内部子集中定义了新的文本实体,则需要重新解析DTD以在编辑会话期间拾取新定义的实体。
  • 视图下的项目不言自明。
  • DTD菜单下的大多数项目均已覆盖。 但是,“ 信息”项值得一提,因为如果您不熟悉DTD,它们对于探索DTD很有用。

翻译自: https://www.ibm.com/developerworks/xml/library/x-emacs/index.html

emacs .emacs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值