NeoBundle はVimのプラグインマネージャーですが、 少し前に開発者の方から「NeoBundleの開発は終わり、これからは Dein.vimを使ってね。」 と言ったアナウンスがあったので .vimrcの整理を兼ねてプラグインマネージャーの変更を行いました。
dein is the dark powered Vim package manager. It is created from full scratch.
Concepts are:
- Faster than NeoBundle
- Simple
- No commands, Functions only
- Easy to test and maintain
- No Vundle/NeoBundle compatibility
Vim, h:dein
NeoBundleより速くてシンプルだ、とのこと。
また、NeoVimにも対応しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
|
今使っている.vimrcのDein.vimに関連する基本的な部分はこんな感じです。
現在のFull .vimrcはこちら。
前のNeoBundle版のものは
プラグイン部分の流れは大体一緒です。
簡単な切り替え対応表はこんな感じ
NeoBundle | Dein.vim | |
---|---|---|
対応バージョン | Vim 7.2.051 or above | Vim 7.4 or above, NeoVim |
プラグインの置き場 | bundledir/プラグイン名 | deindir/repos/github.com/UserName/PluginName |
プラグイン追加スタート | 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() |
プラグインの追加 | 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>") |
まず、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
機能はあったみたいですが使ってなかったので 移行を機に。
chache
を使いたい場合はプラグイン設定を始める前に 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
が使えます。
1 2 3 4 5 6 7 |
|
みたいにしておくと、a
が先に呼ばれればa.vimがロードされるだけですが、 b
が先に呼ばれると、b.vimをロードする前にa.vimもロードされます。
on_source
がNeoBundleに追加された時の話。
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.
となっていて、説明逆なんじゃないかな、と思ってるんですが これで正しいと作者の人に。。。(なんか自分が勘違いしてる。。。?)
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かかるので、それに比べるとこの辺の 短縮は普段余り体感出来る程ではないかな、と言う感じもしますが、 実際速くなってるのはなってるみたいなので素晴らしいことです。
Vimを機能そのままにソースを完全にリファクタリングして より良い開発性や拡張性を持たせようと言う NeoVim ですが、最初はなんとなく腕試しで作ってる程度かな、 という感じでしたが今は非常に実用的になってきて 速度も速いらしいということで Vimから置き換える人も出てきてるみたいです。
Dein.vimもNeoVimのサポートを始めたので 乗り換えも簡単に出来る様になります。
まだ余りちゃんと見てませんが、一つ問題が有るのは NeoVimではluaをサポートしてないので、 luaを使う neocomplete という補完強化プラグイン が使えません。
ですが既に NeoVim様に deoplete という新しい補完強化プラグインを作っています。
こちらはPython3を使う様で、NeoVim専用になっています。
ちょっとそのうち.vimrcももう少し整理して NeoVimも使ってみたい所です。