読者です 読者をやめる 読者になる 読者になる

NeoBundleLazyとNeoBundleSourceで遅延読み込み

vim

プラグインがたくさん入っているとVimの起動が遅くなってしまいます。

今まではvim-ipiのIPコマンドを使ってプラグインの
遅延読み込みをやっていましたが、
昨日のTokyoVim#6でShougoさんがneobundle.vim
IPコマンドと同等の機能を実装してくれました。

こんなvimrcが

NeoExternalBundle 'git://github.com/alfredodeza/pytest.vim.git'
NeoExternalBundle 'git://github.com/klen/python-mode.git'


こんな感じになります。

NeoBundleLazy 'git://github.com/alfredodeza/pytest.vim.git'
NeoBundleLazy 'git://github.com/klen/python-mode.git'


そしてプラグインを読み込むときのコマンドが

IP pytest.vim
IP python-mode


から

NeoBundleSource pytest.vim
NeoBundleSource python-mode


になります。

また、

:NeoBundleSource


を実行すると読み込んでいないプラグインを全て読み込んでくれます。
(この機能は本日15分ほどで実装して頂きました)
これでもうvim-ipiは不要です。


ただイチイチNeoBundleSourceコマンドを打つのは面倒なので
自動的にNeoBundleSourceする処理を書いてみました。

コマンド編

function! LoadQuickRun()
     silent! NeoBundleSource vim-quickrun
     silent! NeoBundleSource quicklearn
     call Flymake_for_CPP_Setting()
endfunction
command! -nargs=* -range=0 QuickRun
     \ call LoadQuickRun()
     \ | call quickrun#command(<q-args>, <count>, <line1>, <line2>)


キーマップ編

nnoremap <silent> [vimfiler]b  
             \ :<C-u>silent! NeoBundleSource vimfiler<CR>
             \ :<C-u>VimFilerBufferDir<CR>
nnoremap <silent> [vimfiler]c  
             \ :<C-u>silent! NeoBundleSource vimfiler<CR>
             \ :<C-u>VimFilerCurrentDir<CR>
nnoremap <silent> [vimfiler]d  
             \ :<C-u>silent! NeoBundleSource vimfiler<CR>
             \ :<C-u>VimFilerDouble<CR>


ファイルタイプ編

function! LazyLoading(ft)
     for plugin_name in g:ll_plugins[a:ft]
         execute "silent! NeoBundleSource " . plugin_name
     endfor
     execute "autocmd! NeoBundleSourceFor_" . a:ft

     if exists('g:ll_post_process[a:ft]')
         for post_process in g:ll_post_process[a:ft]
             execute post_process
         endfor
     endif
endfunction

let g:ll_plugins={}
let g:ll_plugins['python'] = [
             \ 'pytest.vim',
             \ 'python-mode',
             \ 'taglist.vim',
             \ 'TagHighlight',
             \ ]
let g:ll_post_process={}
let g:ll_post_process['python'] = [
             \ 'silent! ReadTypes',
             \ 'set filetype=python',
             \ ]

" lazy loading of each filetype
if exists("g:ll_plugins")
     for k in keys(g:ll_plugins)
         execute "augroup " . "NeoBundleSourceFor_" . k
         execute "autocmd!"
         execute "autocmd FileType " . k . " call LazyLoading('" . k . "')"
         execute "augroup END"
     endfor
endif


なんでファイルタイプ編がこんなことになっているのかというと、
NeoBundleSourceだけではpython-modeが有効にならなかったからです。
一時しのぎ的にこのような方法で回避しています。

⇒NeoBundleSourceがfiletypeプラグインに対応しました

ちなみに前回のエントリに書いたバージョンは別のファイルタイプで
おかしな挙動になるので若干修正しました。