Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

NeoBundle から dein.vim に乗り換えたら爆速だった話

$
0
0

たまたま NeoBundle のリポジトリを見たらこんな PRが上がっておりました。平たく言うと、NeoBundle はオワコンだから dein 使おう!と作者の Shougo 氏自身が reddit で発言したそうなのです。僕自身は NeoBundle に何の不満もなかったのですが、dein の方がとにかく爆速らしいということは各所で強調されてましたので試してみました。

どのくらい速くなった?

最初に結論から。確かに起動速度は爆速です。インストール後、以下のコマンドを叩いてざっくり計測してみました。

vim --startuptime /tmp/time.log +q
  • ↑のコマンドを 5 回叩いて平均を見ました。
  • 利用した設定ファイルはココ。
  • MacVim Kaoriya 版 (7.4.1362)
  • プラグイン総数: 98
    • そのうち、起動時に有効 (not lazy loading) なもの: 35
    • プラグインリストは全て TOML ファイルに書いています。
  • その他諸々の設定含みます。
NeoBundledein.vim
最長179ms119ms
最短165ms114ms
平均170ms116ms

30% 以上速くなってます!しかもこれ、他の諸々の設定込みですから人によってはもっと変わってくるでしょう。

速さはもちろんですが、設定項目が整理され、より分かりやすく、細かいところに手が届くようになってます。

で、なんだか順序が逆ですが、以下インストール方法と、NeoBundle から乗り換えるときの Tips を書いていきます。

インストール方法

基本的なところは dein.vimを使ってみる - Qiitaに既に上がってますので、ここでは Shougo 氏の vimrcを見てよりスマートに(?)設定してみます。特に、プラグインリストの TOML 化は高速起動のために必須です。

" vimrc に以下のように追記" プラグインが実際にインストールされるディレクトリlets:dein_dir = expand('~/.cache/dein')" dein.vim 本体lets:dein_repo_dir =s:dein_dir . '/repos/github.com/Shougo/dein.vim'" dein.vim がなければ github から落としてくるif&runtimepath!~# '/dein.vim'if!isdirectory(s:dein_repo_dir)
    execute '!git clone https://github.com/Shougo/dein.vim's:dein_repo_dir
  endif
  execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir,':p')endif" 設定開始call dein#begin(s:dein_dir)" プラグインリストを収めた TOML ファイルlets:toml      ='~/.vim/rc/dein.toml'lets:lazy_toml ='~/.vim/rc/dein_lazy.toml'" TOML を読み込み、キャッシュしておくif dein#load_cache([expand('<sfile>'),s:toml,s:lazy_toml])call dein#load_toml(s:toml,      {'lazy': 0})call dein#load_toml(s:lazy_toml, {'lazy': 1})call dein#save_cache()endif" 設定終了call dein#end()" もし、未インストールものものがあったらインストールif dein#check_install()call dein#install()endif

プラグインのリストを書く

インストールするプラグインのリストは TOML に書いていきます。

  1. 起動時に必ず読み込むもの
    • ~/.vim/rc/dein.toml
  2. 特定の条件で後から読み込むもの
    • ~/.vim/rc/dein_lazy.toml

1. dein.tomlの例

NeoBundle & dein.vim を初めて触る方は 1. だけで十分です。

# 基本は github.com のレポジトリーを指定するだけ[[plugins]]repo='Shougo/dein.vim'# git clone 後、実行すべきコマンドがある場合はこんな感じ[[plugins]]repo='Shougo/vimproc.vim'[plugins.build]windows='tools\\update-dll-mingw'cygwin='make-fmake_cygwin.mak'mac='make-fmake_mac.mak'linux='make'unix='gmake'# ブランチやタグを指定したいとき[[plugins]]repo='delphinus35/typescript-vim'rev='colorize-template-strings'# 特定の条件で読み込みたいとき[[plugins]]repo='elzr-vim-json'if='''!has('kaoriya')'''# 依存関係を指定したいとき[[plugins]]repo='vim-airline/vim-airline'depends=['vim-airline-themes']# 依存関係を指定したからと言って、自動でインストールはされない(ここは NeoBundle と違う)[[plugins]]repo='vim-airline/vim-airline-themes'

ifとか NeoBundle には有りませんでしたね!超便利です。

2. dein_lazy.tomlの例

プラグインの数が多くなってくると起動速度が遅くなってきます。必ずしも起動時に必要でないプラグインは、利用条件と共に 2. に移しましょう。

