みなさんVimのプラグイン管理はどうされていますか。
プラグイン管理として良く使われているサードパーティー製のものとしては、
- Vundle.vim
- GitHubスター数: 20,500
- vim-plug
- GitHubスター数: 16,700
- dein.vim
- GitHubスター数: 2,400
- neobundle.vim
- GitHubスター数: 2,200
あたりでしょうか。
自身は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起動時に読み込みたいなら次のようになります。
1 2 3 4 5 |
% mkdir -p ~/.vim/pack/residenti/start/ % cd ~/.vim/pack/residenti/start/ % git clone https://github.com/residenti/amatatsu.git |
そう、Vim 8 なら無理にプラグインマネージャーを使わずとも簡単にプラグインを読み込めるのです。 更新するのだって簡単で、プラグインのリポジトリで git pull すればいいだけです。
ただし、これまでの機能では以下の点においてプラグインを管理していくのに不十分です。
以降では、これらの問題を以下の順で解消していきます。
- プラグインのバージョンを固定し、別PCで同じ環境を復元する
- プラグインの一括アップデートを行う
- プラグインの遅延読み込みを行う
1. プラグインのバージョンを固定し、別PCで同じ環境を復元する
まず、プラグインを特定のバージョンに固定するために次のことを行います。
1-1. ~/.vim を Git で管理する
1-2. プラグインを git submodule で管理する
1-3. リポジトリを GitHub で公開する
こちらも順に見ていきます。
1-1. ~/.vim を Git で管理する
~/.vim
ディレクトリをGitで管理します。
1 2 3 4 5 6 7 |
% cd ~/.vim % git init % git add . % git commit -m 'initial commit.' |
こちらに関しては既にdotfilesで管理している方もいらっしゃるかと思います。
自身もdotfiles
で.vimrc
や.zshrc
などの設定ファイルを管理しているので、今回もdotfiles
配下に_vim
ディレクトリを作成し、~/.vim
にシンボリックリンクを貼って運用しています。
1-2. プラグインを git submodule で管理する
「げ、出たsubmodule。。。よう分からん。」という感じだったので、Git submodule の基礎で勉強し直しました。
submoduleが何となく分かったので、プラグインをsubmoduleとして管理します。
例として、amatatsuというプラグインを管理してみます。このプラグインはVim起動時に読み込みたいため、start
ディレクトリ配下にインストールします。
1 2 3 4 5 6 7 |
% cd ~/.vim % mkdir -p pack/residenti/start % git submodule add https://github.com/residenti/amatatsu.git pack/residenti/start/amatatsu % git commit -m 'add amatatsu plugin.' |
すると、下記のようなディレクトリ構成になるかと思います。
~/.vim/
|- pack/
|- residenti/
|- start/
|- amatatsu/
1-3. リポジトリをGitHubで公開する
終わりに、リポジトリをGitHubで公開します。
GitHubに.vim
プロジェクトを作成し、git push
します。
以後、このディレクトリをclone
する際は、submoduleも一緒にclone
します。
1 |
git clone --recursive { gitリポジトリurl } |
ちなみに、--recursive
オプションを忘れてclone
してしまっても、後から落としてこれるみたいです。
git cloneしたあとに–recursiveを付け忘れたことに気づいた。あとからsubmoduleをcloneしたい。
2. プラグインの一括アップデートを行う
次に、プラグインの一括アップデートを行いたいと思います。
上記の手順(1)でプラグインをsubmodule
として管理しているため、一括アップデートは下記のように簡単に行えます。
1 2 3 |
% git submodule foreach git pull % git commit -a -m 'update all vim plugins.' |
*注意点
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
ディレクトリ配下にインストールします。
1 2 3 4 5 6 7 |
% cd ~/.vim % mkdir -p pack/posva/opt % git submodule add https://github.com/posva/vim-vue.git pack/posva/opt/vim-vue % git commit -m 'add vim-vue plugin.' |
すると、今度は下記のようなディレクトリ構成になるかと思います。
~/.vim/
|- pack/
|- posva/
|- opt/
|- vim-vue/
3-2. 任意の FileType イベントや CmdUndefined イベントで :packadd を実行しまする
.vue
形式のファイルが読み込まれた時にvim-vueが読み込まれるように、.vimrc
に設定を書いていきます。
1 2 3 4 5 6 7 8 9 |
# .vimrc function! s:config_vue() packadd vim-vue endfunction augroup MyAutoCmd autocmd! autocmd FileType vue call s:config_vue() augroup END |
*豆知識
ファイルタイプによっては定義されていないものもあります。
そういった時は、「この拡張子のファイルタイプはこれ」と明示的に設定しておいてあげると良さそうです。
例えば、下記は拡張子が.toml
なら、ファイルタイプをtoml
として設定しています。
1 2 3 4 5 |
# .vimrc augroup MyAutoCmd autocmd! autocmd MyAutoCmd BufRead,BufNewFile *.toml set filetype=toml augroup END |
ちなみに、現在編集しているファイルのfiletypeを確認するためには、下記のコマンドを実行します。
:set filetype?
最後に
まだ運用し始めたばかりで何とも言えませんが、プラグイン管理をVim8の標準機能で行えているのは、個人的にはスッキリして気持ちが良いです。少し気が早いですが良い年を迎えられそうです笑
あとは、しばらく使って様子をみてみようかなと思います。
【引用サイト】
tryu「Vim 8 時代のがんばらないプラグイン管理のすすめ」http://tyru.hatenablog.com/entry/2017/12/20/035142, (2017-12-20)