Vim で後から呼び出す関数を定義する

LingrVim 部屋で
『vimrc で関数定義は最初に書きたいけど、処理は後ろのほうで行いたい』
みたいな話がでていたので書いてみた。

[ソース]

let s:apply = []

" 定義した関数をスタックにためるためのコマンド
command! ENDfunction
\     execute "function! s:func" . expand("<slnum>") . "() \n endfunction"
\|    call add(s:apply, function("s:func" . expand("<slnum>")))
\|    execute "function! s:func" . expand("<slnum>") . "()"


" これで関数を定義とスタックにためる処理が一緒に行われる
ENDfunction
    echo "homu"
endfunction


function! s:apply_colorscheme(name)
    echo "colorschem " . a:name
endfunction


ENDfunction
    call s:apply_colorscheme("mami")
endfunction

echo expand("<slnum>")
echo "mado"


" なんかいっぱい処理


" 最後に登録されている関数を呼び出す
call map(s:apply, "v:val()")

[出力]

25
mado
homu
colorschem mami


名前は適当。
最初に空の関数を定義しているのは function() 時にその関数参照を取得するため。
その後、実際の処理を定義する関数で上書きする。