この記事は、vimをIDEとして利用するための方法を記述していく連載、Vim as IDEの第1回です。この回では、vimで多くのプラグインを管理する場合に必須とも言えるパッケージマネージャー、NeoBundleについて解説します。
#NeoBundleとは何か
Neobundleは暗黒美夢王たるShougoさんによって作られた、vimプラグインのパッケージマネージャーです。Neobundleを導入することにより、下記の様なメリットを享受することが出来ます。
- .vimrcに一行追記するだけで各種有益vimプラグインを導入することができるようになる。
- :NeoBundleUpdateコマンドを実行するだけで全プラグインを最新版にアップデートすることができる。
- 後述するNeoBundleLazyを利用することにより、起動時に必要なプラグインのみを読み込ませることで多数のプラグインを利用する場合でも起動を高速化できる。
というわけで、多数のvimプラグインを導入する場合はマストで入れておきたいプラグインです!
#NeoBundleのインストール
NeoBundleは下記の手順で導入することが出来ます。
- プラグイン管理用のbundleディレクトリを作成
- 作成したディレクトリに、gitからNeobundleをチェックアウト
具体的には、下記のコマンドで導入出来ます。お手軽ですね。
$ mkdir -p ~/.vim/bundle
$ git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
#プラグインのインストール方法
NeoBundleの導入が完了したら、:NeoBundleInstallコマンドによるプラグインのインストールが可能になります。
例えば、vim上でファイルを閲覧するためのプラグインvimfilerをインストールする場合、まず下記を.vimrcに追記しvimを再起動します。
if has('vim_starting')
" 初回起動時のみruntimepathにneobundleのパスを指定する
set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
" NeoBundleを初期化
call neobundle#begin(expand('~/.vim/bundle/'))
" インストールするプラグインをここに記述
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/vimfiler'
call neobundle#end()
" ファイルタイプ別のプラグイン/インデントを有効にする
filetype plugin indent on
neobundle#beginはNeobundleを初期化するための関数です。引数には、先ほど作成したbundle管理用のディレクトリを指定します。「~/.vim/bundle/」以外のパスでプラグインを管理したいという場合は適宜変更してください。「~/.vim/bundle/」でプラグインを管理する場合は、引数のデフォルト値も同様の値となってるので、引数を省略してneobundle#begin()と書くことも出来ます。
また、NeoBundleの後に続いて書かれているパスはgithub上でのリポジトリの場所です。ここではよく"Shougo"という文字が現れますが、これはプレフィックスとして必要な文字というわけではなく、単にShougoさんが有益プラグインを大量に作ってくれているためです。感謝しましょう。
「filetype plugin indent on」は、Ruby/PHPなどのファイルタイプを検出しファイルタイプ別のプラグインやインデントを有効にする処理です。この位置まではプラグインのロードが完了していないので、このタイミングで記述します。
次に、ノーマルモード時に: NeoBundleInstallコマンドを入力することで、先ほど作った~/.vim/bundleディレクトリ内にunite.vimがダウンロードされ、読み込まれます。
:NeoBundleInstall
無事インストールが完了すれば、:VimFilerコマンドを入力することでファイラーが起動するはずです。
プラグインのアップデートを行う
:NeoBundleUpdateコマンドを実行することにより、最新版があるプラグインはアップデートを実施することが出来ます。また、下記のように記述することで特定のプラグインのみをアップデートすることも可能です。インストールの指定時と違って、リポジトリのパスではなくプラグイン名のみを指定していることに注意してください。Shougo/vimfilerではなくvimfilerだけでOKです。
:NeoBundleUpdate vimfiler
プラグインの削除を行う
.vimrcからNeoBundle XXXの記述を消し、NeoBundleCleanコマンドを実行することでプラグインの削除を行うことが出来ます。こちらも、引数にプラグイン名を指定することにより特定のプラグインのみ削除することが可能です。先ほどインストールしたVimfilerを削除する場合は、.vimrcからNeoBundle 'Shougo/vimfiler'を削除し、下記のコマンドを実行します。
:NeoBundleClean vimfiler
vim起動時に未インストールプラグインを自動でインストールする
NeoBundleCheckコマンドを.vimrcに記述しておけば、わざわNeoBundleInstallコマンドを叩かなくともvim起動時に未インストールプラグインがあった場合は対話的にインストールしてくれます。
call neobundle#end()
" NeoBundleCheck を走らせ起動時に未インストールプラグインをインストールする
NeoBundleCheck
" ファイルタイプ別のプラグイン/インデントを有効にする
filetype plugin indent on
NeoBunlde自体のリポジトリをNeoBundleで管理する
通常、NeoBundleで読み込んだプラグイン達へのパスはruntimepath(読み込むべきプラグイン達のパスを格納した変数)に追加されます。しかし、vimプラグインでないリポジトリをNeoBundleを利用して管理したいという場合もあります。
このようなケースでは、NeoBundleFetchコマンドを利用することにより、runtimepathにパスを追加することなく対象リポジトリをNeoBundleで管理することが出来ます。また、このNeoBundleFetchはNeoBundle自身をNeoBundleで管理するためにも使うことが出来ます。例えば、下記のように記述することでNeoBundle自体の最新版が配布されたとき、:NeoBundleUpdateで更新することができるようになります。
" NeoBundleを初期化
call neobundle#begin(expand('~/.vim/bundle/'))
" NeoBundleをNeoBundle自体で管理する
NeoBundleFetch 'Shougo/neobundle.vim'
アンチパターンとして、下記の様に他のリポジトリと同じ形で記述するとうまく動作しない場合があるので気をつけてください。
" !!!注意!!! うまく動作しない場合がある記述法
NeoBundle 'Shougo/neobundle.vim'
[ref] http://d.hatena.ne.jp/osyo-manga/20140512/1399901014
NeoBundleLazyでプラグインを遅延ロードする
NeoBundleは非常に便利で強力なプラグイン管理機構ですが、それがゆえに調子に乗ってプラグインを入れすぎて、vimの起動が遅くなってしまうという悲しい状況もあり得ます。そこで、特定の状況になるまでプラグインのロードを遅延させることができるのが、NeoBundleLazyです。基本的には、NeoBundleをNeoBundleLazyに置き換え、下記のように記述することで特定の状況になるまでロードを遅延させることが可能になります。
NeoBundleLazy 'Shougo/vimfiler', {
\ 'autoload' : { 'commands' : [ 'VimFiler' ] },
\ }
上記の例では、VimFilerというプラグインを、:VimFilerコマンドを叩いて起動させるまでは読み込みを行わない、という指定になります。このように、普段は使わないプラグイン、特定の状況のみ利用するプラグインを遅延ロードさせることで、大量のプラグインを管理していてもvimの起動を高速化することが可能になります。
例えば、rubyを書くときのみvim-rubyというプラグインを利用したい、というケースでは下記のように記述することで遅延ロードさせることが出来ます。
" rubyでのみvim-rubyを読み込む
NeoBundleLazy 'vim-ruby/vim-ruby' ,{
\ "autoload" : {"filetypes" : ["ruby"]}
\}
NeoBundleについての解説はここまでです。さらに知りたい場合は、公式のリポジトリの解説やIssuesを見るのが良いでしょう。
https://github.com/Shougo/neobundle.vim
連載第2回では、vim 用の統合ユーザインターフェースunite.vimについての記事を書く予定です。