Vim 7.3 の p1170 で追加された便利なアレについて

この記事は Vim Advent Calendar 2012 247日目の記事になります。
気がつけばVim 7.4b ベータ版リリースがされ、いよいよ 7.4 が近づいて来ましたね。
わたしも最近やっと 7.3.969 以降の Vim を使い始めました。


さて、そんな中 Vim 7.3 の p1170 でよさげな機能が追加されました。
このパッチが適用される前は function() にスクリプトローカル関数名を返すとそのスクリプト内でのみ評価できる関数の参照を返しました。

" Vim 7.3.969

" ------------ A.vim ------------
function! Apply(func)
    call a:func()
endfunction


" ------------ B.vim ------------
function! s:func()
    echo "func"
endfunction

echo function("s:func")
" => "s:func"

call function("s:func")()
" => "func"

" 外部のスクリプトで関数を評価してほしい
call Apply(function("s:func"))
" function Apply の処理中にエラーが検出されました:
" 行    1:
" E117: 未知の関数です: s:func
" E15: 無効な式です: a:func()


" <SNR> 付きの関数名であれば評価することができる
call Apply(function("<SNR>263_func"))
" => "func"


このようにスクリプト外部で関数を評価しようとするとエラーになってしまいました。


しかし、p1170 ではこの仕様が緩和されて、function() にスクリプトローカル関数を渡すと 付きの関数の参照を返すようになりました。
これにより、外部のスクリプトに簡単にスクリプトローカル関数の参照を渡して評価できるようになりました。

" Vim 7.4.14b BETA
" 手元に p1170 がないので最新版で動作確認

" ------------ A.vim ------------
function! Apply(func)
    call a:func()
endfunction


" ------------ B.vim ------------
function! s:func()
    echo "func"
endfunction

echo function("s:func")
" => "<SNR>318_func"

call function("s:func")()
" => "func"

" 外部のスクリプトにそのまま渡して評価することができる
call Apply(function("s:func"))
" => "func"


reti.vim には同等の機能が実装されているんですが、使用制限があったり、プラグインに依存してしまう問題があるので Vim 本体で実装されたのはだいぶ助かります。
プラグインの設定で関数の参照を受け取りたい事もよくあったんですが、件の問題もありなかなか組み込めませんでした。
しかし、これである程度それが緩和されると思います。
便利。