NeoBundleLazyとNeoBundleSourceで遅延読み込み
プラグインがたくさん入っていると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プラグインに対応しました
ちなみに前回のエントリに書いたバージョンは別のファイルタイプで
おかしな挙動になるので若干修正しました。