html-helper-mode => psgmlモード HTMLの編集をより便利にしたい

html-helper-mode はキーバインドが覚えにくいので psgmlモードを代わりに使うことにした。psgmlモード なら「C-c C-e タグ名 RET」でタグの挿入ができるらしいので、覚えるキーバインドが少なそうだ。


ここから先の内容は、(情報源)の内容の要約版みたいなものなので、詳しくはそちらを参照。

PSGMLの入手とインストール

1.A GNU Emacs mode for SGML filesから「Version 1.3.1」をダウンロードする


2.psgml-1.3.1.tar.gz をロードパスの通ったディレクトリに入れる(C:\meadow\site-lisp とか)


3.psgml-1.3.1.tar.gz を解凍・展開し、そのディレクトリに移動する

$ gunzip -dc psgml-1.3.1.tar.gz | tar xf -
$ cd psgml-1.3.1


4.以下のようにビルドする(ここ良く理解してない)

$ ./configure
$ make EMACS=meadow
$ make EMACS=meadow install

追記(2007年8月31日(金))

実は、上のビルドは「EMACS=meadow」を指定すれば大丈夫だろうと自分で勝手に考えて実行してしまった(これでも良いのかも知れないけど)。Meadowの場合は、以下のようにするらしい。
参考:

% meadow -batch -q -l ./psgml-maint.el -f psgml-compile-files

DTDの入手とインストール

1.W3Cのページから DTD をダウンロードする
XHTML™ 1.1 - Module-based XHTML - Second EditionGzip'd TAR archive. をダウンロードする)


