自作プラグインを neobundle.vim で管理する

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

[追記]

色々とコードを修正しました。


昨日 LingrVim 部屋で
「neobundle.vim で自作プラグインの管理はどうするのか」
みたいな話が出ていたので今回はわたしが行っている管理方法の紹介でもしてみたいと思います。

[保存ディレクトリ]

neobundle.vim で管理しているプラグインは基本的には neobundle#rc({dir}) で設定したディレクトリに保存されます。

call neobundle#rc(expand($HOME."/neobundle"))

" $HOME."/neobundle" にプラグインファイルが保存される
NeoBundle "Shougo/vimproc.vim"
NeoBundle "Shougo/unite.vim"
NeoBundle "Shougo/vimfiler.vim"
NeoBundle "Shougo/vimshell.vim"


しかし、自作プラグインは他のプラグインとは別の場所に保存したい事があると思います。
(e.g.自作プラグインDropbox の中に放り込みたい
その場合は :NeoBundle 時に個別に保存するディレクトリを指定する事ができます。

call neobundle#rc(expand($HOME."/neobundle"))

" $HOME."/neobundle" にプラグインファイルが保存される
NeoBundle "Shougo/vimproc.vim"
NeoBundle "Shougo/unite.vim"


" "base" で指定したディレクトリに保存・読み込みが行われる
NeoBundle "vim-marching", {
\   "base" : "C:/Dropbox/vim/plugin"
\   "type" : "nosync"
\}
NeoBundle "vim-operator-search", {
\   "base" : "C:/Dropbox/vim/plugin"
\   "type" : "nosync"
\}


これで自作プラグインに対して保存してあるディレクトリを指定する事ができます。

[:NeoBundleUpdate で更新されないようにする]

自作プラグインの場合、:NeoBundleUpdate での更新はほとんど意味がありません。
"stay_same" を設定しておくと :NeoBundleUpdate で更新が行われないようにする事ができます。
また、:NeoBundleUpdate! でも更新されないようにする場合は、"type" : "nosync" を設定しておくとよいでしょう。

call neobundle#rc(expand($HOME."/neobundle"))

" $HOME."/neobundle" にプラグインファイルが保存される
NeoBundle "Shougo/vimproc.vim"
NeoBundle "Shougo/unite.vim"


" :NeoBundleUpdate で更新されないが
" :NeoBundleUpdate! では更新される
NeoBundle "vim-marching", {
\   "base" : "C:/Dropbox/vim/plugin",
\   "stay_same" : 1,
\}

" :NeoBundleUpdate! でも更新されない
NeoBundle "vim-operator-search", {
\   "base" : "C:/Dropbox/vim/plugin",
\   "type" : "nosync"
\}


自作プラグインの場合は "type" : "nosync" を設定しておくとよいと思います。

[自作プラグイン用のコマンドを定義する]

さて、自作プラグインは上記のような設定を使用するとよいでしょう。
しかし、:NeoBundle するたびにオプションを設定するのは手間です。

" 同じ設定が続くのは無駄
NeoBundle "vim-operator-search", {
\   "base" : "C:/Dropbox/vim/plugin",
\   "type" : "nosync"
\}


NeoBundle "vim-watchdogs", {
\   "base" : "C:/Dropbox/vim/plugin",
\   "type" : "nosync"
\}


NeoBundle "vim-reanimate", {
\   "base" : "C:/Dropbox/vim/plugin",
\   "type" : "nosync"
\}


NeoBundle "unite-qfixhowm", {
\   "base" : "C:/Dropbox/vim/plugin",
\   "type" : "nosync"
\}


NeoBundleOrigin "vim-textobj-multiblock", {
\   "base" : "C:/Dropbox/vim/plugin",
\   "type" : "nosync"
\}


こういう場合はコマンドを定義するとよいでしょう。

command! -nargs=1
\   MyNeoBundle
\   NeoBundle <args>, {
\       "base" : "C:/Dropbox/vim/plugin",
\       "type" : "nosync",
\   }

MyNeoBundle "vim-operator-search"
MyNeoBundle "vim-watchdogs"
MyNeoBundle "vim-reanimate"
MyNeoBundle "unite-qfixhowm"
MyNeoBundle "vim-textobj-multiblock"


これでだいぶスッキリしました。
また、個別に lazy や autoload などのオプションを設定するのであれば次のようなコマンドの方がよいでしょう。

function! s:neobundle_origin(name, ...)
    let base_option = {
\       "base" : "C:/Dropbox/vim/plugin",
\       "type" : "nosync",
\   }
    let option = extend(base_option, get(a:, 1, {}))
    execute "NeoBundle" string(a:name) "," string(option)
endfunction
command! -nargs=*
\   MyNeoBundle
\   call s:neobundle_origin(<args>)


" "lazy" : "1" であれば :NeoBundleLazy で定義する
NeoBundleOrigin "vim-euphoric_player", {
\   "lazy" : 1,
\   'autoload' : {
\       "unite_sources" : ["euphoric_player_playlist", "euphoric_player_tracks"],
\   }
\}

NeoBundleOrigin "vim-sugarpot", {
\   "layz" : 1,
\   'autoload' : {
\       'commands' : [
\           {
\               "name" : "SugarpotPreview",
\               "complete" : "file",
\           }
\       ]
\   }
\}


と、いうような感じで自作プラグインを使用する場合にも neobundle.vim を活用してみるとよいと思います。