Humanity

Edit the world by your favorite way

Vim 8 時代のがんばらないプラグイン管理のすすめ

これは Vim Advent Calendar 2017 の20日目の記事です。


皆さん Vim しておられるでしょうか。 Yes と答えた方、プラグインマネージャーは使っていますか?

巷では Vimプラグイン管理にはプラグインマネージャーを入れる必要があるかのような勢いで「まずプラグインマネージャーを入れる」といった記事が沢山ありますが、 個人的にはプラグインマネージャーより Vim 標準で使える パッケージ機能 をまず試してみてほしいです。

この機能はざっくり言うと「ディレクトリ以下に置いたプラグインを読み込む」ほぼそれだけですが、必要十分な機能は揃っていると思います。 またちょっとの工夫であなたの使っているプラグインマネージャーの機能も代替できるかもしれません。 もしかしたらプラグインマネージャーほどの多機能さは必要ないことに気付くかもしれませんよ?

本記事ではそんな多機能は求めてない方やミニマリストの方におすすめなパッケージ機能に関して、Vim 8 リリースから1年経った今だからこそ紹介します。

必須環境

Vim 8 リリースは 2016年9月12日なので、もしかしたらすでにインストール済みの Vim が 8 だったという方もいるでしょう。 Vim 8 は Vim プラグイン開発に便利な機能がかなり沢山追加されました。 そのためすでに Vim 8 以降でしか使えない機能を使ったプラグインが多数公開されていますので、 ぜひアップグレードすることをお勧めします。

パッケージ機能のススメ

まずはパッケージ機能について解説します。 と思ったのですが既に id:thinca さんがパッケージ機能についての解説記事を書いてくれているのでそちらをご参照ください。

Vim 8.0 Advent Calendar 6 日目 パッケージ - Qiita

要約すると

このようにパッケージ機能はとても基本的な機能しか提供しません。 しかしこれだけでプラグイン管理に必要な大体の機能は揃っています。

例えば上記ディレクトリを作ってプラグインgit clone 等でダウンロードすれば それだけでプラグインが起動時に読み込まれるということです。

$ mkdir -p ~/.vim/pack/mypackage/start/
$ cd ~/.vim/pack/mypackage/start/
$ git clone ...

そう、Vim 8 なら無理にプラグインマネージャーを使わずとも簡単にプラグインを読み込めるのです。 更新するのだって簡単で、プラグインリポジトリgit pull すればいいだけです。

私が既存のプラグインマネージャーで疑問に感じている点として、yum や apt といった OS のパッケージマネージャではコマンドラインからコマンド一発でインストールできるのに、なぜ現在多くの Vim プラグインマネージャではわざわざインストールするのに vimrc を変更してインストール、という2ステップが必要なのか?というのがあります。 それにプラグインを削除する時は vimrc の記述や、(もし書いてたら)プラグインの設定も同時に削除しなければなりません。 なんだか管理を余計に複雑にしていませんか?

パッケージ機能で不十分な点

ここまで読んで「自分にとってはパッケージ機能で十分だ」と感じた人もいるでしょう。 しかしパッケージ機能だけでは足りない点がいくつかあります。 例えば次のような機能です。

  1. プラグインのバージョンを固定したい
    • 別 PC で全く同じ環境を手間なく復元したい
  2. 一括アップデートしたい
  3. 遅延ロードしたい
    • 特定のファイルタイプ設定時や Ex コマンドを実行したタイミングでプラグインをロードしたい

これらの問題を解消するためにはプラグインマネージャーを使う必要があるでしょう。 私は現在 Volt と呼ばれるコマンドラインから扱う Go 製の Vim プラグインマネージャー *1 を開発中で、上記の問題点はもちろん全て解決されています。

github.com

しかし本記事では引き続きプラグインマネージャーではなく、あえて Vim 標準のパッケージ機能と運用の工夫のみ上記の問題を解消する方法について解説します。

Git で設定ファイルとプラグインを管理する

