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

この記事は[Vim その2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vim2)の17日目の記事です。

みなさんVimのプラグインマネージャには何をお使いでしょうか。
vim-plug、vim-jetpack、dpp.vim、volt、lazy.nvim、などなど、Vimのプラグインマネージャには色々種類がありますが、それぞれ自分のスタイルにあったものを用いていることと思います。[^1]

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

[^1]: スタイル、用途、場面によっては使わないこともあるでしょう。例えば、サーバのVimであればプラグインを入れずに使うので、そういった場合にはプラグインマネージャを入れません。

## 要約 (2024-01-07更新)

プラグインマネージャは、vim-plug、vim-jetpack、dein.vim、標準機能のうちいずれか、
どれか躓かずに使えたものがあれば、それを使えば大丈夫です。
プラグインマネージャ間で違うのは基本的に機能と速度のみで、使えるプラグインはどれでも同じです。

Neovimの場合、上記のプラグインマネージャに加え、
lazy.nvim、pckr.nvimなど、Luaで設定を書けるプラグインマネージャがあります。
自分のスタイルに合わせてこちらも検討するといいでしょう。

また、プラグインを使用しない場合はプラグインマネージャの導入は不要です。

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

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

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

それは標準のプラグイン管理機能が有するのはプラグインの読み込みの機能のみであること、検索、インストール、アップデート、削除といったことをする機能が搭載されていないこと、そういった機能+αを有するプラグインマネージャを利用したほうがプラグインの管理が楽になる、といったことが挙げられると思います。

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

