PSGMLモードを使う

HOME > それいけ Emacs > XML
Last modified: Fri Oct 31 10:54:03 +0900 2008

はじめに

PSGMLモードはSGMLを編集するためのモードだが、XML、HTMLに特化した XMLモード、HTMLモードも含まれています。PSGMLモードではDTDがある と幸せになれます。逆に言うとDTDが無いときは使ってもあまり嬉しく ありません。

設定

(autoload 'xml-mode "psgml" "Major mode to edit XML files." t)

;;; RELAX、RELAX NGもxml-modeで開く
(setq auto-mode-alist
      (append
       '(("\\.\\(xml\\|rlx\\|rng\\)$" . xml-mode))
       auto-mode-alist))

;;; XHTMLはhoge.xhtml.jaのように.xhtmlの後に拡張子がついてもいい
(setq auto-mode-alist
      (append
       '(("\\.xhtml\\([.]?\\w+\\)*$" . xml-mode))
       auto-mode-alist))

(setq auto-insert-alist
                ;; XHTML文書はDOCTYPE宣言もいれる
      (append '((("\\.xhtml\\([.]?\\w+\\)*\\'" . "XHTML Document")
                 nil "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
   \"http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd\">\n")
                ;; 普通のXML文書はXML宣言だけいれる
                (("\\.xml'" . "XML Document")
                 nil "<?xml version='1.0' encoding='UTF-8'?>"))
              auto-insert-alist))

(add-hook 'xml-mode-hook
          (function 
           (lambda ()
             ;; タブは使わない
             (make-variable-buffer-local 'indent-tabs-mode)
             (setq indent-tabs-mode nil)
             ;; タイムスタンプ
             ;; Last modified:の後に空白かタブが入っていると
             ;; タイムスタンプを挿入
             (make-local-variable 'time-stamp-start)
             (setq time-stamp-start "Last modified:[ \t]")
             (make-local-variable 'time-stamp-end)
             (setq time-stamp-end "$")
             (make-local-variable 'time-stamp-line-limit)
             (setq time-stamp-line-limit 3000)
             ;; sgml-validate-commandでは環境変数を
             ;; 定義されるのでenvを使う
             ;; だってtcsh使ってるんだもん
             (make-local-variable 'sgml-validate-command)
             (setq sgml-validate-command 
                   (concat "env " sgml-validate-command))
             ;; カタログのある場所を指定
             (setq sgml-catalog-files
             (append '("catalog" "~/sgml/catalog")
                     sgml-catalog-files)))))

カタログ

設定例のようにsgml-catalog-filesのリストの中に~ /sgml/catalogのように自分で編集できるカタログファイルを指定して おくと、このファイルを設定することでシステムで用意されていない DTDも利用できるようになります。なんかうまくいかないけど。

例えば、~/sgml/catalogに以下のように書いて、~/sgml/以下にW3CからXHTMLのDTDをもってくると DOCTYPE宣言にPUBLIC識別子で使用するDTDを認識してくれます。

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

うまくいかないので以下のようにして~/sgml/catalogを読みこませるよ うにします。

# upgrade-catalog --super --add ~hoge/sgml/catalog

/usr/share/sgml/html/dtd/catalogでDOCTYPE htmlとなっているものは HTML 4.01/looseに解釈されてしまうので以下のようにコメントアウト します。

-- DOCTYPE html                                                                    4.01/loose.dtd
-- DOCTYPE HTML                                                                    4.01/loose.dtd

キーバインド