Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

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

$
0
0

NeoBundle@Shougoさんが作った Vim プラグイン管理マネージャです。

日本ではとても有名なプラグインで、日本語の紹介記事や設定例が大量にヒットします(みんな大好き NeoBundle!)。

流れに任せて、若しくは超絶便利だから(とりあえず1)使っておこう、というそこのアナタ、他にもたくさんプラグインマネージャがあるのでちょっとじっくり選んでみてはいかがでしょう。

Vim プラグインマネージャの小歴史

ここで有名な Vim プラグインマネージャのスター数と初コミット日時を見てみます。比較的よく目にするプラグインマネージャに絞っております。

ツール初コミットスター数実装言語
pathogen2008/10/237,050VimL
Vimana2009/07/19188Perl
VAM2009/12/27466VimL
Vundle2010/10/179,834VimL
NeoBundle2011/09/171,743VimL
vim-flavor2012/03/1173Ruby
vim-plug2013/09/103,022VimL

※スター数は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 は、

FunctionDescription
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 関数と

VariableTypeDescription
g:plug_homeStringDirectory to store/load plugins. Set by plug#begin(path) call.
g:plugsDictInformation 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 の高機能性、どちらも好きです。


  1. (Shougo ware だし...) 

  2. ぼくはない 


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>