Hack #169: neocomplcacheを拡張する 後編
Posted at 2010/08/23ツイート
前編からかなり間が空いてしまいましたが、ここではneocomplcacheのプラグインの記述方法を解説します。neocomplcache Ver.5.1ではプラグインの構成がかなり変化したので、この記事を参考にしてください。
プラグインの仕様
プラグインはautoload/neocomplcache/sourcesにインストールしたものが自動的に読み込まれます。 プラグインには、neocomplcache#sources#プラグイン名#define()が絶対必要です。 これはneocomplcacheが初期化するときに呼ばれ、neocomplcacheにディクショナリ変数を渡します。 ここではディクショナリ変数に必要な要素について説明をします。
name
プラグインの名前です。
kind
プラグインの種類を現します。plugin, ftplugin, complfuncの三種類があります。これらの違いについては後述します。
filetypes
ftpluginにのみ存在します。どのファイルタイプで補完するかを表すディクショナリ変数です。
initialize()
プラグインの初期化時に呼ばれます。コマンドの登録等を行います。ftpluginの場合、これが呼ばれるのはfiletypesに対応するバッファで補完されたときです。
finalize()
neocomplcacheの無効化されるときに呼ばれます。ここで不要になったコマンドやautocmdを削除します。
get_keyword_list(cur_keyword_str)
pluginにのみ存在します。a:cur_keyword_str
にマッチするリストを返すために呼ばれる関数です。get_keyword_list()
が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。詳しくは「補完リストの仕様」の項を参照してください。
get_keyword_pos(cur_text)
ftpluginとcomplfuncに存在します。cur_text
にマッチする補完位置を返します。
get_complete_words(cur_keyword_pos, cur_keyword_str)
ftpluginとcomplfuncに存在します。a:cur_keyword_str
にマッチするリストを返すために呼ばれます。get_complete_words()
が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。詳しくは「補完リストの仕様」の項を参照してください。
補完リストの仕様
get_keyword_list()
やget_complete_words()
が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。一部のキー以外はVim標準の補完で使用するものと同じです。
word, abbr, menu, info, icase, dup
Vim標準の補完で使用するものと同じです。word以外は省略することができます。詳しい解説は、[Hack #14: ]Insert mode補完 自作編を参照してください。 menuはどのプラグインの候補で補完しているかを[B]のような記号で表す習慣になっています。ftpluginは[vim]や[ghc]のように、長めの文字列を使います。
プラグイン用ヘルパ関数
autoload/neocomplcache.vimには、プラグインから呼び出せるようにヘルパ関数が実装されています。ここでは、よく使われる関数について解説します。
neocomplcache#keyword_filter(list, cur_keyword_str)
get_keyword_list()
で使用できる、単純なフィルターです。a:list
の中から、a:cur_keyword_str
にマッチするリストを返します。filter()
とは違って、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#set_completion_length(plugin_name)
plugin_name
の自動補完する文字列長を設定します。ただし、これはプラグイン側で初期値を設定するためのもので、ユーザーが補完文字列長を設定している場合、そちらが優先されます。
neocomplcache#get_keyword_pattern_end(filetype)
文字列の最後にマッチするfiletype
のキーワードパターンを返します。filetype
は省略可能で、省略すると現在のバッファのfiletype
を参照します。
neocomplcache#get_keyword_pattern(filetype)
文字列にマッチするfiletype
のキーワードパターンを返します。filetype
は省略可能で、省略すると現在のバッファのfiletype
を参照します。
neocomplcache#is_auto_complete()
自動補完の時に1を返します。
neocomplcache#print_caching(string)
キャッシュ時のメッセージを表示します。
neocomplcache#print_error(string)
エラーメッセージを表示します。
キャッシュ用ヘルパ関数
autoload/neocomplcache/cache.vim
には、プラグインから呼び出せるキャッシュのヘルパ関数が含まれます。
量が多いので、ここでは詳しく説明することは避けますが、うまく利用すると簡単にキャッシュを使ったプラグインを記述できます。
ちなみに、neocomplcache Ver.4以降では、ほとんどのプラグインがキャッシュ用ヘルパ関数を使うように書き直されています。
プラグインのサンプル
neocomplcacheに標準添付のプラグインを参考にしても良いのですが、機能が複雑化しているため、プラグイン作りの勉強のために見るのは大変です。 eagletmtさんが作成したghc_completeはfiletype pluginでほどよい長さなので、勉強に最適でしょう。
plugin, ftplugin, complfuncの違い
neocomplcache Ver.3.00より、complfuncが実装され、より自由度の高い補完が実装できるようになりました。 pluginとcomplfuncの違いは、pluginはカーソル前のキーワードから補完しますが、complfuncは独自に補完位置を決定できるというところです。 ftpluginとはneocomplcacheのオムニ補完です。 基本的な仕様はcomplfuncと同じです。ただし、必要な時にのみ初期化や呼び出しされるというところが違います。
Shougoもどる
blog comments powered by Disqus