nxml-mode の補完機能
前回の初期設定メモからだいぶ間があいたような気がするけど気にせず続ける、Emacs nxml-mode メモその3、今回は一番使うであろう補完機能について。info でも最初に補完機能について書かれてる。info は C-u M-x info RET nxml-mode.info RET というふうに、ファイルを指定して開けばいい。
補完キー
まず補完キー。普通は C-<RET> に割り当てられているはず。RET と C-<RET> を区別できない端末上では M-<TAB> に割り当てられるとかナントカ。
開始タグ
まずは開始タグの要素名の補完。例えば、
<html xmlns="http://www.w3.org/1999/xhtml"> <★
開始タグ開始記号の直後この位置(★)で C-RET と打って補完機能を働かせると、ここには head 要素しかこれないので、要素名 head が補完される。
<html xmlns="http://www.w3.org/1999/xhtml"> <head★
候補が複数あるような場所だと、候補が一覧表示されるので、後は Emacs の他の補完機能一般と同じような感じにやればいい。例えば head 要素の中だと次のように候補が表示される。
Possible completions are: base isindex link meta script style title
<ba や <s のように途中まで打ってからでも大丈夫。打ったところまでと一致するものが補完されるか一覧表示される。
ちなみに、nxml-mode は XML 名前空間対応なので、次のように名前空間接頭辞が付いていても大丈夫(RELAX NG compact syntax スキーマを使っている)。これはかっこいい。DTD ベースの PSGML から乗り換える第一の理由。
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"> <★
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"> <xhtml:head★
属性
次は属性。開始タグの中、要素名の後にスペースを入れてから C-RET とする。属性名を途中まで打ってからでもよい。
<img sr★
属性名とイコールとダブルクオーテーションまでが入力される。
<img src="★
とりうる属性値が限られている場合は、属性値のところでも補完が効く。
<img align="t★
<img align="top"★
終了タグ
最後に終了タグの挿入。次のように、タグを閉じるしかないようなところでは、C-RET で終了タグが補完される(title 要素の内容に他の要素が来ることは無いので)。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World<★
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World</title>★
閉じることも他のタグを挿入することも、両方出来るような場所では、候補一覧に次のように表示される(/head)。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World</title>
<★
Possible completions are: /head base isindex link meta script style
スラッシュ入力で自動補完
んでも、終了タグを挿入するのにこれじゃ面倒なので、"</" とスラッシュ打ったら自動的に "</tagname>" と補完してくれる機能が付いている。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World</
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World</title>
この機能を有効にするには、変数 nxml-slash-auto-complete-flag を t にする。~/.emacs には以下のように書いておく。
(add-hook 'nxml-mode-hook
(lambda ()
(setq nxml-slash-auto-complete-flag t)))
空要素タグの場合はスラッシュ入力で ">" を入れてくれる。
<img src="foo.png" alt="foo" /
<img src="foo.png" alt="foo" />
今日はここまで。次はまた忘れたころに妥当性検証やスキーマ設定の話でも。あ、その前に要素の分割とか、その他の操作方法メモかな。