XHTML 1.0: The Extensible HyperText Markup Language (Second Edition):以下、xhtml11のみについて手順を説明するが、他のDTDも同じように追加できる。ただし、カタログを編集する必要あり。(参考:カタログの書き方


2.自分のホームディレクトリに ~/DTD というディレクトリを作ってそこに解凍・展開する

$ mkdir -m755 DTD
$ tar zxf xhtml11.tgz -C DTD


3.~/DTD/xhtml11-20070216/DTD/ 以下に catalogファイルとdtdがあることを確認してみる

$ ls DTD/xhtml11-20070216/DTD/*
DTD/xhtml11-20070216/DTD/VERSION*
DTD/xhtml11-20070216/DTD/xhtml11-flat.dtd*    ← これを使う(カタログ内で指定されてるので、明示的に指定しなくてOK)
DTD/xhtml11-20070216/DTD/xhtml11-model-1.mod*
DTD/xhtml11-20070216/DTD/xhtml11.cat*         ← このカタログを指定する
DTD/xhtml11-20070216/DTD/xhtml11.dtd*
DTD/xhtml11-20070216/DTD/xml1.dcl*
DTD/xhtml11-20070216/DTD/xml1n.dcl*

.emacsの設定

以下の内容を、.emacs に追加する。以上で設定完了。

;;; PSGML の設定
(autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t)
(autoload 'xml-mode "psgml" "Major mode to edit XML files." t)
(setq auto-mode-alist
      (append
       '(("\\.html$" . xml-mode)
         ("\\.xhtml$" . xml-mode))
       auto-mode-alist))

;; カタログファイルの指定
(setq sgml-catalog-files '("~/DTD/xhtml11-20070216/DTD/xhtml11.cat"))

;; DOCTYPE 宣言の設定
(setq sgml-custom-dtd
      '(("XHTML 1.1"
         "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"
                      \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">")
	("XHTML 1.0"
	 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
                      \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">")
        ))

;; sgml-mode hookで変数をsetq
(add-hook 'sgml-mode-hook
          (lambda ()
            (setq tab-width                             2
                  sgml-indent-step                      2
		  sgml-indent-data                      t
                  indent-tabs-mode                      nil
                  sgml-xml-p                            t
                  sgml-always-quote-attributes          t
                  sgml-system-identifiers-are-preferred t
                  sgml-auto-activate-dtd                t
                  sgml-recompile-out-of-date-cdtd       t
                  sgml-auto-insert-required-elements    t
                  sgml-insert-missing-element-comment   t
                  sgml-balanced-tag-edit                t
                  sgml-default-doctype-name             "XHTML 1.1"
                  sgml-ecat-files                       nil
                  sgml-general-insert-case              'lower
                  sgml-entity-insert-case               'lower
                  sgml-normalize-trims                  t
                  sgml-insert-defaulted-attributes      nil
                  sgml-live-element-indicator           t
                  sgml-active-dtd-indicator             t
                  sgml-minimize-attributes              nil
                  sgml-omittag                          nil
                  sgml-omittag-transparent              nil
                  sgml-shorttag                         nil
                  sgml-tag-region-if-active             t
                  sgml-xml-validate-command             "xmllint --noout --valid %s %s"

                  )
            ))

;; これ以下はお好みで

;; font-lock
(font-lock-mode 1)
(setq font-lock-support-mode   'jit-lock-mode
      jit-lock-stealth-verbose nil
      font-lock-verbose nil)

;; PSGML デフォルトのfont-lockを使う場合
;;(setq sgml-set-face t
;;    sgml-markup-faces '((start-tag  . font-lock-builtin-face)
;;                          (end-tag    . font-lock-builtin-face)
;;                          (ms-start   . font-lock-variable-name-face)
;;                          (ms-end     . font-lock-variable-name-face)
;;                          (comment    . font-lock-comment-face)
;;                          (ignored    . font-lock-warning-face)
;;                          (pi         . font-lock-preprocessor-face)
;;                          (sgml       . font-lock-type-face)
;;                          (doctype    . font-lock-constant-face)
;;                          (entity     . font-lock-string-face)
;;                          (shortref   . font-lock-reference-face)))

;; My original font-lock-keywords
(add-hook 'sgml-mode-hook
          '(lambda ()
             (make-local-variable 'font-lock-defaults)
             (setq sgml-set-face nil
                   font-lock-defaults '(xml-font-lock-keywords-2 nil))
             (turn-on-font-lock)
             ))

(defvar xml-font-lock-keywords-1
  (list
   ;; タグ開始区切子 & タグ終了区切子
   '("<\\|>" 0 font-lock-keyword-face t)
   ;; スラッシュ
   '("\\(/\\)>" 1 font-lock-keyword-face t)
   '("<\\(/\\)" 1 font-lock-keyword-face t)
   ;; 要素名
   '("\\(</?\\)\\([a-zA-Z]+[a-zA-Z0-9-_:]*\\)" 2  font-lock-builtin-face t)
   ;; コメント
   '("\\(<!--\\([^-]\\|-[^-]\\|--[^>]\\)*-->\\)" 1 font-lock-comment-face t)
   ;; 命令処理
   '("\\(<\\?[a-zA-Z]*\\>[^<>]*\\(<[^>]*>[^<>]*\\)*\\?>\\)" 1 font-lock-type-face t)
   ;; DOCTYPE, ENTITY, ATTLIST, NOTATION等々 マーク宣言
   '("\\(<![a-zA-Z]+\\>[^<>]*\\(<[^>]*>[^<>]*\\)*>\\)" 1 font-lock-constant-face t)
   ;; °
   '("\\<\\([a-zA-Z]+[a-zA-Z-_:]*\\)=" 1 font-lock-variable-name-face t)
   ;; 属性値
   '("=?\\(\"[^\"]*\"\\|'[^\']*'\\)" 1 font-lock-string-face t)
   ;; 数値文字参照, 文字実体参照, パラメータ実体参照
   '("\\(&#[0-9]+;\\|&[a-zA-Z]+;\\|%[^'\";]+;\\)" 1 font-lock-reference-face t)
   ;; CDATA 等々 マーク区間 (マーク指定区域)
   '("\\(<!\\[[^\\[]+\\[[^]]+]]>\\)" 1 font-lock-warning-face t)
   ))

(defvar xml-font-lock-keywords-2
  (append
   xml-font-lock-keywords-1
   (list
    ;; SSI
    `(,(concat "\\(<!--#\\(fsize\\|flastmod\\|printenv\\|"
               "include\\|echo\\|config\\|exec\\|set\\|"
               "if\\|elif\\|else\\|endif\\)\\>[ \t\n]+"
               "\\([^-]\\|-[^-]\\|--[^>]\\)*-->\\)")
      1 'bold t)
    ;; php
    '("\\(<\\?\\(php\\|=\\)[^?>]+\\?>\\)" 1 font-lock-function-name-face t)
    ;; eRuby, JSP, ASP
    '("\\(<%\\(=\\)?\\>[^%>]+%>\\)" 1 font-lock-function-name-face t)
    )))

使い方

.html ファイルを開くとモードラインに(XML)と表示されているはず。そこで、C-c C-e タグ名 RET と入力すると、そのタグが挿入できる。もちろん TAB で補完もできる。

参考

:情報源
PSGMLモードを使うキーバインドのみ参照した
:カタログファイルの書き方
html writing memo:PSGMLモードの使い方