Выбрать главу

8.4.4 Using psgml Mode

Lennart Stafflin's psgml mode has been around for a while. It is more robust than Emacs's own SGML mode, but, like any add-on, you have to install it in order to use it. Either install TEI Emacs as described earlier or download psgml mode from http://www.lysator.liu.se/projects/about_psgml.html and follow the installation instructions there. TEI Emacs includes a functioning psgml mode, so if you've installed TEI Emacs, your setup work is done.

psgml mode consists of two parts: sgml-mode for writing SGML and xml-mode for writing XML (and in our case XHTML).

To start psgml mode to edit our XHTML file, type M-x xml-mode.

XML appears on the mode line and an *SGML LOG* window opens. If you are using TEI Emacs, XSLT appears on the mode line along with XML.

The *SGML LOG* window displays messages about this session. (If it doesn't appear immediately, click on the first character in the file.) The log buffer complains that it could not find an external entity called html. This file has been changed to work with the XHTML RELAX NG schema. psgml mode expects it to conform to an XHTML DTD. To get started with the (minimal) work needed to undertake the transformation from a schema-based file to a DTD-based file, we ask psgml to normalize the buffer.

Type: M-x sgml-normalize or select Normalize from the Modify menu

psgml mode eliminates the namespace declaration in the <html> tag.

More needs to be done, however. The first statements in an XHTML file include an XML statement and a DOCTYPE entry that identifies the DTD this document should be validated against. One of the nice things about TEI Emacs is that it includes a variety of DTDs. (Users of standard psgml mode don't have this feature; sorry.[52])

At the beginning of the file, select DTD → Insert DTD → XHTML Transitional.

Emacs inserts the two required elements for us.

That's all it takes to make this file a well-formed XHTML file. psgml mode allows for validation against the DTD. Let's validate it using C-c C-v to make sure it's okay.

Type: C-c C-v

psgml mode inserts the default validate command in the minibuffer; press Enter to run it.

Press Enter and type y to save the buffer when prompted

The *compilation* buffer indicates (somewhat cryptically) that the document is valid.

Of course, typical documents are far more complex than this one. Options on the View menu provide selective hiding and showing of elements, including an option to hide all tags, allowing you to focus on the content of the file instead.

psgml mode also offers numerous options. If you are running TEI Emacs, you'll find the File Options and User Options submenus on the XML/SGML menu. If you've installed psgml mode standalone, you'll find them on the SGML menu. Table 8-8 summarizes some of the psgml commands.

Table 8-8. Bindings in psgml mode

Keystrokes Command name Action
C-M-Space sgml-mark-element Mark the current element.
M-Tab sgml-complete Complete the current tag.
C-M-t sgml-transpose-element Transpose two elements.
C-M-h sgml-mark-current-element Mark the current element.
C-M-k ModifyKill Element sgml-kill-element Delete the current element (and any child elements).
C-M-u MoveBackward Up Element sgml-backward-up-element Move up to the parent element for this element.
C-M-d MoveDown Element sgml-down-element Move down to the next child element.
C-M-b MoveBackward Element sgml-backward-element Move to the previous element.
C-M-f MoveForward Element sgml-forward-element Move to the next element.
C-M-e MoveEnd of Element sgml-end-of-element Move to the end of the current element.
C-M-a MoveBeginning of Element sgml-beginning-of-element Move to the beginning of the current element.
C-c C-w SGMLWhat Element sgml-what-element Similar to sgml-position but describes hierarchy in terms of tags versus content (for example, start-tag in title in head in html).
C-c C-v SGMLValidate sgml-validate Insert validation command in the minibuffer so you can modify it if necessary before pressing Enter to execute it.
C-c C-t SGMLList Valid Tags sgml-list-valid-tags List tags that are valid in the current context.
C-c C-q ModifyFill Element sgml-fill-element Fill element according to the mode's indentation rules.
C-c C-o MoveNext Trouble Spot sgml-next-trouble-spot Find the next problem spot and display the problem in the minibuffer.
C-c C-n MoveUp Element sgml-up-element Move to the parent element.
C-c Enter sgml-split-element Split current element.
C-c C-l SGMLShow/Hide Warning Log sgml-show-or-clear-log Display or delete the SGML LOG buffer (menu option name is misleading).
C-c C-k ModifyKill Markup sgml-kill-markup Delete current tag.
C-c / MarkupEnd Current Element sgml-insert-end-tag Insert closing tag for current tag.
C-c - ModifyUntag Element sgml-untag-element Delete the current tag pair.
C-c # ModifyMake Character Reference sgml-make-character-reference Change character under the cursor to the equivalent entity.
C-c C-f C-e ViewFold Element sgml-fold-element Hide the current element and its children if any.
C-c C-u C-e ViewUnfold Element sgml-unfold-element Show the current element and its children if any.
C-c C-f C-s ViewFold Subelement sgml-fold-subelement Hide subelements.
C-c C-f C-r ViewFold Region sgml-fold-region Hide the region.
C-c C-u C-a ViewUnfold All sgml-unfold-all Show all hidden tags and text.
вернуться

52

A straightforward introduction to setting up a complete environment for psgml mode can be found at http://openacs.org/doc/openacs-5-0-0/psgml-mode.html.