xyzzyでXMLファイルを編集するためのモードです。YMTZさんのhtml+-modeをベースにXMLには不要と思われる機能を削除し、XMLに最低限必要な機能を追加しました。
追加した機能は以下の通りです。
NetInstallerを使うか手作業でインストールする方法のどちらかを選んでください。
NetInstallerでインストールする方法はそちらのドキュメントを参照してください。ここでは手動による方法を説明します。
(require "xml/xml-mode") (use-package 'xml)
requireしてください。M-x xml-modeと手動で実行すればカレントバッファがxml-modeになります。
また.xmlという拡張子のファイルを開くと自動でxml-modeになります。各ドキュメントタイプごとのファイルをロードすれば、それらの所定の拡張子のファイルを開くと、自動でxml-modeになります(2.08より*auto-mode-alist*の設定は不要になりました)。
さらに、文書中に<!-- -*- xml -*- -->というコメントを挿入しておくことにより、拡張子に関係なくopen時にxml-modeにすることもできます(xyzzyの機能)。このコメントはxml-insert-something(C-x C-i)コマンドにより挿入することができます。
xml-modeでは各ドキュメントタイプごとにキーワードの色づけ・補完をしたり、そのドキュメントタイプ固有のコマンドを実行したりすることができます。これらの機能を利用するには、各ドキュメントタイプごとのファイルをロードする必要があります。現状サポートしているドキュメントタイプは以下の通りです。
| ドキュメントタイプ | ファイル |
|---|---|
| xhtml | xml/xhtml.l |
| SVG | xml/svg.l |
| XSLT | xml/xslt.l |
| XSL-FO | xml/xsl-fo.l |
| MathML | xml/mathml.l |
| XLink | xml/xlink.l |
| RELAX NG | xml/relaxng.l |
| SmartDoc | xml/smartdoc.l |
| xyzzy reference | xml/xyzref.l |
| Xi | xml/xi.l |
| XTemplate | xml/xtemplate.l |
必要なものだけ選んでロードしてください。
(require "xml/xhtml") (require "xml/svg") (require "xml/xslt") (require "xml/xsl-fo") (require "xml/mathml") (require "xml/xlink") (require "xml/relaxng") (require "xml/smartdoc") (require "xml/xyzref") (require "xml/xi") (require "xml/xtemplate")
| RET | 改行+インデント付け |
| TAB | インデント付け+補完 |
| / | 閉じタグの自動補完 |
| ESC C-, | 以前に出現したタグの複写 |
| C-. | いろいろと自動補完(閉じタグ、括弧、パス、引用符, CDATA) |
| C-, | 今の状況にあわせてタグをいい感じに推測して挿入。 |
| C-: | タグの対応のチェック |
| C-; | エレメント階層をコメントアウト/イン |
| C-x C-j | 相対/絶対パスの挿入 |
| C-d | delete-char-or-selectionのタグ・文字列削除版。*xml-delete-tag*または*xml-delete-string*をnon nilにしたときのみ有効 |
| C-h | backward-delete-char-untabify-or-selectionのタグ・文字列削除版。*xml-delete-tag*または*xml-delete-string*をnon nilにしたときのみ有効 |
| ESC C-h | 直前のタグの削除 |
| ESC C-d | 直後のタグの削除 |
| C-x C-i | いろいろと挿入(xml-decl、doctype, namespace, cdata, stylesheet, pi, mode-comment) |
| C-c t | スタイルシート適用 |
| C-c x | xml-run |
| C-c c | xml-runで起動するコマンドを指定 |
| C-c d | デフォルトネームスペースの指定 |
| C-c a | プレフィックスを指定してネームスペースに追加 |
| C-c r | プレフィックス付のネームスペースを削除 |
| = | タグの中では=""または=''を自動で挿入する。*xml-attrbute-quote-char*の値によりどちらか選択可能 |
| C-c s | リージョンの中の",',&,<,>を&...;という形式に変換する。C-uをつけて実行すると、変換する文字を絞り込める。 |
| ESC C-e | バッファ全体のJIS文字以外の文字を&#uuuu;という文字実体参照の形に変換する。uuuuは文字のUnicodeを十進の数値に変換したもの。M-x xml-character-to-entity-regionでリージョン内の文字のみ変換する。 |
| ESC C-c | バッファ全体の&#uuuu;という文字実体参照を対応する文字に変換する。uuuuは文字のUnicodeを十進の数値に変換したもの。M-x xml-entity-to-character-regionでリージョン内の文字のみ変換する。 |
C-,(状況にあわせていい感じにタグを挿入してくれる機能)を復活させました。現在のところ、xhtml, SmartDoc, svg, xslt, xsl-fo, xyzref, RelaxNGなどを対応させてます。SmartDoc用のリストはKUBO Masatoさんよりいただきました。*xml-indent-tabs-mode*という変数により、インデントにタブを使うかどうかを指定できるようにした。デフォルトはtでタブを使う。(西原さんのご提案)*xml-set-encoding-on-save*という変数をnilにすることにより保存時にxml宣言のencoding属性をみてencodingを変更するという機能をOFFにできるようにした。*xml-use-utf8n-encoding*という変数の値をnilにすることにより抑制できる。'”は'に変換するようにした。",',&,<,>を変換する機能を追加。?の入力でその次の>を補完する機能の廃止。かわりにxml-insert-somethingでprocessing instructionを挿入できるようにしたカレントバッファのXML文書の種別に応じて、コマンドを起動する機能です。たとえば*.foではfop.batが起動され、*.xiではxi.exeが起動されます。
オプションは標準では各コマンドごとに変数の値が参照されます。たとえば、fop.batならば*fop-options*、xi.exeなら*xi-options*、msxsl.exeなら*msxsl-options*、xt.exeなら*xt-options*です。ただし、C-u C-c xというようにprefix引数付で起動すると、これらの変数ではなくミニバッファから読み込んだ値が使用されるようになります。下記のスタイルシート適用機能も同様です。
特にこれらのコマンドが指定されない場合、ブラウザでxmlファイルを表示しようとします。表示するためにはs.oowadaさんのbrowser.dll(必須)とohkuboさんのbrowserex(旧browser-wrap)(推奨)を組み込んでください。また、*xml-navigate-function*という変数に、自前で定義してたブラウザ起動の関数を設定することもできます。
起動するコマンドはC-c cで手動で切り替えることもできます。
現在のバッファのXMLファイルに指定したスタイルシートを適用して変換し、結果を"*XML Command output*"というバッファに出力します。なお、この機能を利用するにはmsxsl.exeまたはxt.exeが必要です。
標準ではmsxsl.exeが利用されます。以下の式を評価すると、xt.exeが利用されるようになります。msxsl.exeに戻すには*xsl-xt*の代わりに*xsl-msxsl*を指定してください。
(setq *xsl-transform-command* *xsl-xt*)
msxsl.exeは標準ではインストールされていません。同様にMicrosoftのページからダウンロードしてc:\windows\system32等PATHの通ったディレクトリにおいてください。
msxsl.exeを利用するにはMSXML3.0が必要です。MSXML3.0はIE6以降であれば標準でインストールされていますが、それ以前のバージョンをお使いの場合、以下のMicrosoftのページからダウンロードしてsetupを行ってください。
xt.exeは以下のページからダウンロードできます。PATHの通ったディレクトリに置いてください。
http://www.jclark.com/xml/xt.html
ちょっとわかりにくいので簡単な説明を書きます。
まずC-c dキーに割り当てているxml-set-default-namespaceですが、これでDOCTYPEを指定すると、そのDOCTYPEのキーワードがprefixなしで利用できるようになります。たとえばXHTML1.1を指定すると"h1"というタグが補完できたり、色付けされます。ただし、指定できるDOCTYPEは1つだけです。
次にC-c aキーに割り当てているxml-add-namespaceですが、こちらはprefixつきで指定したDOCTYPEのキーワードが追加されます。たとえばXHTML1.1を"html"というprefixで追加すると、"html:h1"というタグが補完できたり、色付けすることができます。複数のDOCTYPEを追加できます。
C-a rキーに割り当てているxml-remove-namespaceはxml-add-namespaceで追加したDOCTYPEを削除します。
新しいタイプを定義するには以下のようにします。
*xml-doctypes*に以下のようにリストを追加します。
(pushnew
'("名前"
"ルートエレメント"
"PUBLIC識別子"
"DTDのURL"
"ネームスペースプレフィックスのデフォルト"
"ネームスペースのURL"
キーワード定義
推測リスト
)
*xml-doctypes* :test #'equal)
キーワード定義には2つの方法があります。
キーワードをリストにして指定することもできます(推奨)。
( (タグ1 "キーワード1" "キーワード2" ...) (タグ2 "キーワード3" "キーワード4" ...) ... )
各キーワードのうち“@”からはじまるのは属性とみなされ、“&”からはじまるのは文字実体参照、それ以外が要素名としてみなされます。現状リスト先頭のタグは単に無視されますので、タグごとに分割する意味はありません。
*xml-auto-doctype-alist*に以下のようにリストを追加
(pushnew '("ファイル名の正規表現" コマンド実行のタグ "DOCTYPEの名前")
*xml-auto-doctype-alist* :test #'equal)
*xml-command-alist*に以下のリストを追加
(push '(コマンド実行のタグ
"テンプレート"
引数1
引数2
...)
*xml-command-alist*)
テンプレートと各引数は評価されて(format nil ...)の引数として渡され、その結果が実行するコマンド行になります。
具体的な例はsite-lisp/xmlディレクトリの下の各ドキュメントタイプ定義ファイルを参照してください。