marching.vim に wandbox を使用したコード補完の実装を追加してみた

何かと話題の wandbox なのですが、その wandbox の API を利用したコード補完の実装を marching.vim に追加してみました。
Vim から wandbox へ補完を行うコードを投げ、wandbox 側でコード補完の処理を行ってもらう事によりローカルに Clang の環境がなくてもコード補完を行うことができます。
ただし、wandbox を使用する関係上、ローカルのヘッダーファイルなどは使用することはできません。
逆に言えば wandbox で動作するコードであれば問題なく利用する事ができます。
(boost や sprout など。

[プラグイン]

NeoBundle "osyo-manga/vim-marching"


wandbox の実装を使用する場合は他に依存するプラグインはありません。
ただし、外部コマンドとして curlwget が必要になります。

[設定]

" wandbox を使用するための設定
let g:marching_clang_command = ""
let g:marching_backend="sync_wandbox"

" wandbox へ渡されるオプション
let g:marching_clang_command_option = "-std=gnu++1y"


" 補完ワードをカーソル位置に挿入しないで使用する場合
imap <C-x><C-o><Plug>(marching_start_omni_complete)

" キャッシュをクリアしてから再度補完する
imap <C-x><C-x><C-o> <Plug>(marching_force_start_omni_complete)


" 複数の補完ワードがあった場合に 0 が設定されていれば1つのみ表示する
let g:marching_enable_dup = 1


" 通信のタイムアウトを秒数で設定
let g:marching#sync_wandbox#timeout = "10"


" インクルードパスを設定
" Linux 環境では以下のような設定例
let g:marching_include_paths = filter(
\   split(glob('/usr/include/c++/*'), '\n') +
\   split(glob('/usr/include/*/c++/*'), '\n') +
\   split(glob('/usr/include/*/'), '\n'),
\   'isdirectory(v:val)')


" neocomplete.vim と併用する為の設定
let g:marching_enable_neocomplete = 1
if !exists('g:neocomplete#force_omni_input_patterns')
    let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_omni_input_patterns.cpp =
    \ '[^.[:digit:] *\t]\%(\.\|->\)\w*\|\h\w*::\w*'

[使い方]

補完を行いたい箇所で を行うと補完が開始されます。
この時に wandbox と通信を行うのでやや時間がかかりますが、利用できないレベルではないと思います。
あと通信に関係なく boooost するようなコードであればそれなりに時間はかかります。
標準ライブラリレベルであれば大丈夫だと思いますが…。
補完をキャンセルしたい場合は して下さい。


また、2回目以降に同じワードで補完する場合、前回の結果を流用するので高速です。
(ただし、この時に判定するコンテキストは完璧ではないので誤爆する可能性があります。
キャッシュを削除する場合は (marching_force_start_omni_complete) や :MarchingBufferClearCache などを利用して下さい。


と、いう感じで『面白そうなのでやってみたかった』という理由で実装してみたんですが思ったよりも実用的になりそうです。
wandbox の処理速度が早い…!
まぁそもそもローカルで clang が使えるのであればそれを利用した方がよいのですが、Windows など clang を導入するのが難しい環境で利用したい場合はだいぶよさげですね。
ただ、補完するたびに wandbox へと処理を投げるので負荷が心配…。
もっと悪魔的な事を使用とも思ったのですがさすがに怒られそうなのでやめておきました