vimのプラグインであるneocomplcacheを使わせていただいているのですが、その機能の1つであるinclude補完が私の環境だとどうにもこうにもうまく動いてくれないorz
2010/09/30追記
※この問題は解決しました。詳細は文末の追記を参照
neocomplcache
http://www.vim.org/scripts/script.php?script_id=2620
ソース(github)
http://github.com/Shougo/neocomplcache
include補完について解説してくれているサイト
neocomplcache.vim のインクルード補完の使い方 - 永遠に未完成
問題としている点
neocomplcacheのinclude補完ではスクリプト内に
use Fuga;
のようにFugaを読んでる場合Fuga内のメソッドも補完候補として扱えるようになるというとても便利なものです。
perlの場合下記のような記述でメソッドにアクセスすることがあります。
$hoge->fuga();
※ここでfugaはpackage Fugaに含まれるメソッドであるとし、hogeはFugaのインスタンスとします。
この場合に$hoge->fuまで入力した際に補完候補にfugaが出てきて欲しいのですが出てきません。
アロー演算子が無い状態では補完リストに出てくるので(:NeoComplCacheCachingIncludeを実行してから表示されることを確認)どこがだめなのだろうと調べたりしてみました。
環境
OS:FreeBSD 7.1
vimバージョン:vim7.2(適用済パッチ: 1-330)
ctagsバージョン:Exuberant Ctags 5.8
neocomplcache:2010年9月28日時点のgithubからpullしたものを使用
現在の.vimrc(neocomplcacheまわりの設定146行目〜193行目):
http://github.com/dameninngenn/dot_files/blob/master/.vimrc
include補完に必要なinclude,includeexpr,pathはvim付属のperl.vimの値そのままで使用
調査
まず、neocomplcache.vimの286行目でperlのメンバーの演算子を定義しているとこからperlを抜いてみました。
- call neocomplcache#set_dictionary_helper(g:neocomplcache_member_prefix_patterns, 'perl,php', '->') + call neocomplcache#set_dictionary_helper(g:neocomplcache_member_prefix_patterns, 'php', '->')
この状態だとアロー演算子後の補完リストにもちゃんとメソッドが表示されます。
ということは、出てきて欲しいメソッドがメンバだと認識できていないのではないかと考えました。
そう思ってctagsの引数(g:neocomplcache_ctags_arguments_list)を色々変更して試してみたのですがそれでもうまくいかず。
上で書いた参考URLの方の解説によるとキーワードの抽出は以下の順序で行われるとのことなのですが、
1. キャッシュがあればそれを使う。 2. ctags コマンドを使う。 3. 言語が ctags に対応していない、もしくは ctags がインストールされていない場合は自力でキーワードを探す。
キャッシュがあってctagsは使われてないのかなとか。
てことはキャッシュを使うとこの仕組みを見てみたほうがいいのかなとか。
そもそも、もっと根本的な.vimrcでの変数の設定が間違えているとかかもとか。
うーん。
関係ない話ですが、色々見てるうちにちょっとvimスクリプトおもしろいかもと思うようになりました\(^o^)/
2010/09/30追記
neocomplcache作者のShougo Matsushitaさんがこの問題に対応してくださり2010/09/30の最新ソースでこの問題は改善しています。
CHANGELOG *neocomplcache-changelog* 2010-09-30 - Deleted member filter. - Fixed delimiter. 2010-09-29 - Improved filename_complete. - Added g:neocomplcache_enable_auto_delimiter option.
29日の夜に現象を報告してから12時間以内で問題の改善がされました。は、はやすぎる・・・!!
感謝感謝なのですm(_ _)m