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

  • 147
    Like
  • 0
    Comment
More than 1 year has 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. ぼくはない 

This post is the No.3 article of Vim Advent Calendar 2015