neobundle.vim で github の C++ ライブラリを管理する

この記事は Vim Advent Calendar 2012 149日目の記事になります。


さて、最近では C++ のライブラリも git や svn で公開・開発されている事が多くなってきたと思います。
これらのライブラリを使用する場合は git clone でリポジトリを落としてきたり git pull で更新したりするのですがライブラリごとにいちいちそういう事をするのは手間です。
と、いう事で Vimプラグイン管理を行う neobundle.vimC++リポジトリも管理してみます。
neobundle.vimVimプラグイン以外の用途でも利用する事が出来ます。

[:NeoBundleFetch を使用する]

neobundle.vim は通常、:NeoBundle コマンドを使用してプラグインを runtimepath へと追加します。
しかし、今回扱うのは Vim プラグインではないので runtimepath へと追加する必要はありません。
そこで :NeoBundle ではなくて :NeoBundleFetch コマンドを使用します。
:NeoBundleFetch を使用すると runtimepath へと追加は行われません。
例えば、Sprout を管理する場合は次のような設定になります。

NeoBundle "bolero-MURAKAMI/Sprout"
" インストール
" NeoBundleInstall Sprout


これで他の Vim プラグインなんかと同じように Vim 上からインストールしたり更新を行う事が出来ます。
ただひとつ違うのは runtimepath に追加されるかどうかですね。

[ちょっと改良する]

さて、ライブラリを更新したりするのは上記のままでも問題はないのですが C++ のライブラリとしては neocomplcache のインクルード時ヘッダーファイルパスを補完したり、clang_complete で利用したいです。
と、いうことで自動的に l:path へとインクルードディレクトリを追加するようなラッパーを書いてみました。

" 保存ディレクトリ
let g:cpp_library_directory = "D:/cpp/neobundle"

function! s:neobundle_cpp(name, ...)
    let option = get(a:, 1, {})
    let base = {
\       "base" : g:cpp_library_directory,
\       "description" : "cpp-libraries",
\       "include_dir" : get(option, "include_dir", "")
\   }
    let bundle = neobundle#config#fetch_bundle(string(a:name) ."," . string(extend(base, option)))
endfunction

" C++ のライブラリを管理する
" :Unite neobundle -input=cpp-libraries
command! -nargs=1
\   NeoBundleCpp
\   call s:neobundle_cpp(<args>)


NeoBundleCpp "bolero-MURAKAMI/Sprout"
NeoBundleCpp "sabel83/mpllibs"

" インクルードパスをリポジトリからの相対パスで設定したり
NeoBundleCpp "grafikrobot/boost-predef", { "include_dir" : "/include" }
NeoBundleCpp "himura/p-stade", { "include_dir" : "/pstade" }

" svn から clone したり
NeoBundleCpp "http://svn.boost.org/svn/boost/sandbox/type_erasure/"

" リビジョンを指定してみたり
NeoBundleCpp "cpp-netlib/cpp-netlib", {
\   "rev" : "0.9-devel"
\}

" filetype=cpp 時に path に追加する
" path に追加すれば
" neocomplcache で include 時にヘッダーファイルパスを補完
" clang_complete
" などで利用する事が出来る
\autocmd FileType cpp
\   let &l:path = &l:path . "," . join(map(filter(neobundle#config#get_neobundles(), "v:val.description ==# 'cpp-libraries'"), "v:val.path . v:val.include_dir"), ",")


こんな感じで保存するディレクトリを通常の Vimプラグインとは別にしたり、インクルードディレクトリを指定したりできます。
また filetype=cpp 時には l:path へとインクルードディレクトリを追加します。
便利んですね。


neobundle.vim を使ったことがある人は知っていると思いますが git 以外にも svnMercurial に対応していたり、リビジョンも設定する事が出来ます。
あとわたしは使用していないんですが neobundle.vim で更新時に自動的にビルドして lib や dll を出力するといったことも出来ます。
自動ビルドは実際に vimproc とかで利用されていますね。
そんな感じで C++ に限らないんですが Vim 以外でも github を利用している方は、こういう neobundle.vim の使い方をしてみるのも面白いと思います。