vim-users.jp

Hack #93: neocomplcacheを拡張する 前編

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

neocomplcacheはデフォルトのままでも使いやすいですが、自動補完になれてくると、自分でもneocomplcacheの機能を拡張させたいと思うでしょう。そんなときにはneocomplcacheのプラグインを作ると便利です。neocomplcacheに新たな命を吹き込みましょう。

プラグインの仕様

プラグインはautoload/neocomplcache/pluginにインストールしたものが自動的に読み込まれます。 プラグインには、絶対必要な関数がいくつかあります。ここではそれについて説明をしておきます。

neocomplcache#plugin#プラグイン名#initialize()

neocomplcacheが初期化するときに呼ばれます。ここで変数の初期化をしたり、初期設定を行います。

neocomplcache#plugin#プラグイン名#finalize()

neocomplcacheが無効化されるときに呼ばれます。ここで不要になったコマンドやautocmdを削除します。

neocomplcache#plugin#プラグイン名#get_keyword_list(cur_keyword_str)

a:cur_keyword_strにマッチするリストを返すために呼ばれます。get_keyword_list()が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。詳しくは「補完リストの仕様」の項を参照してください。

補完リストの仕様

get_keyword_list()が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。一部のキー以外はVim標準の補完で使用するものと同じです。

word, abbr, menu, info, icase, dup

Vim標準の補完で使用するものと同じです。word以外は省略することができます。詳しい解説は、[Hack #14: ]Insert mode補完 自作編を参照してください。 menuはどのプラグインの候補で補完しているかを[B]のような記号で表す習慣になっています。絞り込み時におかしくなるので、icaseは必ず1に設定してください。

プラグイン用ヘルパ関数

autoload/neocomplcache.vimには、プラグインから呼び出せるようにヘルパ関数が実装されています。ここでは、よく使われる関数について解説します。

neocomplcache#keyword_filter(list, cur_keyword_str)

get_keyword_list()で使用できる、単純なフィルターです。a:listの中から、a:cur_keyword_strにマッチするリストを返します。とは違って、listは変更されるとは限りません。

neocomplcache#unpack_dictionary(dict)

リストの辞書をリスト化して返します。

neocomplcache#unpack_dictionary_dictionary(dict)

辞書の辞書をリスト化して返します。

neocomplcache#keyword_escape(cur_keyword_str)

a:cur_keyword_strをマッチングに使えるようにエスケープします。

neocomplcache#get_cur_text()

現在のカーソル文字列を取得します。

neocomplcache#get_completion_length(plugin_name)

plugin_nameの自動補完する文字列長を返します。

neocomplcache#get_keyword_pattern_end(filetype)

文字列の最後にマッチするfiletypeのキーワードパターンを返します。filetypeは省略可能で、省略すると現在のバッファのfiletypeを参照します。

neocomplcache#get_keyword_pattern(filetype)

文字列にマッチするfiletypeのキーワードパターンを返します。filetypeは省略可能で、省略すると現在のバッファのfiletypeを参照します。

neocomplcache#check_skip_time()

補完開始時刻と現在の時刻を比べ、スキップするべき場合に1を返します。時間がかかりすぎる計算を中断する場合に使います。

neocomplcache#is_auto_complete()

自動補完の時に1を返します。

neocomplcache#print_caching(string)

キャッシュ時のメッセージを表示します。

neocomplcache#print_error(string)

エラーメッセージを表示します。

キャッシュ用ヘルパ関数

autoload/neocomplcache/cache.vimには、プラグインから呼び出せるキャッシュのヘルパ関数が含まれます。 量が多いので、ここでは詳しく説明することは避けますが、うまく利用すると簡単にキャッシュを使ったプラグインを記述できます。 ちなみに、neocomplcache Ver.4以降では、ほとんどのプラグインがキャッシュ用ヘルパ関数を使うように書き直されています。

プラグインのサンプル

neocomplcacheに標準添付のプラグインを参考にしても良いのですが、機能が複雑化しているため、プラグイン作りの勉強のために見るのは大変です。 thincaさんが作成したsnipMate_complte.vimはほどよい長さなので、勉強に最適でしょう。 ただし、これはneocomplcache Ver.4に対応しておらず、仕様が古いです。参考にする場合は注意しましょう。

プラグインと補完関数の違い

neocomplcache Ver.3.00より、補完関数が実装され、より自由度の高い補完が実装できるようになりました。 プラグインと補完関数の違いは、プラグインはカーソル前のキーワードから補完しますが、補完関数は独自に補完位置を決定できるというところです。 ただし、ワイルドカードに対応するためには独自に処理しなければいけないなど、ちょっと面倒な部分もあります。 補完関数の作り方についても、今後VimHacksで特集する予定です。

Shougo

もどる
blog comments powered by Disqus