Edited at

Vimのプラグインマネージャの種類と選び方

この記事はVimのアドベントカレンダー(その2)の17日目の記事です。

みなさんVimのプラグインマネージャには何をお使いでしょうか。

dein.vim、vim-plug、volt、などなど、Vimのプラグインマネージャには色々種類がありますが、それぞれ各々の作業の仕方にあったものを用いていることと思います。1

そんなプラグインマネージャですが、標準のプラグイン管理機能がある今なぜ使われているのか、各プラグインマネージャはそれぞれ何が違うのか、色々種類がある中でどう選んだものか、といったことを当記事では紹介します。


プラグインマネージャを使う理由

まずプラグインマネージャを使う理由について。

VimにはAtomやVSCodeと同様、プラグイン管理機能が標準で搭載されているのに、なぜ改めてプラグインマネージャを導入するのか。

それは人によって異なりますが、主な理由としては、標準のプラグイン管理機能が何分まだ搭載されたばかりで、検索、インストール、アップデート、削除といったことをする機能が今のところ搭載されていないこと、そういった機能+αを有するプラグインマネージャを利用したほうがプラグインの管理が楽になるといったことが挙げられると思います。

プラグインマネージャ自体は標準にプラグイン管理機能が搭載される前から色々種類があり、あるものからあるものへと変遷を経ながらずっと利用されていました。非公式ではありましたが、特段困ることもなく2、プラグインを管理できており、プラグインはプラグインマネージャで管理するものとして普及していたと思います。Vim8になって標準で搭載された今も、世で使われているプラグインマネージャと機能や管理方法が異なるため、今日でも使われている、という感じですね。


プラグインマネージャによって違うもの

使うプラグインマネージャによって何が違うのか、

違ってくる点は主に二つで、

一つは、遅延読み込み、キャッシュによる高速化、といった利用できる機能、

もう一つは、vimrcの設定による管理、コマンドによる管理、といった管理の仕方が変わります。

逆に、利用できるプラグインはどのプラグインマネージャでも変わりません。3

そのため、使うプラグインマネージャは好きなものを選ぶのがいいです。

一応、何もなければvim-plugをおすすめしますが、個人的に気になっているものや自分の趣味にあっているものがあればそちらを使うのがいいと思います。


利用できる機能

プラグインマネージャの種類も色々ありますが、

プラグインマネージャが提供する機能も色々あります。

この辺りあまり網羅できていないと思いますが、

プラグインマネージャがやってくれる機能には次のようなものがあります。


  • インストール/更新/削除


    • プラグインを一括でインストール/更新/削除します。

    • ものによっては並列でインストール/更新/削除をやってくれます。



  • tagsの生成


    • helpを引くため使うtagsをインストール/更新時に自動で生成/更新します。



  • リビジョンロック


    • インストール/更新するプラグインのバージョンを固定化します。



  • 更新時フック


    • インストール/更新時に実行する処理を設定します。



  • 依存性解決


    • addon-info.jsonを読み込むなどしてプラグインが依存するプラグインもインストール/更新/削除するようにします。



  • 遅延読み込み


    • プラグインを読み込むタイミングを設定し、起動時間の短縮を図ります。



  • 条件読み込み


    • プラグインを読み込むかどうかを条件によって設定します。



  • キャッシュ


    • プラグインの読み込みをキャッシュ化し、起動時間の短縮を図ります。



  • プロファイル


    • 利用するプラグイン群をプロファイルとして保存し、利用するプラグイン群を切り替えられるようにします。



  • 設定ファイルの切り出し


    • TOMLなどに設定ファイルを切り出し、設定をそちらで記述するようにします。




管理の仕方

プラグインマネージャによってプラグインの管理の仕方も変わります。

ただ、これについては各プラグインマネージャ間である程度似通っており、大まかに分類することができます。

これはあくまで私見による分類ですが、pathogen.vim系、Vundle系、vim-flavor系、Vimana系といった風に分けられるのかなと。4

