Emacs Major Mode for SGML and XML DTDs
設定例
部分抜粋です。
CATALOG(DTD指定ファイル、カタログファイル)、とECAT(DTDにアクセス向上)のテキストファイルを用意します。 ECATファイルは速度をあまり気にしないなら中身は空でもかまいません。
CATALOG
-- Oasis entity catalog for Extensible HTML 1.0 --
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"
-- Ant DTD --
PUBLIC "-//ANT//DTD project//EN" "ant.dtd"
ECAT
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" cdtd/xhtml1-strict.dtd PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" cdtd/xhtml1-transitional.dtd PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" cdtd/xhtml1-frameset.dtd PUBLIC "-//ANT//DTD project//EN" cdtd/ant.dtd
設置場所は/usr/local/lib/psqml/以下などがありますが~/etc/psgml/などでもいいです。.emacs.elで指定可能なので設定しやすい場所におきます。
psgmlディレクトリの直下にdtdファイル、CATALOGファイル、ECATファイルを設置します。またcdtdディレクトリを作成します。
.emacs.el設定例
(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 (list (cons "\\.xml\\'" 'xml-mode))
auto-mode-alist)
)
(setq auto-mode-alist
(append (list (cons "\\.html\\'" 'xml-mode))
auto-mode-alist)
)
;; CATALOGとECATの位置設定
(setq sgml-catalog-files '("CATALOG" "/usr/local/lib/psgml/CATALOG"))
(setq sgml-ecat-files '("ECAT" "/usr/local/lib/psgml/ECAT"))
;; C-c C-u C-dで挿入可能なDTDの設定
(setq sgml-custom-dtd
'(
("XHTML 1.0 Strict"
"<!DOCTYPE html
PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n")
("XHTML 1.0 Transitonal"
"<!DOCTYPE html
PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n")
("Ant 1.4.1 DTD"
"<!DOCTYPE project
PUBLIC \"-//ANT//DTD project//EN\"
\"ant.dtd\">\n")
))
;; 色付け
(add-hook 'xml-mode-hook
(function (lambda()
(make-face 'sgml-comment-face)
(make-face 'sgml-start-tag-face)
(make-face 'sgml-end-tag-face)
(make-face 'sgml-doctype-face)
(set-face-foreground 'sgml-comment-face "dark slate grey")
(set-face-foreground 'sgml-start-tag-face "SkyBlue1")
(set-face-foreground 'sgml-end-tag-face "SkyBlue1")
(set-face-foreground 'sgml-doctype-face "DodgerBlue3")
(setq sgml-set-face t)
(setq sgml-markup-faces
'(
(comment . sgml-comment-face)
(start-tag . sgml-start-tag-face)
(end-tag . sgml-end-tag-face)
(doctype . sgml-doctype-face)
)))))
簡易マニュアル
要素操作
C-c C-e |
タグ挿入。<tag></tag>形式 |
C-c C-< |
開始タグ挿入。<tag>形式 |
C-c C-/ |
終了タグ挿入。</tag>形式 |
C-c C-i |
< tag />形式タグ挿入。 |
C-c C-r |
選択領域を囲むタグ挿入。<tag></tag>形式 |
C-c - |
開始終了タグを消す |
C-c <RET> |
ポイントのある部分からタグを分割 |
C-c C-t |
現在の要素を表示に挿入可能な要素を表示する |
属性操作
C-c + |
属性の挿入 |
C-c = |
属性の名称変更 |
C-c C-a |
属性編集画面表示 |
Tab |
次の属性へ移動 |
DTD
C-c C-u C-d |
DOCTYPEの挿入 |
C-c C-p |
DTDのパース |
構文チェック
C-c C-v |
構文チェクをする |
C-c C-o |
構文チェクで誤りがあったらそこにjump |
PSGMLの構文チェンクは標準ではnsgmlsを利用します。がぼくはonsgmlsを利用しています。
fink install opensp
にてインストール可能です。関連してopenjadeもインストールしておくのもよいかもしれません。
ブラウザでの確認
記述しな物をブラウザ上に表示する必要が生じる場合はよくあります。
(define-key xml-mode-map "\C-c\C-zv" 'browse-url-of-file)
などを設定します。
そのうち解説よう
key binding --- ------- <S-mouse-3> sgml-tags-menu ESC Prefix Command / sgml-slash > sgml-close-angle TAB sgml-indent-or-tab C-c Prefix Command ESC C-SPC sgml-mark-element ESC TAB sgml-complete ESC C-t sgml-transpose-element ESC C-h sgml-mark-current-element ESC C-@ sgml-mark-element ESC C-k sgml-kill-element ESC C-u sgml-backward-up-element ESC C-d sgml-down-element ESC C-b sgml-backward-element ESC C-f sgml-forward-element ESC C-e sgml-end-of-element ESC C-a sgml-beginning-of-element C-c C-y sgml-position C-c C-z sgml-trim-and-leave-element C-c C-w sgml-what-element C-c C-v sgml-validate C-c C-t sgml-list-valid-tags C-c C-s sgml-unfold-line C-c C-r sgml-tag-region C-c C-q sgml-fill-element C-c C-p sgml-parse-prolog C-c C-o sgml-next-trouble-spot C-c C-n sgml-up-element C-c RET sgml-split-element C-c C-l sgml-show-or-clear-log C-c C-k sgml-kill-markup C-c TAB sgml-add-element-to-element C-c C-e sgml-insert-element C-c C-d sgml-next-data-field C-c C-c sgml-show-context C-c C-a sgml-edit-attributes C-c = sgml-change-element-name C-c < sgml-insert-tag C-c / sgml-insert-end-tag C-c + sgml-insert-attribute C-c - sgml-untag-element C-c # sgml-make-character-reference C-c C-u Prefix Command C-c C-f Prefix Command C-c C-u RET sgml-custom-markup C-c C-u C-l sgml-unfold-line C-c C-u C-e sgml-unfold-element C-c C-u C-d sgml-custom-dtd C-c C-u C-a sgml-unfold-all C-c C-f C-x sgml-expand-element C-c C-f C-s sgml-fold-subelement C-c C-f C-r sgml-fold-region C-c C-f C-e sgml-fold-element
追加設定実験中
;; バッファが .html の場合 の設定
(add-hook 'sgml-mode-hook
(lambda ()
(if (or (string-match "\\.html$" (buffer-name))
(string-match "\\.htm$" (buffer-name)))
(setq sgml-shorttag nil ;タグの短縮は無効
sgml-indent-data nil ;自動インデントなし
sgml-general-insert-case 'lower ;要素名は小文字
sgml-auto-activate-dtd nil ;構文解析しない
))
))
