Install PSGML

  1. Unpack the PSGML archive

    Extract the PSGML archive to your common Emacs site-lisp directory, e.g. C:\Programs\emacsen\site-lisp. Be sure to keep the directory information and long filenames. This will create the subdirectory \psgml-1.2.4

  2. Use onsgmls as an external validator

    The following code snippet lets PSGML use onsgmls from the OpenJade distribution (which we will install later) to validate SGML or XML files . Append this to your _emacs file:

      (setq sgml-validate-command "/usr/local/bin/onsgmls -s %s %s")
    
  3. Byte-compile the PSGML files

    To byte-compile all .el files in the psgml-1.2.4 subdirectory, run the command (the "0" is a zero) Ctrl-u 0 Alt-x byte-recompile-directory [Return] psgml-path, where psgml-path is the path to your psgml-directory, e.g. C:/Programs/emacsen/site-lisp/psgml-1.2.4.

    Note: If you get error messages like "cannot load file xyz" at this point, make sure that your Emacs load-path contains the PSGML directory. We already included this directory into the load-path when we installed Emacs.

  4. Enable syntax coloring

    Edit _emacs to enable syntax coloring. Copy the following lines to your _emacs file (syntax coloring code adapted from David Megginson):

         
          ;; Turn on syntax coloring
          (cond ((fboundp 'global-font-lock-mode)
          ;; Turn on font-lock in all modes that support it
          (global-font-lock-mode t)
          ;; maximum colors
          (setq font-lock-maximum-decoration t)))
    
          ;; load sgml-mode
          (autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t )
    
          ;; in sgml documents, parse dtd immediately to allow immediate
          ;; syntax coloring
          (setq sgml-auto-activate-dtd t)
    
          ;; set the default SGML declaration. docbook.dcl should work for most DTDs
          (setq sgml-declaration "c:/cygwin/usr/local/lib/sgml/dtd/docbook41/docbook.dcl")
          
          ;; here we set the syntax color information for psgml
          (setq-default sgml-set-face t)
          ;;
          ;; Faces.
          ;;
          (make-face 'sgml-comment-face)
          (make-face 'sgml-doctype-face)
          (make-face 'sgml-end-tag-face)
          (make-face 'sgml-entity-face)
          (make-face 'sgml-ignored-face)
          (make-face 'sgml-ms-end-face)
          (make-face 'sgml-ms-start-face)
          (make-face 'sgml-pi-face)
          (make-face 'sgml-sgml-face)
          (make-face 'sgml-short-ref-face)
          (make-face 'sgml-start-tag-face)
    
          (set-face-foreground 'sgml-comment-face "dark turquoise")
          (set-face-foreground 'sgml-doctype-face "red")
          (set-face-foreground 'sgml-end-tag-face "blue")
          (set-face-foreground 'sgml-entity-face "magenta")
          (set-face-foreground 'sgml-ignored-face "gray40")
          (set-face-background 'sgml-ignored-face "gray60")
          (set-face-foreground 'sgml-ms-end-face "green")
          (set-face-foreground 'sgml-ms-start-face "yellow")
          (set-face-foreground 'sgml-pi-face "lime green")
          (set-face-foreground 'sgml-sgml-face "brown")
          (set-face-foreground 'sgml-short-ref-face "deep sky blue")
          (set-face-foreground 'sgml-start-tag-face "dark green")
    
          (setq-default sgml-markup-faces
          '((comment . sgml-comment-face)
          (doctype . sgml-doctype-face)
          (end-tag . sgml-end-tag-face)
          (entity . sgml-entity-face)
          (ignored . sgml-ignored-face)
          (ms-end . sgml-ms-end-face)
          (ms-start . sgml-ms-start-face)
          (pi . sgml-pi-face)
          (sgml . sgml-sgml-face)
          (short-ref . sgml-short-ref-face)
          (start-tag . sgml-start-tag-face)))
    
          ;; load xml-mode 
          (setq auto-mode-alist
          (append (list (cons "\\.xml\\'" 'xml-mode))
          auto-mode-alist))
          (autoload 'xml-mode "psgml" nil t)
          (setq sgml-xml-declaration "c:/cygwin/usr/local/lib/sgml/dtd/html/xml.dcl")
       
    

    Use the Edit->Text Properties->Display Colors menu command in Emacs to see a list of supported color values if the colors in the above listing don't work on your system (or if you simply don't like them).

  5. Derive a HTML mode

    The following code derives a HTML mode from PSGML and was borrowed from the Debian Linux PSGML package. Insert the following lines into your _emacs file:

         
          ;; define html mode
          (or (assoc "\\.html$" auto-mode-alist)
          (setq auto-mode-alist (cons '("\\.html$" . sgml-html-mode)
          auto-mode-alist)))
          (or (assoc "\\.htm$" auto-mode-alist)
          (setq auto-mode-alist (cons '("\\.htm$" . sgml-html-mode)
          auto-mode-alist)))
    
          (defun sgml-html-mode ()
          "This version of html mode is just a wrapper around sgml mode."
          (interactive)
          (sgml-mode)
          (make-local-variable 'sgml-declaration)
          (make-local-variable 'sgml-default-doctype-name)
          (setq
          sgml-default-doctype-name    "html"
          sgml-declaration             "c:/cygwin/usr/local/lib/sgml/dtd/html/html.dcl"
          
          sgml-always-quote-attributes t
          sgml-indent-step             2
          sgml-indent-data             t
          sgml-minimize-attributes     nil
          sgml-omittag                 t
          sgml-shorttag                t
          )
          )
    
          (setq-default sgml-indent-data t)
          (setq
          sgml-always-quote-attributes   t
          sgml-auto-insert-required-elements t
          sgml-auto-activate-dtd         t
          sgml-indent-data               t
          sgml-indent-step               2
          sgml-minimize-attributes       nil
          sgml-omittag                   nil
          sgml-shorttag                  nil
          )
          
       
    

    The path in the variable sgml-declaration in the listing above is again a dummy at the moment. We will adjust this path as soon as all necessary files are installed.