まず、vimrc とプラグインを Git submodule で管理する方法を解説します。 これにより Vim プラグインを特定のバージョンにロックすることができ、いつでもどこからでも git clone --recursive で .vim ディレクトリを持ってこれるようになります。

  1. ~/.vim を Git で管理する
  2. プラグインを git submodule で管理する
  3. リポジトリGitHub で公開する

~/.vim を Git で管理する

既に管理してる方も多いとは思いますが、まずは ~/.vim ディレクトリを Git で管理します。 今回は ~/.vim ディレクトリそのものを Git リポジトリ化してしまいましょう。 ちなみに私は dotfiles というディレクトリにホームディレクトリの設定ファイル・ディレクトリを突っ込んで管理しています (~/.vim には symlink を貼っています)。

$ cd ~/.vim
$ git init

以下はお好みで管理対象を変えてください。
今回は手抜きで全部突っ込みます。

$ curl -L https://raw.githubusercontent.com/github/gitignore/master/Global/Vim.gitignore -o .gitignore
$ git add -A
$ git commit -m 'Initial commit'

プラグインを git submodule で管理する

submodule として Vim プラグインを追加します。 以下は caw.vim を追加する例です。 pack/mypackage/start/caw.vimmypackagecaw.vim は自由に変えて構いません。

$ cd ~/.vim
$ mkdir -p pack/mypackage/start
$ git submodule add https://github.com/tyru/caw.vim pack/mypackage/start/caw.vim
$ git commit -m 'Add caw.vim plugin'

リポジトリGitHub で公開する

リポジトリを作成する方法については沢山記事があるのでググってください。

一括アップデート

管理している Vim プラグインをリモートの最新版に更新するには、

$ git submodule foreach git pull
$ git commit -a -m 'Update all vim plugins'

とします。

git commit しないと次回 git clone --recursiveリポジトリを持ってきた時に古いバージョンのままなので、ちゃんとコミットしておきましょう。

filetype や Ex コマンド実行時に初めてプラグインをロードする (遅延ロード)

本項ではプラグインの遅延ロードをパッケージ機能で実現する方法を解説します。

遅延ロードとは?

dein.vim などのプラグインマネージャーには特定のファイルタイプになった時や特定の Ex コマンドを実行した時に初めてプラグインをロードする機能があります。 これによって

が期待できます。

パッケージ機能での遅延ロード

パッケージ機能でこれを行うには

  1. ~/.vim/pack/mypackage/opt/ ディレクトリに入れ、
  2. 任意の FileType イベントや CmdUndefined イベントで :packadd を実行します
    • FileType イベント:ファイルタイプ設定時
    • CmdUndefined イベント:Ex コマンド実行時にコマンドが見つからなかった場合

すると :packadd によりプラグインがロードされます。

例がないと分かりにくいと思うので、例を載せます。 以下は vimrc に記載する例です。

function! s:config_fugitive()
  " プラグインの設定
  
  " プラグインのロード
  packadd vim-fugitive
endfunction

augroup lazy-load
  autocmd!
  autocmd FileType vim call s:config_xxx()
augroup END

冒頭で言ったプラグインと vimrc を二重管理しなきゃならないという負担は増えますが、標準のパッケージ機能でできるという点は強みでしょう。

ちなみに Volt では上記と同じような設定を自動的にインストールすることで遅延ロードを実現しています(~/.vim/pack/volt/ 以下のファイルを見てみると仕組みが分かると思います)。

未承諾広告】Volt の紹介

ちなみにここで紹介した方法をもっと手軽にやりたい方はぜひ Volt を試してみてください。

プラグインの管理はもちろん、プラグインの設定を個別のファイルに書けたり(一時的に無効化したりアンインストールする時に楽です)、プロファイルと呼ばれる機能により複数の ~/.vim の環境を使い分ける事が驚くほど簡単になったり、他にも様々な機能があります。

後ほどまた記事を書く予定ですが、興味があったらぜひ使ってみてください。

*1:後々 Vim からもシームレスに扱えるようにする予定です