[^2]: プラグインマネージャーの変遷については次の記事が詳しいです。[プラグインマネージャーの歴史と新世代のプラグインマネージャー dpp.vim](https://zenn.dev/shougo/articles/dpp-vim-beta)、[Vim 8.0用のプラグインマネージャを作ってみた話 #Vim - Qiita](https://qiita.com/k-takata/items/36c240a23f88d699ce86)。


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

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

違ってくる点は主に二つで、
一つは、遅延読み込み、キャッシュによる高速化、といった利用できる機能、
もう一つは、vimrcの設定による管理、コマンドによる管理、といった管理の仕方が変わります。

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

そのため、使うプラグインマネージャは好きなものを選ぶのがいいです。
一応、何もなければ導入のつまづきづらさ、使いやすさの点からvim-jetpackをおすすめしますが、個人的に気になっているもの、自分の趣味にあっているものがあれば、そちらを使うのがいいと思います。

[^3]: MercurialやSubversionなどの特定のVCSに対応しておらず、ダウンロードができないということが無いことも無いのですが、ほとんどのVimプラグインはGitHubからダウンロードできるため、滅多に困ることはありません。


### 利用できる機能

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

この辺りあまり網羅できていないと思いますが、
プラグインマネージャがやってくれる機能には次のようなものがあります。

- インストール/更新/削除
  - プラグインを一括でインストール/更新/削除します。
  - ものによっては並列でインストール/更新/削除をやってくれます。
- tagsの生成
  - helpを引くため使うtagsをインストール/更新時に自動で生成/更新します。
- リビジョンロック
  - インストール/更新するプラグインのバージョンを固定化します。
- 更新時フック
  - インストール/更新時に実行する処理を設定します。
- 遅延読み込み
  - プラグインを読み込むタイミングを設定し、起動時間の短縮を図ります。
- 条件読み込み
  - プラグインを読み込むかどうかを条件によって設定します。
- キャッシュ
  - プラグインの配置をキャッシュとしてまとめ、起動時間の短縮を図ります。
- プロファイル
  - 利用するプラグイン群をプロファイルとして保存し、利用するプラグイン群を切り替えられるようにします。
- 設定ファイルの切り出し
  - TOMLなどに設定ファイルを切り出し、設定をそちらで記述するようにします。


### 管理の仕方

プラグインマネージャによって、プラグインの管理の仕方も変わります。
ただ、これについては各プラグインマネージャ間である程度似通っており、大まかな分類をすることができます。

これはあくまで自分の考えた分類ですが、pathogen.vim系、Vundle系、vim-flavor系、GetLatestVimScripts系、Vimana系、dpp.vim系、Packer.nvim系といった風に分けられます。各分類ごとの大まかな特徴は次のようになります。[^4]

#### pathogen.vim系 ([標準機能](https://qiita.com/thinca/items/cdc0169e3bcc5a55a5ba)、[pathogen.vim](https://github.com/tpope/vim-pathogen)、...)

特定のディレクトリに配置されたプラグインを読み込みます。
基本的に管理するための設定は何も書きません。

#### Vundle系 ([vim-plug](https://github.com/junegunn/vim-plug)、[vim-jetpack](https://github.com/tani/vim-jetpack)、[dein.vim](https://github.com/Shougo/dein.vim)、[minpac](https://github.com/k-takata/minpac)、...)

vimrc等に設定を記述し、設定に沿ってプラグインを管理します。
管理のためのコマンドはVimの中で実行します。

#### vim-flavor系 ([vim-flavor](https://github.com/kana/vim-flavor)、[miv](https://github.com/itchyny/miv)、...)

Vimの外で設定を記述し、設定に沿ってプラグインを管理します。
管理のためのコマンドはVimの外で実行し、起動時に読み込むファイルを作成/更新します。

#### GetLatestVimScripts系 (...)

Vimの中でコマンドを実行し、プラグインを管理します。[^5]

#### Vimana系 ([volt](https://github.com/vim-volt/volt)、[pack](https://github.com/maralla/pack)、...)

Vimの外でコマンドを実行し、プラグインを管理します。

#### dpp.vim系 ([dpp.vim](https://github.com/Shougo/dpp.vim)、...)

管理方法からカスタマイズし、プラグインを管理します。

#### (Neovim限定) Packer.nvim系 ([lazy.nvim](https://github.com/folke/lazy.nvim)、[pckr.nvim](https://github.com/lewis6991/pckr.nvim)、[paq-nvim](https://github.com/savq/paq-nvim)、...)

Vundle系と似ていますが、こちらはLuaで設定を記述します。



あくまで主な側面で分類するとこうというだけで、またがって対応しているものもあります。例えば、vim-jetpackはlazy.nvim系のようにLuaで設定を記述することもできますし、dein.vimはTOMLファイルに設定を外出ししてプラグインを管理するといったことが可能です。また、minpacやvim-flavor、voltは標準のプラグイン管理機能に則ってプラグインを配置するようになっています。

[^4]: この記事を書いたときに考えた分類であり一般的なものではないです。各分類の分類名はその系統の元祖にあたると思われるプラグインマネージャの名前です。

[^5]: GetLatestVimScripts、Vimballが該当します。ただ、いずれもものとして古めなので、非推奨ということでリンクを載せていません。

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

選び方ですが特にありません。
趣味に合うものを使うのがよいかと。どれかつまづかずに使えたらそれで大丈夫です。
なぜかというと、利用するプラグインが少ない内は機能差・速度差はほとんど誤差であるためです。
加えて、凝った使い方をしていなければ、プラグインマネージャ間の移行も文字列置換だけで終わります。
ただ、開発が停止していたり、移行先が示されてたりする場合は、他や移行先をあたったほうがいいでしょう。

よく使われているものとしては次の4つでしょうか。

- vim-plug
- vim-jetpack
- dein.vim
- 標準機能

とりあえずプラグインマネージャを入れてみたいのであればvim-plugかvim-jetpackを、
プラグインを入れつつも起動速度を維持したいのであればdein.vimを[^6]、
利用するプラグインが数個程度、または管理する手段が別にあるのであれば標準機能をおすすめします。
Neovimを使っている場合はlazy.nvimやpckr.nvimを検討してもいいでしょう。

どうしても選ぶのに迷うのであれば、
プラグインマネージャの機能、読み込み速度、最終更新日時、更新頻度、利用者数を見たり、
誰が使っているのかを見たりするといいと思います。

[^6]: dein.vimの開発は終了していますが、dein.vimを使っている人も多いので、周りに使っている人がいる場合や、こちらを躓かず使えた場合、こちらを選んでいいと思います。dein.vimの後継としては、同作者によって新規に開発されているdpp.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が利用できないといった状況があれば、移行のパスとしてpathgen.vimを利用してもいいと思います。

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


このように、今はVimに標準のプラグイン管理機能が備わっているので、機能を最低限に絞れば簡単にプラグインマネージャを作れるようになっています。例えば、Bashを使っているのであれば、次のようなコードを~/.bashrcに書き足せば、自作プラグインマネージャの完成です。このプラグインマネージャは、vack install <リポジトリURL>でプラグインのインストール、vack remove <プラグイン名>でプラグインの削除、vack listでインストール済みプラグインの一覧表示ができます。

```bash
vack() {
    case $1 in
        i|install) git clone -- "$2" "$HOME/.vim/pack/vack/start/$(basename "$2")" ;;
        r|remove)  rm -rf -- "$HOME/.vim/pack/vack/start/$(basename "$2")" ;;
        l|list)    ls -- "$HOME/.vim/pack/vack/start" ;;
    esac
}
```

まとめ
------

プラグインマネージャはたくさんありますが、
どれか躓かずに使えたものがあればそれを使えば大丈夫です。