アニメ化決定! すべての Vim プラグインマネージャーは道を譲れ!!!!!!


2012年 04月 01日

問題

一旦Vimがメキメキと使えるようになるとプラグインもバリバリと導入したくなります。
最初は数個のプラグインを試しに使っているだけだったのが、
時を経るにつれて数多のプラグインを使うようになってくるものです。

こうなると問題になるのはプラグインの管理です。
数が増えてくると新しいものをインストールするのもインストール済みのものを新しいバージョンに更新するのも億劫になります。

そこで必要になるのが Vim プラグインを管理するためのツールです。
この手のツールは2008年8月に公開された vim-pathogen が最古だと思われますが、
とりわけ民衆に認知され始めたのは YAPC::Asia 2009 で発表 された
Vimana からだと思います。

この手の Vim プラグインマネージャーは既にいくつかの実装が存在するものの、いずれも欠点が存在します。

考察

全ての設定、特に使用する プラグインのバージョン もバージョン管理システムの配下に置かれるべきです。
既存の実装は全て使用するプラグインのバージョンを管理しません。
これは 複数の異なる環境で同一の設定を使用することが不可能 ということです
(唯一の例外は vim-pathogen
Git のサブモジュール等と併用することですが、
数多のプラグインをサブモジュール等で手動管理するのは骨が折れます)。

プラグインが依存するプラグインを自動でインストールできるよう、
プラグインの依存関係を適切に記述する標準的なフォーマットもあるべきです。
既存の実装のほぼ全てが依存関係の自動解決できません
(唯一の例外は
vim-addon-manager
ですが、これはプラグインが要求するバージョンを記述できません。
例えば他のプラグインから利用されるあるプラグインで過去のバージョンとは非互換な変更があった場合、
利用側が新バージョンに対応したものになるまでは非互換なバージョンはインストールすべきではありませんが、
これを自動でインストールしてしまう可能性があります)。

あらゆるソフトウェアには十分かつ再現可能なテストが含まれているべきです。
しかし既存の実装の一部、例えば
vundle
のテストは繰り返し実行して動作の成否を確認するための手順が含まれていませんし、
neobundle
に至っては一切のテストが存在しません。
ぶっちゃけありえない。

ツールのインストール手順は短く、
容易に再現可能で、
既存の環境に与える影響は可能な限り少なくすべきです。
既存の実装のほとんどは手動で ~/.vim 等のディレクトリの調整が必要です。
vimfiles へのパスはプラットフォームによって異なるので、
この手の作業を異なる環境で手動で行うのは骨が折れます。

最後に、この手のツールは他のものへ容易に移行できるよう、
ツール自身とツールにより作成されたファイルやディレクトリは簡単に抹消できるべきです。
既存の実装のうち、特に Vimana
~/.vim/colors 等へプラグインを直接デプロイするうえに
uninstall コマンド等もないためとても困ります。

さてどうしましょう。上記の観点から既存の実装は全て使い物になりません。
今日から始まる新生活を安心して送るためには一体どうすればよいでしょうか。

解答

vim-flavor を使います。

必須要件

  • Git 1.7.9 以降
  • Ruby 1.9.2 以降
  • Ruby のインストールには RVM 等を使うことを推奨します。複数の環境で同一の状況を作り上げるのが簡単になるからです。
  • Vim 7.3 以降

サポートしているプラットフォーム

  • 大抵の Unix-like な環境。
  • Microsoft Windows は直接サポートはしていませんが、
    Cygwin 等を併用して間接的に管理することは可能です。

インストール手順

gem install vim-flavor

インストールできるプラグイン

  • Git リポジトリが存在するものに限ります。
    特に www.vim.org で公開されているものは
    vim-scripts.orgによって
    Git リポジトリしてのミラーが提供されており、
    「Git しか使えない」ことは取り立てて問題にはなりません。
  • プラグインの Git リポジトリにはバージョン毎にタグが作成されていることが前提です。
    例えば git tag 1.2.3 等としてタグが作成されており、
    このタグを使えばバージョン 1.2.3 のファイル一式が取得できるということです。
  • まともなディレクトリ構造を作成しているものに限ります。
    例えば太古に www.vim.org で公開されているプラグインの中には単に
    foo.vim だけがアップロードされており、それが
    plugin/foo.vim なのか
    syntax/foo.vim なのかあるいはそれ以外の何かなのか機械的に判別できないものがあります。
    こういう状態のものはインストールできないということです。
    ただこういう状態のものは現代ではまず存在しませんし、
    vim-scripts.org によるミラーは割と良い感じに調整を施してあるため、
    これが問題になることもまずありません。

