NeoBundleはVimのプラグインマネージャーですが、少し前に開発者の方から「NeoBundleの開発は終わり、これからはDein.vimを使ってね。」と言ったアナウンスがあったので.vimrcの整理を兼ねてプラグインマネージャーの変更を行いました。
dein is the dark powered Vim package manager. It is created from fullscratch.
Concepts are:
- Faster than NeoBundle
- Simple
- No commands, Functions only
- Easy to test and maintain
- No Vundle/NeoBundle compatibility
Vim, h:dein
NeoBundleより速くてシンプルだ、とのこと。
また、NeoVimにも対応しています。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | |
今使っている.vimrcのDein.vimに関連する基本的な部分はこんな感じです。
現在のFull.vimrcはこちら。
前のNeoBundle版のものは
dotfiles/.vimrc.neobundle at master · rcmdnk/dotfiles: https://github.com/rcmdnk/dotfiles/blob/master/.vimr.neobundlec
プラグイン部分の流れは大体一緒です。
簡単な切り替え対応表はこんな感じ
| NeoBundle | Dein.vim | |
|---|---|---|
| 対応バージョン | Vim 7.2.051 or above | Vim 7.4 or above, NeoVim |
| プラグインの置き場 | bundledir/PluginName | deindir/repos/github.com/UserName/PluginName (GitHubのレポジトリの場合。) |
| プラグイン追加スタート | call neobundle#begin(s:bundledir) | call dein#begin(s:deindir) |
| Cacheスタート | call neobundle#load_cache()複数設定ファイルがある場合は一つずつ引数へ | call dein#load_cache()複数設定ファイルがある場合は配列にして一つの引数として渡す |
| Cacheをセーブ | NeoBundleSaveCache | call dein#save_cache() |
| プラグイン追加終わり | call neobundle#end() | call dein#end() |
| 本体のプラグインの定義 | NeoBundleFetch 'Shougo/neobundle.vim'NeoBundleではなくNeoBundleFetch | call dein#add('Shougo/dein.vim')他のプラグイン同様 add |
| プラグインの追加 | NeoBundle {repository} [,{option}]または NeoBundleLazyコマンドを使えばlazy=1を自動設定 | call dein#add({repository}[, {options}])lazy=1用の特別な関数は無いのでaddでoptionに'lazy': 1を与える |
プラグインオプション:depends | dependsにあるだけで自動的にインストール | dependsにあってもそれ自身をaddしないとインストールされない |
| インストールチェック | NeoBundleCheck | if dein#check_install() call dein#install()endif |
| プラグインチェック | ! empty(neobundle#get("<plugin name>") | dein#tap("<plugin name>") |
| プラグインのアップデートコマンド | :NeoBundleUpdate [{plugin name}] | call dein#update([{plugin name}]) |
| プラグインの再インストール | :NeoBundleReinstall {plugin name} | call dein#reinstall({plugin name}) |
まず、vim 7.4以上対応ということなのでその辺のチェックから。
READMEとかだとスクリプトを使ってインストールしてそこへのパスをruntimepathに加える様になってますが、ここでは無ければ自動で入れる様にしています。
dein.vimへのruntimepathの設定が終わったらdein#beginで設定を始めます。ここからdein#endまででプラグインを与えていきます。
beginに与える引数のディレクトリにプラグインがインストールされていきます。
この際、Neobundleだと直接レポジトリ名のディレクトリにプラグインをcloneしたりしてきていましたが、deinではrepos/github.com/Shougo/vimprocの様に、repostというディレクトリを作り、その中にGitHubディレクトリならURL名に従うパスが作られます。
これによって同じ名前のレポジトリでも違うユーザーのものだったりすると同時に入れることも可能です。その際には、少なくとも片方にはnameという値を設定して違う名前で扱う様にします。(nameが指定されなければレポジトリ名が名前になる。)
beginしたらdein#addでプラグインを加えていけば良いのですが、今回はcache機能を使ってみました。
NeoBundleでもcache機能はあったみたいですが使ってなかったので移行を機に。
cacheを使いたい場合はプラグイン設定を始める前にload_cache関数を呼び設定ファイルに変更があるかどうか確認を行います。変更があれば1を返すので上のifはtrueになりプラグインの読み込みが開始されます。
この際にチェックする設定ファイルですが、デフォルトでは$MYVIMRC、つまりは.vimrcです。
複数のファイルをsourceしたりして使ってる場合には
if call dein#load_cache([expand('~/.vimrc'), expand(['~/.vimrc.local']) ...みたいな感じで必要なファイルを配列で渡します。
プラグインを一通り書いたらdein#save_cache()して設定を保存します。
その後endして、与えたプラグインがインストールされてるかチェックし(dein#check_install())インストールされてないものがあればインストールします(dein#install())。
各プラグインの指定の仕方は基本的には
call dein#add('Shougo/dein.vim')みたいな感じで、GitHubのものであればユーザー名+プラグイン名だけでOK。また、NeoBundleと違ってコマンドが無いので全てcallを使って関数を呼びます。
最初にdeinを加えますが、NeoBundleの時のNeoBundleFetchみたいな特別な物を使うわけでは無く他のと同じadd関数を使えばOK。
dependsとかのオプションの使い方はNeoBundleと大体同じです。
NeoBundleLazyみたいな関数は無いので全てaddを使ってlazyなものにはオプションで渡しています。
この辺、lazyについて正しく使えてるか100%の自身は無いですが、deinにはlazyにしても意味のないプラグインを探す、dein#check_lazy_plugins()という関数があって、これを呼ぶと、現在lazyにしてるプラグインのうち、lazyにしても意味の無いものをリストしてくれるので参考に。
オプションでちょっと動作が違うのがdependsで、NeoBundleではdependsに書いてあるプラグインは自動でインストールされましたが、deinでは別途addにきちんと書いてないとインストールされません。
dependsは読み込む順番を保証するためだけのものになっています。上の様にunite.vimがvimprocにdependsしてる場合はunite.vimが読み込まれる際にvimprocが読み込まれてない場合には先に読み込みます。addして無ければ無いよ、という表示が出ます。(強い依存してるものであればそこで無理やり次のプラグインを読み込んでエラーになります。)
また、dependsとは逆に、インストールされてるなら他のプラグインよりも先に読み込ませたい、というプラグインがある場合にはon_sourceが使えます。
1234567 | |
みたいにしておくと、aが先に呼ばれればa.vimがロードされるだけですが、bが先に呼ばれると、b.vimをロードする前にa.vimもロードされます。
on_sourceがNeoBundleに追加された時の話。
新・ももんが流NeoBundle管理術(あたらしい) - かなりすごいブログ: http://blog.supermomonga.com/articles/vim/neobundle-sugoi-setting.html
autoloadにon_sourceオプションが欲しい · Issue #182 · Shougo/neobundle.vim
これのヘルプが
*dein-options-on_source* on_source (List) or (String) Load the plugin after the listed plugins are loaded. Note: The plugins must be lazy loaded plugins.となっていて、説明逆なんじゃないかな、と思ってるんですがこれで正しいと作者の人に。。。(なんか自分が勘違いしてる。。。?)
追記: 2016/03/10
やはりbeforeが正しかったらしく現在のヘルプは治してもらってbeforeになっています。
追記ここまで
the pluginとthe listed pluginsを逆にとってる感じがしないでもないんですが、いずれにしろ、実際の動作として、上の例でa.vimがb.vimより先にロードされるのは検証済で正しいです。
最後に、各プラグイン事の設定はdein#end()より後に行います。プラグインがあるかないかはdein#tap('プラグイン名')で判断できます。
プラグインの読み込み部分をTOML形式で書いた外部ファイルに置き換える、という事も出来るようです。
かなりすっきりとした感じには出来ます。
ただしヘルプにも
Note: TOML parser is slow.と、読み込みが遅くなるみたいなので、特にTOML化した場合にはcacheが必須になります。
TOML化で便利なのは上の例でも有るように、共通オプションを読み込む時に渡せるので、lazyな物とそうでないもの、みたいな分け方をするとlazyオプションを各プラグインに対していちいち書かなくて良くて便利だったりします。
ただ、今のところは.vimrcは基本単独ファイルにしておきたいな、ということで直接書いています。
70程のプラグインが入っていますが(もっと整理しないと。。。)、この状態でスピードチェック。
| Speed (ms) | |
|---|---|
| Dein w/ lazy, cache | 170 |
| Dein w/ lazy, w/o cache | 200 |
| Dein w/o lazy, w/ cache | 180 |
| NeoBundle w/ lazy, w/cache | 200 |
| NeoBundle w/ lazy, w/o cache | 250 |
こんな感じ。ただし、計測は
$ rm -f /tmp/starup.log && vim --startuptime /tmp/startup.log +q && tail /tmp/startup.logみたいな感じで何もファイルを開かない状態で起動しています。また、正確に見てませんが、それぞれ10ms位のばらつきはあります。
誤差が大きいですが、それでもDeinは多少速いかな、と。それからcacheの効果が意外と大きいです。
通常ファイルを開く場合、Syntaxハイライト等ファイルタイプに対する操作の読み込み、適用が数100msかかるので、それに比べるとこの辺の短縮は普段余り体感出来る程ではないかな、と言う感じもしますが、実際速くなってるのはなってるみたいなので素晴らしいことです。
もし、それまで上手く動いてたのにプラグインの追加や設定変更で上手く動かなくなったりしたら、
:call dein#update()を直接呼ぶと治る時があります。cacheも使ってる時は
:call dein#clear_cache()してからupdateも呼んで見る、とか。
Vimを機能そのままにソースを完全にリファクタリングしてより良い開発性や拡張性を持たせようと言うNeoVimですが、最初はなんとなく腕試しで作ってる程度かな、という感じでしたが今は非常に実用的になってきて速度も速いらしいということでVimから置き換える人も出てきてるみたいです。
Dein.vimもNeoVimのサポートを始めたので乗り換えも簡単に出来る様になります。
まだ余りちゃんと見てませんが、一つ問題が有るのはNeoVimではluaをサポートしてないので、luaを使うneocompleteという補完強化プラグインが使えません。
ですが既にNeoVim様にdeopleteという新しい補完強化プラグインを作っています。
こちらはPython3を使う様で、NeoVim専用になっています。
ちょっとそのうち.vimrcももう少し整理してNeoVimも使ってみたい所です。
« howdoi/how2: コマンドラインからStack Overflow (Stack Exchange)の回答を参照するWindows 10でPackageManagement (OneGet) + Chocolateyでアプリ管理 »