NeoBundleからvim-plugへ


## シンプルなのに強力なvim-plug

* NeoBundleの開発が中断されてDein.vimへの移行が推奨されていた。
* Dein.vimのプラグインの記入方法が好みではなかったので、以前から見ていたvim-plugへの引っ越しを決めた。
* 結果的には大満足。早いということは聞いていたが、何よりプラグインの記入方法が分かりやすくてとても気に入った。
* 60個以上のプラグインを設置するとき体感できるほどNeoBundleに比べて早かった。
* 起動するときの速度については[ここ](http://junegunn.kr/2014/07/vim-plugins-and-startup-time/)を参考。

## NeoBundle vs vim-plug

### 遅延読み込み（lazy loading、on-demand loading）

* NeoBundleの方はlazy loading、vim-plugの方はon-demand loadingと読んでいる。
* NeoBundleの場合はNeoBundleLazyを使って色んなオプションを付けられるが、場合によっては冗長になりやすい。
* NeoBundleの場合（コマンドで呼ばれたときに読み込む）

```vim
NeoBundleLazy 'scrooloose/nerdtree', {
\    'autoload': {
\      'commands': 'NERDTreeToggle'
\    }
\  }
```

* vim-plugの場合（コマンドで呼ばれたときに読み込む）

```vim
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
```

* NeoBundleの場合（ファイルタイプで呼ばれたときに読み込み）

```vim
NeoBundleLazy 'vim-ruby/vim-ruby', {
\    'autoload': {
\      'filetypes': 'ruby'
\    }
\  }
```

* vim-plugの場合（ファイルタイプで呼ばれたときに読み込み）

```vim
Plug 'vim-ruby/vim-ruby', { 'for': 'ruby' }
```

### 自動コンパイル（事前作業）

* NeoBundleの場合
 - buildのところにOS別にやりたいことを書く。

```vim
NeoBundle 'Shougo/vimproc.vim', {
  \ 'build' : {
  \     'windows' : 'tools\\update-dll-mingw',
  \     'cygwin' : 'make -f make_cygwin.mak',
  \     'mac' : 'make -f make_mac.mak',
  \     'unix' : 'make -f make_unix.mak',
  \    },
  \ }
```

* vim-plugの場合
  - dirがディレクトリ指定で、doのところにやりたいことを書く。

```vim
Plug 'Shougo/vimproc.vim', { 'dir': '~/.vim/plugged/vimproc.vim', 'do': 'make' }
```

### 遅延読み込みについて（補足）

* [ここ](https://github.com/junegunn/vim-plug#on-demand-loading-of-plugins)の内容を訳しただけだが、これぐらい分かれば大体やりたいことはできる。　

* 指定されたコマンドが実行されるときプラグインを読み込む。

```vim
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
```

* 複数のコマンドを指定する場合

```vim
Plug 'junegunn/vim-github-dashboard', { 'on': ['GHDashboard', 'GHActivity'] }
```

* 指定されたファイルタイプのファイルを開くときプラグインを読み込む。

```vim
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
```

* 複数のファイルタイプを指定する場合

```vim
Plug 'kovisoft/paredit', { 'for': ['clojure', 'scheme'] }
```

* コマンドとファイルタイプを両方指定する場合

```vim
Plug 'junegunn/vader.vim',  { 'on': 'Vader', 'for': 'vader' }
```

* プラグインが読み込まれるときやりたいことを記入する。

```vim
Plug 'Valloric/YouCompleteMe', { 'for': 'cpp' }
autocmd! User YouCompleteMe if !has('vim_starting') | call youcompleteme#Enable() | endif
```

## vim-plugだけの機能

### プラグインの状態を確認

* これを使えばプラグインがロードされているかどうかわかる。
* コマンドラインモードにてPlugStatusを実行する。

```vim
:PlugStatus
```

* 遅延読み込みのプラグインは（not loaded）がプラグイン名の横に表示される。
* vim-rubyやvim-railsなどはファイルタイプがrubyである場合のみ読み込まれるように書いた。

![PlugStatus01.png](https://qiita-image-store.s3.amazonaws.com/0/93752/4ebfe169-610d-461f-c42b-fafab30270fd.png "PlugStatus01.png")

* ファイルタイプがrubyであるファイルを開いた後、もう一度PlugStatusで確認すると今度はvim-rubyやvim-railsの横に（not loaded）の表示が消えた。

![PlugStatus02.png](https://qiita-image-store.s3.amazonaws.com/0/93752/fe365ba1-97ec-2a02-a9e4-f8225a5f5528.png "PlugStatus02.png")

### 変更履歴の表示

* 以前アップデートとの変更点を表示する。

```vim
:PlugDiff
```

![PlugDiff.png](https://qiita-image-store.s3.amazonaws.com/0/93752/f463d9f9-d414-cdc4-e01e-68d38968782f.png "PlugDiff.png")

### プラグインのスナップショット

* プラグインの現在のスナップショットを生成して復元に使える。
* スナップショットの生成

```vim
:PlugSnapshot [output path]
```

![PlugSnapshot.png](https://qiita-image-store.s3.amazonaws.com/0/93752/6ad1ee4b-201c-8f94-d2e5-1658e29c9533.png "PlugSnapshot.png")

* 復元

```vim
vim -S [output path]
```


## 感想

* NeoBundleを使っているときは書き方が面倒だったので遅延読み込みをあまり使っていなかったが、vim-plugで切り替えて積極的に使うようになった。
* .vimrcが以前より読みやすくなった。
* シンプルな上に、プラグインの状態の確認など有用な機能を提供している。

## 参考

* https://github.com/junegunn/vim-plug