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

TokyoVim#5に行ってきた

勉強会はこれが初の参加となりますが、TokyoVim#5に行ってきました。
Vimに関する何かをやる会ということで、みなさん侍のようにもくもくとやっていました。

自分がやったのは

  1. tablineの設定
  2. Unite画面のハイライト設定
  3. vim-ipiの設定

の3つです。

1.と2.はデフォルト設定から変えただけです。(特にネタになるようなことはありません)

3.のvim-ipiですが、これはBundle内のpluginを手動で読み込むためのpluginです。
pluginの管理自体はneobundle.vimがあれば困ることはないのですが、
最近plugin数が100を超えてしまい、vimの起動がとても遅くて困っています。

pluginを捨てる。というのが最も正しい解なのかもしれませんが、
モノを捨てるのが苦手な自分には それを 捨てるなんて とんでもない!

そこでFileTypeに特化したpluginはautocmd FileTypeからvim-ipiで読み込むことにし、
pluginを捨てずにvimの起動時間を短縮化してみました。

まずはvim-ipiのインストール。
このpluginはvim-pathogenが必要になるので両方ともNeoBundleInstallします。

次にvimrcでipiにBundleフォルダの場所を設定します。

call ipi#inspect("Bundle")

これでIPコマンドが使えるようになりました。
しかし、最初はpluginが起動時に全て読み込まれてしまうので意味がありません。

なのでipiから読み込みたいpluginはvimrcでNeoExternalBundleにしておきます。

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

※今日はpythonの人が何人かいたのでpythonの例にします

あとはautocmdに追加していくだけなのですが、以下の設定だと
FileTypeが設定されるたびに毎回IPコマンドを実行してしまいます。

autocmd FileType python IP python-mode

今日のメインはこれの対処だったのですが、こんな感じでautocmdを
自動生成・削除する処理を作ってみました。

" autocmdで呼ばれる関数
function! LazyLoading(ft)
    filetype plugin indent off
    for plugin_name in g:ll_plugins[a:ft]
        execute "silent! IP " . plugin_name
    endfor
    filetype plugin indent on
    execute "autocmd! MyIPI_" . a:ft
    execute "set filetype=" . a:ft
endfunction

" 読み込むpluginはFileTypeをキーにした辞書に配列として格納
let g:ll_plugins={}
let g:ll_plugins['python'] = [
            \ 'pytest.vim',
            \ 'python-mode',
            \ 'taglist.vim',
            \ 'TagHighlight',
            \ ]

for k in keys(g:ll_plugins)
    execute "augroup " . "MyIPI_" . k
    execute "autocmd!"
    execute "autocmd FileType " . k . " call LazyLoading('" . k . "')"
    execute "augroup END"
endfor

FileTypeの追加はg:ll_pluginsに新しい要素を追加すればOKです。

やっぱりvimなのに起動が遅いってのはダメですよね。