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ファイル編集時に</と入力するだけで自動的に以下のように補完されます。
議論
事前に特別な設定をすることなく、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.vim
やneocomplecache.vim
などの自動補完プラグインを用いるというアプローチもあります。詳細はHack #49: 自動補完を活用する 後編を
参照ください。
もどる
blog comments powered by Disqus