NeoBundleは @Shougoさんが作った Vim プラグイン管理マネージャです。
日本ではとても有名なプラグインで、日本語の紹介記事や設定例が大量にヒットします(みんな大好き NeoBundle!)。
流れに任せて、若しくは超絶便利だから(とりあえず1)使っておこう、というそこのアナタ、他にもたくさんプラグインマネージャがあるのでちょっとじっくり選んでみてはいかがでしょう。
Vim プラグインマネージャの小歴史
ここで有名な Vim プラグインマネージャのスター数と初コミット日時を見てみます。比較的よく目にするプラグインマネージャに絞っております。
ツール | 初コミット | スター数 | 実装言語 |
---|---|---|---|
pathogen | 2008/10/23 | 7,050 | VimL |
Vimana | 2009/07/19 | 188 | Perl |
VAM | 2009/12/27 | 466 | VimL |
Vundle | 2010/10/17 | 9,834 | VimL |
NeoBundle | 2011/09/17 | 1,743 | VimL |
vim-flavor | 2012/03/11 | 73 | Ruby |
vim-plug | 2013/09/10 | 3,022 | VimL |
※スター数は2015年11月18日(記事執筆時)現在のものです
Vundle 以降、人気が高いプラグインマネージャが多くリリースされていますね。また、みんな大好き NeoBundle は Vundle の影響を受けたプラグインのようです。
vim-plug
さて、今回の記事のメインである vim-plug です。割りと最近リリースされたにも関わらず、人気急上昇中のプラグイン管理マネージャですが、一体何が人気なのでしょう…?
ミニマル
Minimalist Vim Plugin Manager via vim-plug
おそらく、シンプルさが人気の秘訣のようです(私もそれに惹かれて NeoBundle から乗り換えました)。
以下は、プラグインマネージャの導入にあたり、.vimrc
に設定すべき項目の記述量の比較です。比較対象はプラグインマネージャ最大手 Vundle.vim です。
Vundle.vim | vim-plug |
---|---|
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'junegunn/seoul256.vim'
Plugin 'junegunn/goyo.vim'
Plugin 'junegunn/limelight.vim'
call vundle#end()
filetype plugin indent on
syntax enable
| call plug#begin('~/.vim/plugged')
Plug 'junegunn/seoul256.vim'
Plug 'junegunn/goyo.vim'
Plug 'junegunn/limelight.vim'
call plug#end()
|
見ての通り、vim-plug はシンプルですね。Vim script がよくわからない方でも plug#begin()
と plug#end()
に挟まれた箇所にプラグインを記述していき、plug#begin()
でインストールディレクトリの指定、くらいは直感でわかると思います。
並列
デフォルトでは最大16のスレッドで並列実行し、プラグインをインストールしていきます。
高速
NeoBundle 同様、遅延読み込み(Lazy
)が可能です。
作者ブログによるプラグインマネージャのベンチマーク結果が以下のようになっています。vim-plug は中でも割りと高速な部類に属するようです。
また、遅延読み込みを利用したときの結果が以下です。プラグインを利用しない(no-plugin)Vim の起動速度にだいぶ近づいていますね。これはよさそうな気がしてきました。
プラグインを入れ過ぎると Vim の起動速度が遅くなりがちです。遅延読み込みをさせたり、高速化のハックなどもあるようですが、一番手っ取り早く高速化するには、高速なプラグインマネージャを使ってしまえばいいということです。
ハック
ミニマルでファストなプラグインマネージャ vim-plug ですが、シンプルさゆえに他のプラグインマネージャから移行してきたときに「ん?」となることもあります。
vim-plug が提供する API は、
Function | Description |
---|---|
plug#begin(path) | Start vim-plug block |
plug#end() | End block, update &rtp, and load plugins when not vim_starting |
plug#helptags() | Regenerate help tags for all plugins |
plug#load(names...) | Load the plugins immediately |
上記、autoload 関数と
Variable | Type | Description |
---|---|---|
g:plug_home | String | Directory to store/load plugins. Set by plug#begin(path) call. |
g:plugs | Dict | Information of plugins. Initialized by plug#begin(path) and incrementally set by Plug commands. |
いくつかのグローバル変数(読み取り専用)しかありません。欲しい設定項目や機能があるならば、ユーザが自身で設定してやる必要があります。
例として、プラグインの存在確認をするための関数を定義してみます。vim-plug ではプラグインのリストがグローバル変数 g:plugs
に辞書として格納されているので、これをうまく利用します。
lets:plug = {
\ "plugs": get(g:,'plugs', {})
\ }
function!s:plug.is_installed(name)return has_key(self.plugs,a:name) ? isdirectory(self.plugs[a:name].dir) : 0endfunctionifs:plug.is_installed("vim-myplugin") " settingendif
このようにして設定を追加してやります。
もう一つ、NeoBundle から移行してきたときに NeoBundleCheck
相当のものがなく困りました。以前は .vimrc
にこれを記述しておき、新たにプラグインを追加したときに自動でインストールしていました。
function!s:plug.check_installation()if empty(self.plugs)returnendifletlist= []
for [name, spec] in items(self.plugs)if!isdirectory(spec.dir)call add(list, spec.uri)endifendforif len(list)>0let unplugged = map(list,'substitute(v:val, "^.*github\.com/\\(.*/.*\\)\.git$", "\\1", "g")') " Ask whether installing plugs like NeoBundleechomsg'Not installed plugs: ' . string(unplugged)ifconfirm('Install plugs now?',"yes\nNo",2)==1
PlugInstall
" Close window for vim-plugsilent!close " Restart vimsilent!!vim
quit!endifendifendfunction
augroup check-plug
autocmd!autocmdVimEnter * if!argc()|calls:plug.check_installation()|endif
augroup END
割とスムーズに欲しい機能が実装できました(Vim script 力があれば2 vim-plug に限らない話ですね)。逆にシンプルすぎて面倒かもしれませんが、都合よく言えば自分好みにチューニングすることができます。
最後に
本記事では vim-plug を紹介しました。
タイトルから読者の方は、「NeoBundle と vim-plug を比較して、NeoBundle はダメで vim-plug がいい」という内容に思われると思いますが、そういう趣旨の記事ではありません(ユーザのユースケースでどのプラグインマネージャが良いかなんて変わってきますし)。
しかし、大抵の人は高機能なものよりも、使い勝手の良いものを望む傾向が強い気がします。ハイスペックを望むのは一部のスペックに依存する人達のみということです。vim-plug は NeoBundle よりも後発で(比較すると)低機能ですが、スター数などでは上回っています。
個人的には vim-plug のミニマルさ、NeoBundle の高機能性、どちらも好きです。