Movatterモバイル変換


[0]ホーム

URL:


rcmdnk's blog
Last update
  1. Top
  2. Computer
  3. Vim

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

基本的な設定等

.vimrc
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
" Flagslet s:use_dein=1" vi compatibilityif!&compatiblesetnocompatibleendif" Prepare .vim dirlet s:vimdir= $HOME ."/.vim"if has("vim_starting")if! isdirectory(s:vimdir)call system("mkdir " . s:vimdir)endifendif" deinlet s:dein_enabled=0if s:use_dein &&v:version>=704let s:dein_enabled=1  " Set dein pathslet 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_dircall system("git clone " . s:dein_repo ." " . s:dein_repo_dir)endiflet &runtimepath= &runtimepath ."," . s:dein_repo_dir  " Begin plugin partcall dein#begin(s:dein_dir)  " Check cacheif 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']})endifcall dein#add('tyru/open-browser.vim', {          \'on_map': ['<Plug>(openbrowser-smart-search)'],          \'lazy':1})call dein#save_cache()endifcall dein#end()  " Installation check.if dein#check_install()call dein#install()endifendifif 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

プラグイン部分の流れは大体一緒です。

簡単な切り替え対応表はこんな感じ

 NeoBundleDein.vim
対応バージョンVim 7.2.051 or aboveVim 7.4 or above, NeoVim
プラグインの置き場bundledir/PluginNamedeindir/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をセーブNeoBundleSaveCachecall 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しないとインストールされない
インストールチェックNeoBundleCheckif 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が使えます。

1234567
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, cache170
Dein w/ lazy, w/o cache200
Dein w/o lazy, w/ cache180
NeoBundle w/ lazy, w/cache200
NeoBundle w/ lazy, w/o cache250

こんな感じ。ただし、計測は

$ 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でアプリ管理 »

Sponsored Links

About Me


ほしいもの一覧

GitHub Stats

rcmdnk's GitHub statsTop langs

Uptime monitor


Response time graph
7-day Response time 239
1-year Response time 276
7-day uptime 100.00%
1-year uptime 99.97%

Powered byUpptime

Recent Posts

Monthly Archives

Categories

Tag Cloud

AeroFS(2)AI(8)Amazon(2)Analytics(4)Android(15)AppleScript(16)Asciinema(2)AutoHotkey(30)Bash(114)Bitbucket(1)Blog(2)Bookmarklet(4)Bootstrap(3)Brew-file(58)BSD(9)C-CPP(2)Chocolatey(4)Chrome(25)CLI(1)coLinux(2)CSS(4)Cygwin(31)Dell(1)Desktop(2)DIY(1)Docker(2)Dropbox(10)Emacs(3)English(5)Evernote(14)feedly(1)Firefox(59)GAS(1)GeekTool(3)Ginger(1)Git(42)GitHub(81)Gmail(16)GNU(8)Go(3)Google(20)GPT(5)GPU(1)HHKB(13)Home(1)Homebrew(97)IFTTT(12)Install(4)iOS(2)IoT(64)iPhone(14)iTerm2(4)Java(2)JavaScript(27)Jekyll(3)jQuery(4)Karabiner(26)Keyboard(1)KeyRemap4MacBook(8)Kramdown(1)Latex(1)Linux(69)Liquid(2)Lubuntu(3)Mac(312)Markdown(12)Music(8)Network(32)Obsidian(4)Octopress(125)ownCloud(2)PackageManagement(3)Pocket(4)Poetry(3)PowerShell(8)PR(3)Prompt(3)PuTTY(14)PyPi(1)Python(75)Qi(1)Rakuten(3)RaspberryPi(18)Ruby(14)screen(42)sentaku(14)Shell(1)Shopping(52)Slack(3)SVN(2)TeamViewer(5)Thunderbird(2)tmux(7)TravisCI(14)Trip(5)Ubuntu(4)Vim(109)Vimperator(19)Web(6)wercker(6)WiMAX(2)Windows(157)Word(1)yamy(7)Zsh(52)
Sponsored Links

Most Viewed Posts (Last Month)

Hatebu Popular Posts

Sponsored Links
}
[8]ページ先頭

©2009-2025 Movatter.jp