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 Edition(Gzip'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モードの使い方