VimDay 3

おい、NeoBundle もいいけど vim-plug 使えよ

More than 3 years have passed since last update.

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

さて、今回の記事のメインである vim-plug です。割りと最近リリースされたにも関わらず、人気急上昇中のプラグイン管理マネージャですが、一体何が人気なのでしょう…?


ミニマル


:hibiscus: 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 に辞書として格納されているので、これをうまく利用します。


プラグインがインストールされているかどうか

let s:plug = {

\ "plugs": get(g:, 'plugs', {})
\ }

function! s:plug.is_installed(name)
return has_key(self.plugs, a:name) ? isdirectory(self.plugs[a:name].dir) : 0
endfunction

if s:plug.is_installed("vim-myplugin")
" setting
endif


このようにして設定を追加してやります。

もう一つ、NeoBundle から移行してきたときに NeoBundleCheck 相当のものがなく困りました。以前は .vimrc にこれを記述しておき、新たにプラグインを追加したときに自動でインストールしていました。


未インストールプラグインを検知してインストール

function! s:plug.check_installation()

if empty(self.plugs)
return
endif

let list = []
for [name, spec] in items(self.plugs)
if !isdirectory(spec.dir)
call add(list, spec.uri)
endif
endfor

if len(list) > 0
let unplugged = map(list, 'substitute(v:val, "^.*github\.com/\\(.*/.*\\)\.git$", "\\1", "g")')

" Ask whether installing plugs like NeoBundle
echomsg 'Not installed plugs: ' . string(unplugged)
if confirm('Install plugs now?', "yes\nNo", 2) == 1
PlugInstall
" Close window for vim-plug
silent! close
" Restart vim
silent! !vim
quit!
endif

endif
endfunction

augroup check-plug
autocmd!
autocmd VimEnter * if !argc() | call s: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 の高機能性、どちらも好きです。





  1. (Shougo ware だし...) 



  2. ぼくはない