vim-flavor を使い始める

cd $YOUR_REPOSITORY_FOR_DOTFILES

cat >VimFlavor <<'END'
  # * git://github.com/kana/vim-textobj-indent.git を使うと宣言します。
  # * 引数が '$USER/$REPO' の形式なら
  #   git://github.com/$USER/$REPO.git からプラグインを取得します。
  # * kana/vim-textobj-indent は kana/vim-textobj-user に依存しています。
  #   このような依存関係は自動解決されて必要なものがインストールされます。
  #   (プラグインが自身の依存関係を VimFlavor ファイルで記述している場合)
  #   (FIXME: 依存関係の自動解決は現段階では未実装です。直に実装されます)
  flavor 'kana/vim-textobj-indent'

  # * git://github.com/vim-scripts/fakeclip.git を使うと宣言します。
  # * 引数が '$REPO' の形式なら
  #   git://github.com/vim-scripts/$REPO.git からプラグインを取得します。
  flavor 'fakeclip'

  # * git://github.com/kana/vim-altr.git を使うと宣言します。
  # * 引数が URI ならそこからプラグインを取得します。
  flavor 'git://github.com/kana/vim-altr.git'

  # * kana/vim-smartchr 0.1.0 以降を使うと宣言します。
  #   ただし 0.2.0 以降のバージョンは(非互換かもしれないので)使いません。
  flavor 'kana/vim-smartchr', '~> 0.1.0'

  # * kana/vim-smartword 0.1 以降を使うと宣言します。
  #   ただし 1.0 以降のバージョンは(まず非互換なので)使いません。
  flavor 'kana/vim-smartword', '~> 0.1'

  # * kana/vim-smarttill 0.1.0 以降を使うと宣言します。
  #   特に使用するバージョンの上限は決めません。
  #   非互換であったとしても可能な限り新しいバージョンを使います。
  flavor 'kana/vim-smarttill', '>= 0.1.0'
END

# VimFlavor で宣言したプラグインを取得し、
# VimFlavor.lock (使用するバージョン等の情報のスナップショット) を作成し、
# ~/.vim 等へ宣言したプラグインと初期設定用のスクリプトをデプロイします。
vim-flavor install

# vimrc のできるだけ最初の行に以下のコマンドを追加してください:
#
#   runtime flavors/bootstrap.vim
vim vimrc

git add VimFlavor VimFlavor.lock vimrc
git commit -m 'Use vim-flavor to manage my favorite Vim plugins'

使用するプラグインのバージョンを更新する

vim-flavor upgrade

git add VimFlavor.lock
git commit -m 'Upgrade my favorite Vim plugins'

新しいプラグインをインストールする

cat >>VimFlavor <<'END'

  flavor 'kana/vim-operator-replace'

END

# 新たに使用すると宣言されたプラグインを取得し、
# VimFlavor.lock を適宜更新し、
# ~/.vim 等へ宣言したプラグインをデプロイします。
vim-flavor install

git add VimFlavor VimFlavor.lock
git commit -m 'Use kana/vim-operator-replace'

使わなくなったプラグインを削除する

# VimFlavor から使わなくなったプラグインの宣言を削除する。
sed -i~ -e '/vim-smartchr/d' VimFlavor

# VimFlavor.lock を適宜更新し、
# ~/.vim 等から使わなくなったプラグインを削除します。
vim-flavor install

git add VimFlavor VimFlavor.lock
git commit -m 'Farewell kana/vim-smartchr'

標準でない場所へプラグインをインストールする

vim-flavor install --vimfiles-path=/cygdrive/c/Users/kana/vimfiles

vim-flavor を使うのを止める

rm -r ~/.vim-flavor
rm -r ~/.vim/flavors  # もしくは ~/vimfiles/flavors 等。

cd $YOUR_REPOSITORY_FOR_DOTFILES
rm VimFlavor VimFlavor.lock
git commit -am 'Farewell to vim-flavor'

補足

  • 今日はエイプリルフールです。
  • vim-flavor 自体は Ruby の gem として書かれていますが、
    作者の Ruby 力は低いので
    Ruby 的に不味いところがあればご指摘いただけると幸いです。