marching.vim をいろいろと改良した

先日 Vim で C++ のコード補完を行うプラグインをつくったのですが、いろいろと改良しました。
キャッシング周りはだいぶマシになったんじゃなかろうかと。

[主な改良点]

  • キャッシング周りの強化
    • バッファごとにキャッシングを保持するようにした
  • 同期版の実装を追加
  • 補完ウィンドウに表示される情報を追加
  • g:marching_enable_refresh_always オプションの追加


https://f.cloud.github.com/assets/214488/1419479/bf4c31d6-3fcc-11e3-97fb-928f8006691e.gif

[キャッシング周りの強化]

キャッシング周りを強化しました。
例えば、

value.
std::

のようなコード補完を行った場合、『value.』や『std::』をキーとしたキャッシングを行います。
これにより、そのバッファで次に『value.』や『std::』でコード補完を行った場合にキャッシングを使用するので高速にコード補完が実行されます。
このキャッシュデータはバッファごとに保持されます。
また、キャッシュデータは基本的には削除されないのでクラスのメンバが変わったりしても結果が変わることはありません。


このキャッシングを削除したい場合は、

:MarchingBufferClearCache

でバッファ内のキャッシュをすべて削除することができます。


また、

<Plug>(marching_force_start_omni_complete)

を使用すると補完情報の再取得を行ってからコード補完を行うことができます。


わたしは次のようなマッピングをして使用しています。

" コード補完を行う
" 2回目以降はキャッシュしたデータを使用する
imap <C-x><C-o> <Plug>(marching_start_omni_complete)

" 補完情報の再取得を行ってからコード補完を行う
imap <C-x><C-o> <Plug>(marching_force_start_omni_complete)


注意点として、バッファ全体で補完データを保持しているため、別の関数内で同名の変数を使用した場合に同じ補完データが使用されます。
そういう問題を回避したいのであれば下記のような設定を行うとよいと思います。

" filetype=cpp で insert mode から抜けるたびにキャッシュを削除する
augroup cpp
    autocmd!
    autocmd FileType cpp call s:cpp()
augroup END

function! s:cpp()
    augroup filetype-cpp
        autocmd! * <buffer>
        autocmd InsertLeave <buffer> MarchingClearCache
    augroup END
endfunction

[同期版の実装を追加]

非同期ではなくて、同期で補完処理を行う実装を追加しました。
この実装では reunions.vim や vimproc.vim には依存しません。
この実装は以下の設定を行うことで使用する事ができます。

let g:marching_backend = "sync_clang_command"

この設定を行うと補完時に処理が終わるまでの待ち処理が入ります。
Boost など補完に時間がかかるライブラリを使用する場合には注意して下さい。
また、この設定でも上記のキャッシュ処理は同様に行われるので2回目以降はすぐに結果が表示されます。

[補完ウィンドウに表示される情報を追加]

補完ウィンドウに表示される情報を追加しました。
今までは名前しか出ていなかったんですが、型やシグネチャなんかを表示するようにしました。


表示に関してはまたなにか変更するかもしれません。
できればユーザ側で自由に編集できるようにしたいとは思うんですけども…。

[g:marching_enable_refresh_always オプションの追加]

g:marching_enable_refresh_always オプションの追加を追加しました。
このオプションに 1 を設定するとキー入力を行うたびに更新処理を行うようになります。
例えば、'updatetime' が大きい場合、キー入力を行うたびに更新処理を行うようにしたり、補完ウィンドウが出ている状態で更新したい場合に有効です。
ただ、neocomplete.vim 周りとの兼ね合いもあるので、もしかしたらここら辺の仕様は今後変わる可能性があります。


と、いうような感じで改良しました。
キャッシュ周りはもうちょいなんかしたいけど、だいたいこんな感じかなーと。
その他、なにか問題や要望があれば Issues 等で教えてもらえると助かります。

[今後の予定]

  • スニペット(neosnippet)への対応
    • 関数等を補完した時にジャンプマークも一緒に挿入する
  • neocomplete.vim との連携
  • キャッシュの自動削除
    • include ファイルが変更された場合とか
  • スコープ(関数や namespace)を考慮したキャッシング
  • その他雑多な機能
    • キャッシングしないキーワードの設定とか