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

autoloadの関数が見つからない -- Unknown function: submode#enter_with

vim-submodeを入れてみた際、以下のように.vimrcに設定したところエラーが出た。

NeoBundle 'kana/vim-submode'
call submode#enter_with('winsize', 'n', '', '<C-w>>', '<C-w>>')
call submode#map('winsize', 'n', '', '>', '<C-w>>');

これでloadし直すと以下のようなエラーが出た。

E117: Unknown function: submode#enter_with
E117: Unknown function: submode#map

変なところにvim-submodeが置かれてしまっているのかと思い、確認してみるとちゃんとデフォルトの位置にファイルが置いてあった。
.vim/bundle/vim-submode/autoload/submode.vim

runtimepathに含まれてないことも疑ってみた

:set runtimepath
runtimepath=...,...,...,~/.vim/bundle/vim-submode/,...

ちゃんと入っていた。

プラグインのインストールや使用準備は正しく完了しているらしい。
なのでもしやと思って関数のcallを.vimrcの最下部においてみると、、、動いた。

NeoBundleコマンドによるプラグインの読み込みがcall時に終わっていないらしい。ということで遅延読み込み時にやっているように読み込み時にhookしてコマンドの設定を行うようにした。

NeoBundle 'kana/vim-submode'
let s:bundle = neobundle#get("vim-submode")
function! s:bundle.hooks.on_source(bundle)
    call submode#enter_with('winsize', 'n', '', '<C-w>>', '<C-w>>')
    call submode#map('winsize', 'n', '', '>', '<C-w>>')
endfunction

これで問題なし。

NeoBundleコマンドによるプラグインの読み込みや初期化は同期的に完了するものと思っていたが違った模様。プラグインマネージャとしてずっと使っているがコードを見たことないので、この機会に見てみようと思った。

あと、vim-submodeの↑の設定はsplitしたウィンドウのサイズ変更を簡単にできるようにするもの。それについてはこちらのページでわかりやすくまとめてくれていた。
submode.vim とその設定例なんかを紹介 - 永遠に未完成



追記
上述の設定の場合、NeoBundleコマンド中でのhooksの実行と、on_source用のhooks登録の順番は実行タイミングに依ってしまいそうだったので、以下のようにLazyを用いるようにした。

NeoBundleLazy 'kana/vim-submode', {                                                       
    \ 'autoload': { 'mappings': ['<C-w>>'] }                
    \}                                                                                    
let s:bundle = neobundle#get("vim-submode")                                               
function! s:bundle.hooks.on_source(bundle)                                                
    call submode#enter_with('winsize', 'n', '', '<C-w>>', '<C-w>>')                       
    call submode#map('winsize', 'n', '', '>', '<C-w>>')                                   
endfunction