# 特定のファイルタイプで読み込む[[plugins]]repo='Quramy/tsuquyomi'on_ft=['typescript']# インサートモードに入ったら読み込む[[plugins]]repo='Shougo/neocomplete.vim'on_i=1[[plugins]]repo='Shougo/unite.vim'# unite.vim を読み込んだら一緒に読み込む[[plugins]]repo='Shougo/neomru.vim'on_source=['unite.vim']# 特定のコマンドを打ったら読み込む[[plugins]]repo='thinca/vim-prettyprint'on_cmd=['PP','PrettyPrint']# 特定のマッピングを使ったら読み込む# 又、gvim でしか利用しない[[plugins]]repo='thinca/vim-fontzoom'on_cmd=['Fontzoom']on_map=['<Plug>(fontzoom-']gui=1

などなど、他にもありますので :h deinしてマニュアルを読んでみてください。

NeoBundle から以降で変わったこと・気をつけること

移行時にハマった点、気付いた新機能などを書いときます。

Neovim に対応した(らしい)

Neovim 自体使ってないので試してないのです……。非同期でインストールやアップデートできて、それはそれは快適らしいですよ。

dependsを書いただけではインストールしてくれない & 書式もちょっと違う

これが一番ハマりました。今までは

# NeoBundle 用設定[[plugins]]repo='vim-airline/vim-airline'depends=['vim-airline/vim-airline-themes']

と、書いとくだけで vim-airline-themesまで一緒にインストールされたんですが、dein.vim では個別に書く必要があります。

# dein 用設定# depends の書式も微妙に違う[[plugins]]repo='vim-airline/vim-airline'depends=['/vim-airline-themes'][[plugins]]repo='vim-airline/vim-airline-themes'

うーん。これなら depends特に要らない気がする……。

ifの追加

Vimscript によって読み込む条件を指定可能になりました。これはスゴイ便利です。

[[plugins]]repo='elzr-vim-json'if='''!has('kaoriya')'''

Kaoriya 版以外の時のみ、読み込んでいます。Vim の構文がそのまま書けます。

プラグイン情報を取得するコマンドが変わった。

今までプラグインのインストールパスを調べるために

letl:path= neobundle#config#get('hoge').path

とかしてましたが、

letl:path= dein#get('hoge').path

になりました。短い!

プラグインのインストールパスの形式が変わった

今までは指定されたディレクトリにプラグイン名が羅列されていましたが、

# NeoBundle
/plugin1.vim
/plugin2.vim
...

dein.vim では github.com のパス名がそのまま入るようになりました。go getした時みたいです。

# dein.vim
/repos/github.com/author1/plugin1.vim
/repos/github.com/author2/plugin2.vim
...

unite ソースとかがばっさりなくなった

Unite deinという、プラグインリストが見れるものだけになりました。neobundle/updateとか重宝してたのですが……

まだまだ開発中のプラグインなので、なくなった機能はそのうち復活するのかも知れません。

on_sourceフックの設定方法が変わった

lazy loading 時にのみ、有効な設定を書きたい場合があります。たとえば、vim-gistaでは Github Enterprise で使う場合、事前にコマンドを実行しておく必要があるのですが、lazy loading しているとこのコマンドは vimrc内で使えません。

" 「E117: 未知の関数です」と言われてしまうcall gista#client#register('GHE','https://github.example.com/api/v3')

NeoBundle ではこのようなとき、on_sourceフックを利用していたのですが、ぱっと見では何やってるのか分かりにくいものでした。

" NeoBundle 用コードlets:hooks = neobundle#get_hooks('vim-gista')functions:hooks.on_source(bundle)call gista#client#register('GHE','https://github.example.com/api/v3')endfunction

dein.vim では以下のように書きましょう。

" どこか最初の方に書いておく
augroup MyAutoCmd
  autocmd!
augroup END

" プラグインごとに if 文を書くif dein#tap('vim-gista')  " 実行すべき関数function!s:gista_on_source() abort
    call gista#client#register('GHE','https://github.example.com/api/v3')endfunction  " g:dein#name にはプラグイン名が入る
  execute 'autocmd MyAutoCmd User''dein#source#' . g:dein#name
        \ 'call s:gista_on_source()'endif

Vim 標準の autocmd機構を使うようになりました。NeoBundle と比べて、なるべく Vim 標準の機能を使っていることが dein.vim の速さの秘密なのかも知れません。


というわけで、dein.vim の使い方と NeoBundle からの移行方法についてまとめてみました。重ねて言いますが、NeoBundle は deprecated になってしまいましたので、これからプラグイン管理を始める方は是非 dein.vim を使いましょう!


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>