vim-users.jp

Hack #22: XMLの閉じタグを補完する

Posted at 2009/06/06
このエントリーをはてなブックマークに追加

問題

XMLの各要素は開きタグと閉じタグの組を用いて表現します。 閉じタグを毎回手入力する作業は不毛で、スムーズに入力が支援されるべきです。 このことは入力の手間を省くだけでなく、入力の間違いを減らすことにも貢献します。

解決

vimrcファイルに以下の設定を記述します。

augroup MyXML
  autocmd!
  autocmd Filetype xml inoremap <buffer> </ </<C-x><C-o>
augroup END

これでXMLファイル編集時に</と入力するだけで自動的に以下のように補完されます。

before

after

議論

事前に特別な設定をすることなく、Vimが標準で提供している機能でXMLの閉じタグが補完できます。XMLファイルを編集時に、

<aaa><bbb></bbb></

まで入力している状態で、挿入モードのままで<C-x><C-o>とタイプすると、

<aaa><bbb></bbb></aaa>

のように対応する<aaa>タグが自動的に閉じられます。ここで用いた<C-x><C-o>filetypeに応じた補完を行なう 機能です。 XMLのための<C-x><C-o>omnifunc関数は$VIMRUNTIME/autoload/xmlcomplete.vimで定義されています。 詳細はHack #4: Insert mode補完 導入編を参照してください。

しかし、<C-x><C-o>は非常に入力しづらいキーシーケンスです。また、XMLを編集中に</と入力した後は、必ず対応するタグを示す文字列を入力することになり、これに例外はまずありません。従って、</と入力すると即座に自動的に閉じタグが展開されることが望まれます。

以下の一行をvimrcファイルに記述することで、</と入力すると即座にオムニ補完が実行されます。

inoremap </ </<C-x><C-o>

しかしXML以外のファイルを編集中に上記補完が勝手に実行されてはたまりません。また、</とまでタイプすることはなくとも、<のタイプがバッファに即反映されないのは若干のストレスを感じてしまいます。ここで上記特徴をXMLファイル編集時に限定するために、autocmdと組み合わせて以下のように設定する必要があります。

augroup MyXML
  autocmd!
  autocmd Filetype xml inoremap <buffer> </ </<C-x><C-o>
augroup END

ここで、XMLだけでなくHTMLに関する設定の行も追加するとなおよろしいでしょう。

augroup MyXML
  autocmd!
  autocmd Filetype xml inoremap <buffer> </ </<C-x><C-o>
  autocmd Filetype html inoremap <buffer> </ </<C-x><C-o>
augroup END

autocmdについて詳しくはHack #13: autocmdを使用して自動的に処理を実行するを参照ください。

今回はinoremapを用いて</という入力キーシーケンス自体を上書きするというアプローチを採用しました。他にも、autocomplpop.vimneocomplecache.vimなどの自動補完プラグインを用いるというアプローチもあります。詳細はHack #49: 自動補完を活用する 後編を 参照ください。

ujihisa


もどる
blog comments powered by Disqus