Appendix A. Emacs PSGML mode tips

Several XML editors exist. A very flexible and free one is emacs with its psgml mode, which, amongst other things, offers emacs-style completion on tags. Also, it lets you check your file (if it can read the DTD), shows which elements are possible at a given pountin the source file, etc.

The emacs editor is one of the most often used editors on Unix (and today is also popular on Microsoft Windows). It is highly customizable via Lisp code and can easily cope with the syntax of various languages. Lennart Staflin developed the basic SGML/XML support in the form of an emacs ``macro mode'' psgml. For editing DTDs Tony Graham contributed his emacs macros tdtd.

All these modes present you with menus and commands for inserting tags, thus helping you to enter only contextually valid tags and allowing you to edit attribute values in a separate window with information about types and defaults. They also identify structural errors.

Figure A.1. Emacs and its psgml mode with the DocBook DTD

A small DocBook example in Emacs with its 
psgml mode showing which elements are available at a given point.

Figure A.1 shows an example of a small DocBook file where together with James Clark's nsgmls SGML/XML parser and emacs's psgml mode one can verify at each point in the document which element, attritute, etc. is allowed. Moreover, colours are used to distinguish the different XML language components, making editing significantly easier.

If you type "C-c C-e" (or go into the Markup window, and choose the Insert Element entry) emacs will prompt you for an element, and offer as completions all elements valid at that point.

Once it inserts the element, it inserts it with any required following elements along with a comment saying which ones you could put later on.

As an example, if you type the following into the a DocBook emacs:

C-c C-e variab<SPACE BAR><RETURN>

a variablelist and its expansion is inserted into the text buffer, as follows:

    <variablelist>
      <varlistentry>
        <term></term>
        <listitem>
          <!-- one of (epigraph authorblurb abstract highlights
          comment bridgehead anchor sidebar procedure msgset table
          figure example equation informaltable informalexample
          informalequation graphicco graphic blockquote address
          simpara para formalpara funcsynopsis cmdsynopsis synopsis
          screenshot screenco screen programlistingco programlisting
          literallayout warning tip note important caution
          variablelist simplelist segmentedlist orderedlist
          itemizedlist glosslist calloutlist) -->
        </listitem>
      </varlistentry>
    </variablelist>

As another example, when we type:

C-c C-e i<SPACE BAR>

we get the following completions:


Click mouse-2 on a completion to select it.
In this buffer, type RET to select the completion near point.

Possible completions are:
important                          indexterm
informalequation                   informalexample
informaltable                      itemizedlist

The current element is closed by typing "C-c /".