nXML-modeでauto-complete.elを使って入力補完するauto-complete-nxml.elを作りました

これは何?

Emacsxmlやhtmlの編集のためにnXML-modeという拡張があります。 編集しているコンテキストに合わせてオムニ補完ができるので、とても便利ですが、 補完候補を選択するインタフェースがEmacs標準のもので使い勝手が悪く、 また、補完する時には、C-RETを押下しなければなりません。 補完選択のインタフェースには、auto-complete.elという素晴らしい拡張がありますので、 nXML-modeでも、そのインタフェースを利用できる拡張を作成しました。

スクリーンショット

nXML-mode時、"<"入力で、

f:id:aki2o:20130323172543p:plain

となり、選択すると、

f:id:aki2o:20130323172653p:plain

となり、選択すると、

f:id:aki2o:20130323172719p:plain

となり、選択すると、

f:id:aki2o:20130323172801p:plain

となります。

特徴

特別なキー入力しなくても補完が開始される

nXML-modeでは、補完開始はデフォルトでC-RETに割り当てられており、 そのキーを押さないと補完は開始されませんが、 auto-complete.elのインタフェースなら自動で補完開始されてもウザくない(私は)ので、 なるべく空気を読んで補完開始するようにしています。

CSSのプロパティ名やプロパティ値の補完もできる

nXML-modeでは、登録されているスキーマ定義ファイルから補完候補を抽出しますが、 CSSスキーマ定義はないため、style属性は補完できませんが、 auto-complete.elには、CSSの補完候補が付属されているため、補完可能です。

テキスト部分は、同じモードの他のバッファのキーワードから補完できる

タグ内のテキスト(HTMLなら画面に表示される部分)や、自由入力の属性値は、 その時に開かれているnXML-modeのバッファの同じ部分のテキストの単語が補完候補として表示されます。

anything-project.elに定義されたプロジェクト情報が利用して補完

上記の単語の補完は、その時に開かれているバッファ内の単語でしかできないので、 あまり嬉しくないです。なので、anything-project.elのプロジェクト情報を利用して、 同じプロジェクトにあるnXML-modeで開くファイルから、自動で単語を抽出するようにしました。 anything-project.elがインストールされていれば、自動でこの挙動になります。 プロジェクトに属していないファイルの場合は、挙動は変わりません。

※プロジェクトのどれかのファイルを初めて開いた時に単語の抽出処理を行うため、 ファイルが多数あるプロジェクトの場合、最初だけ開くのに時間かかるかもしれません。

複数のxmlns定義の自動挿入

nXML-modeでは、名前空間の概念が実現できています。以下のように記述した場合、

<html xmlns="http://www.w3.org/TR/xhtml1"
      xmlns:math="http://www.w3.org/1998/Math/MathML">

タグ名補完の際、"http://~/MathML"に定義されているタグは "math:タグ名"とプレフィックスが付加された候補が表示されます。 ですが、xmlns属性の補完の際にはデフォルトの名前空間しか挿入しません。 なので、xmlns属性の補完時に、そのスキーマで利用できる名前空間の定義を全て自動挿入するようにしています。

※私がXMLの仕様が理解できていないだけかもしれません。不要なら面倒ですが、自動挿入後削除して下さい。

インストール

ソース置場: https://github.com/aki2o/auto-complete-nxml

上記URLにアクセスし、auto-complete-nxml.elをダウンロードしてロードパスの通った場所に配置して下さい。 auto-install.elが利用できるなら、以下のs式を評価することでインストールできます。

(auto-install-from-url "https://raw.github.com/aki2o/auto-complete-nxml/master/auto-complete-nxml.el")

インストール後、.emacsまたはinit.elに以下を記述

(require 'auto-complete-nxml)

2013/04/18追記

el-getでインストール可能になりました。 ただし、まだmasterにしか登録されていません。

Enjoy!!!

その他

  • auto-complete.elが必要です。
  • anything-project.elもあると良いと思います。

リンク