みなさんVimのプラグイン管理はどうされていますか。

プラグイン管理として良く使われているサードパーティー製のものとしては、

あたりでしょうか。

 

自身はneobundle.vimを使っていて、1年程前にdein.vimへと移行しました。

元々は前職の先輩から貰ったneobundle.vimの設定ファイルをメンテもせず使い続けていたのですが、ある日vim起動時にプラグイの読み込みエラーが出てきました。

設定ファイルを修正していると、ファイルには記載されているが全く使っていないプラグインや設定を発見。

そこで、どのプラグインがインストールされてどんな設定がされているのか、きちんと把握・管理したくなったのが、dein.vimへ移行したきっかけでした。

数あるプラグインマネージャーの中からdein.vimを選んだのは、それまで使っていたneobundle.vimの後継的な存在だったからです。

 

自身のdein.vimを使ったプラグイン管理構成をすごくざっくり書くとこんな感じです。

  • dein.toml
    • インストールしたいプラグインと、そのプラグインの設定を記載
  • .vimrc
    •  dein.vimのインストール
    • dein.tomlに記載されているプラグインを読み込みまたは、インストールするための設定を追記

この構成で1年間程やってきて、プラグインマネージャーほどの多機能さは必要ないなと思うようになり、本記事のタイトルの通り、プラグインマネージャー(dein.vim)を辞め、Vim8標準のパッケージ機能を採用することにしました。

 

前置きが長くなりましたが、以降でVim8標準のパッケージ機能でのプラグイン管理について書いていきます。

また、この記事で紹介している手順はVim 8 時代のがんばらないプラグイン管理のすすめを参考にしています。

 

Vim8標準のパッケージ機能について

そもそもVim8標準パッケージはどのような機能なのか。

簡潔に述べると「ディレクトリ配下に配置されているプラグインを読み込む」機能です。

より詳しい解説はVim 8.0 Advent Calendar 6 日目 パッケージを参照ください。

こちらの記事を要約すると、

  • ~/.vim/pack/mypackage/start/myplugin/ 等にプラグインのディレクトリを置くと、起動時に runtimepath に追加されロードされる (mypackage, myplugin は任意のディレクトリ名)
  • ~/.vim/pack/mypackage/opt/myplugin/ にプラグインのディレクトリを置くと、:packadd myplugin とすることでプラグインをロードできる
    • このディレクトリは起動時に runtimepath に追加されないので、任意のタイミングでロードできる

後者の「任意のタイミングでロードできる」が嬉しいポイントです。

プラグインの中でも特定のファイル形式の場合にのみ使うものとかってありますよね。

例えば、Vueファイルのシンタックス用のプラグイン。これは、Vueファイルを編集するまで使わないです。

そういったものは必要になったタイミングで読み込むようにします。

というのも、Vim起動時に全てのプラグインを読み込もうとすると時間がかかり、必然的にVimの起動も遅くなってしまうからです。

なので、プラグインはできるだけ必要になるタイミングで読み込むようにします。

 

このようにパッケージ機能はプラグインを管理するための基本的な機能を提供してくれます。

簡単な使い方としては、指定のディレクトリ(~/.vim/pack/mypackage/start/)を作成し、そこにgit cloneでプラグインを配置しておくことで、Vim起動時にプラグインが読み込まれます。

 

例えば、amatatsuというプラグインをVim起動時に読み込みたいなら次のようになります。

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

 

ただし、これまでの機能では以下の点においてプラグインを管理していくのに不十分です。

以降では、これらの問題を以下の順で解消していきます。

  1. プラグインのバージョンを固定し、別PCで同じ環境を復元する
  2. プラグインの一括アップデートを行う
  3. プラグインの遅延読み込みを行う

 

1. プラグインのバージョンを固定し、別PCで同じ環境を復元する

まず、プラグインを特定のバージョンに固定するために次のことを行います。

1-1. ~/.vim を Git で管理する

1-2. プラグインを git submodule で管理する

1-3. リポジトリを GitHub で公開する

こちらも順に見ていきます。

 

1-1. ~/.vim を Git で管理する

~/.vimディレクトリをGitで管理します。

こちらに関しては既にdotfilesで管理している方もいらっしゃるかと思います。

自身もdotfiles.vimrc.zshrcなどの設定ファイルを管理しているので、今回もdotfiles配下に_vimディレクトリを作成し、~/.vimにシンボリックリンクを貼って運用しています。

 

1-2. プラグインを git submodule で管理する

「げ、出たsubmodule。。。よう分からん。」という感じだったので、Git submodule の基礎で勉強し直しました。

submoduleが何となく分かったので、プラグインをsubmoduleとして管理します。

例として、amatatsuというプラグインを管理してみます。このプラグインはVim起動時に読み込みたいため、startディレクトリ配下にインストールします。

 

すると、下記のようなディレクトリ構成になるかと思います。

~/.vim/
|- pack/
|- residenti/
|- start/
|- amatatsu/

 

1-3. リポジトリをGitHubで公開する

終わりに、リポジトリをGitHubで公開します。

GitHubに.vimプロジェクトを作成し、git pushします。

以後、このディレクトリをcloneする際は、submoduleも一緒にcloneします。

 

ちなみに、--recursiveオプションを忘れてcloneしてしまっても、後から落としてこれるみたいです。

git cloneしたあとに–recursiveを付け忘れたことに気づいた。あとからsubmoduleをcloneしたい。

 

2. プラグインの一括アップデートを行う

次に、プラグインの一括アップデートを行いたいと思います。

上記の手順(1)でプラグインをsubmoduleとして管理しているため、一括アップデートは下記のように簡単に行えます。

 

*注意点

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

 

3. プラグインの遅延読み込みを行う

はい、最後です。

まずは、Vim8の標準パッケージ機能で遅延読み込みを行うための手順を確認します。

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

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

 

上記の手順に沿って、vim-vueというプラグインをインストールし遅延読み込みしてみます。

vim-vueは、Vueコンポーネントのシンタックスハイライトを行ってくれるプラグインです。

そのため、このプラグインは.vue形式のファイルを編集するタイミングで読み込んであげるのが良さそうです。

 

3-1. ~/.vim/pack/mypackage/opt/ ディレクトリにプラグインをインストールする

vim-vueは遅延読み込みするため、optディレクトリ配下にインストールします。

すると、今度は下記のようなディレクトリ構成になるかと思います。

~/.vim/
|- pack/
|- posva/
|- opt/
|- vim-vue/

 

3-2. 任意の FileType イベントや CmdUndefined イベントで :packadd を実行しまする

.vue形式のファイルが読み込まれた時にvim-vueが読み込まれるように、.vimrcに設定を書いていきます。

 

*豆知識

ファイルタイプによっては定義されていないものもあります。

そういった時は、「この拡張子のファイルタイプはこれ」と明示的に設定しておいてあげると良さそうです。

例えば、下記は拡張子が.tomlなら、ファイルタイプをtomlとして設定しています。

ちなみに、現在編集しているファイルのfiletypeを確認するためには、下記のコマンドを実行します。

:set filetype?

Vimメモ : filetypeの確認

 

最後に

まだ運用し始めたばかりで何とも言えませんが、プラグイン管理をVim8の標準機能で行えているのは、個人的にはスッキリして気持ちが良いです。少し気が早いですが良い年を迎えられそうです笑

あとは、しばらく使って様子をみてみようかなと思います。

 

 

【引用サイト】

tryu「Vim 8 時代のがんばらないプラグイン管理のすすめ」http://tyru.hatenablog.com/entry/2017/12/20/035142, (2017-12-20)