各分類ごとの大まかな特徴は次のようになります。


pathogen.vim系 (pathogen.vim、vim-unbundle、標準、...)

特定のディレクトリに配置されたプラグインを読み込みます。

基本的に管理するための設定は何も書きません。


Vundle系 (Vundle、VAM、neobundle.vim、vim-plug、dein.vim、minpac、...)

vimrc等に設定を記述し、設定に沿ってプラグインを管理します。

管理のためのコマンドはVimの中で実行します。


vim-flavor系 (vim-flavor、miv、...)

Vimの外で設定を記述し、設定に沿ってプラグインを管理します。

管理のためのコマンドはVimの外で実行し、起動時に読み込むファイルを作成/更新します。


Vimana系 (Vimana、VimJolts、volt、...)

Vimの外でコマンドを実行することによりプラグインを管理します。

 

あくまでメインの使い方で分類するとこうというだけで、またがって対応しているものもあります。例えばneobundle.vimではNeoBundleLocalを使うことでpathogen.vimと同じように使えますし、dein.vimではTOMLのファイルに設定を外出しして管理するといったことが可能です。また、minpacやvim-flavor、voltは標準のプラグイン管理機能に則ってプラグインを配置するようになっています。


プラグインマネージャの選び方

選び方ですが特に思いつかないですね。

趣味にあったものが使うのがよいかと。

ただ、開発が停止していたり、移行先が示されてたりする場合は他や移行先をあたったほうがいいと思います。

よく使われているものであれば次の3つでしょうか。


  • vim-plug

  • dein.vim

  • 標準

とりあえずプラグインマネージャを入れてみたいのであればvim-plugを、

プラグインを入れつつも起動速度を維持したいのであればdein.vimを、

利用するプラグインが少ない、または管理する手段が別にあるのであれば標準をおすすめします。


標準のプラグイン管理機能

Vim8からは標準機能としてプラグイン管理機能が搭載されています。

どういう機能なのかについては次の記事、マニュアルを読むのが確実かなと思います。

https://qiita.com/thinca/items/cdc0169e3bcc5a55a5ba

https://vim-jp.org/vimdoc-ja/repeat.html#packages

大まかに説明するとpackpathというオプションに設定されたディレクトリ群の中に次のような構造のツリーがあってその中に適切にプラグインが配置されていれば読み込まれるというものです。

pack

|
+- 任意の名前
|
+- start
| |
| +- 起動時に読み込まれるプラグイン1
| +- 起動時に読み込まれるプラグイン2
| +- ...
|
+- opt
|
+- 後から読み込めるプラグイン1
+- 後から読み込めるプラグイン2
+- ...

例)

~/.vim (Windowsなら~/vimfiles)
|
+- pack
|
+- dev
|
+- start
|
+- vim-quickrun
+- ale

(vim-quickrunとaleが起動時に読み込まれる)

optというディレクトリにプラグインを配置してpackaddで読み込める以外はpathogen.vimと同じように使えます。また、当のpathogen.vimもこの標準の配置に沿ってプラグインを配置してあればそれを読み込むようになっているので、何らかの事情でVim8が利用できないといった状況であれば移行のパスとして利用してもいいと思います。

注意する点として、pathogen.vimと同様、helpを引くためのtagsが自動では生成されない点に注意。:helptags ALL等としてtagsを生成する必要があります。


まとめ

今のところはプラグインマネージャを利用するのがいいと思いますが、標準のほうのプラグイン管理機能も今後充実していくと思われますので、整備されてきたら是非移行してみてください。





  1. また、プラグインを使わなければ使わないので使わない場合もあると思います 



  2. 検索や依存性の解決など気がかりなことが無かった訳でもないのですが 



  3. MercurialやSubversionなどの特定のVCSに対応しておらずインストールできないということが無いことも無いのですが、ほとんどのVimプラグインはGitHubからダウンロードできるためそこまで困ることはないはずです 



  4. この記事を書く途中に決めた分類名であり一般的なものではないです