rcmdnk's blog
Last update

be quiet! 静音PC電源 80PLUS GOLD認証 DARK POWER PRO 10シリーズ 750W 国内正規代理店品

NeoBundle はVimのプラグインマネージャーですが、 少し前に開発者の方から「NeoBundleの開発は終わり、これからは Dein.vimを使ってね。」 と言ったアナウンスがあったので .vimrcの整理を兼ねてプラグインマネージャーの変更を行いました。

Dein.vim

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にも対応しています。

基本的な設定等

.vimrc
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
" Flags
let s:use_dein = 1

" vi compatibility
if !&compatible
  set nocompatible
endif

" Prepare .vim dir
let s:vimdir = $HOME . "/.vim"
if has("vim_starting")
  if ! isdirectory(s:vimdir)
    call system("mkdir " . s:vimdir)
  endif
endif

" dein
let s:dein_enabled  = 0
if s:use_dein && v:version >= 704
  let s:dein_enabled = 1

  " Set dein paths
  let s:dein_dir = s:vimdir . '/dein'
  let s:dein_github = s:dein_dir . '/repos/github.com'
  let s:dein_repo_name = "Shougo/dein.vim"
  let s:dein_repo_dir = s:dein_github . '/' . s:dein_repo_name

  " Check dein has been installed or not.
  if !isdirectory(s:dein_repo_dir)
    echo "dein is not installed, install now "
    let s:dein_repo = "https://github.com/" . s:dein_repo_name
    echo "git clone " . s:dein_repo . " " . s:dein_repo_dir
    call system("git clone " . s:dein_repo . " " . s:dein_repo_dir)
  endif
  let &runtimepath = &runtimepath . "," . s:dein_repo_dir

  " Begin plugin part
  call dein#begin(s:dein_dir)

  " Check cache
  if dein#load_cache()

    call dein#add('Shougo/dein.vim')

    call dein#add('Shougo/vimproc', {
          \ 'build': {
          \     'windows': 'tools\\update-dll-mingw',
          \     'cygwin': 'make -f make_cygwin.mak',
          \     'mac': 'make -f make_mac.mak',
          \     'linux': 'make',
          \     'unix': 'gmake'}})

    call dein#add('Shougo/unite.vim', {
          \ 'depends': ['vimproc'],
          \ 'on_cmd': ['Unite'],
          \ 'lazy': 1})

    if has('lua')
      call dein#add('Shougo/neocomplete.vim', {
            \ 'on_i': 1,
            \ 'lazy': 1})

      call dein#add('ujihisa/neco-look', {
            \ 'depends': ['neocomplete.vim']})
    endif

    call dein#add('tyru/open-browser.vim', {
          \ 'on_map': ['<Plug>(openbrowser-smart-search)'],
          \ 'lazy': 1})

    call dein#save_cache()
  endif

  call dein#end()

  " Installation check.
  if dein#check_install()
    call dein#install()
  endif
endif

if s:dein_enabled && dein#tap("unite.vim")
  nnoremap [unite] <Nop>
  nmap <Leader>u [unite]
  nnoremap <silent> [unite]b :Unite buffer<CR>
endif

今使っている.vimrcのDein.vimに関連する基本的な部分はこんな感じです。

現在のFull .vimrcはこちら。

dotfiles/.vimrc at master · rcmdnk/dotfiles

前の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.vimvimprocdependsしてる場合は unite.vimが読み込まれる際にvimprocが読み込まれてない場合には先に読み込みます。 addして無ければ無いよ、という表示が出ます。 (強い依存してるものであればそこで無理やり次のプラグインを読み込んでエラーになります。)

また、dependsとは逆に、インストールされてるなら他のプラグインよりも先に読み込ませたい、 というプラグインがある場合にはon_sourceが使えます。

1
2
3
4
5
6
7
call dein#add('a.vim', {
      \ 'on_source': ['b.vim'],
      \ 'on_cmd': ['a'],
      \ 'lazy': 1})
call dein#add('b.vim', {
      \ 'on_cmd': ['b'],
      \ 'lazy':1 })

みたいにしておくと、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.

となっていて、説明逆なんじゃないかな、と思ってるんですが これで正しいと作者の人に。。。(なんか自分が勘違いしてる。。。?)

Wrong help for “on_source”? · Issue #32 · Shougo/dein.vim

追記: 2016/03/10

やはりbeforeが正しかったらしく現在のヘルプは治してもらって beforeになっています。

追記ここまで

the pluginthe listed pluginsを逆にとってる感じがしないでもないんですが、 いずれにしろ、実際の動作として、上の例でa.vimb.vimより先にロードされるのは 検証済で正しいです。

最後に、各プラグイン事の設定はdein#end()より後に行います。 プラグインがあるかないかは dein#tap('プラグイン名')で判断できます。

TOML化

プラグインの読み込み部分をTOML形式で書いた外部ファイルに置き換える、という 事も出来るようです。

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

かなりすっきりとした感じには出来ます。

ただしヘルプにも

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も呼んで見る、とか。

NeoVim?

Vimを機能そのままにソースを完全にリファクタリングして より良い開発性や拡張性を持たせようと言う NeoVim ですが、最初はなんとなく腕試しで作ってる程度かな、 という感じでしたが今は非常に実用的になってきて 速度も速いらしいということで Vimから置き換える人も出てきてるみたいです。

Dein.vimもNeoVimのサポートを始めたので 乗り換えも簡単に出来る様になります。

まだ余りちゃんと見てませんが、一つ問題が有るのは NeoVimではluaをサポートしてないので、 luaを使う neocomplete という補完強化プラグイン が使えません。

ですが既に NeoVim様に deoplete という新しい補完強化プラグインを作っています。

こちらはPython3を使う様で、NeoVim専用になっています。

ちょっとそのうち.vimrcももう少し整理して NeoVimも使ってみたい所です。

Sponsored Links
Sponsored Links

« howdoi/how2: コマンドラインからStack Overflow (Stack Exchange)の回答を参照する Windows 10でPackageManagement (OneGet) + Chocolateyでアプリ管理 »

}