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

Vim 7.4.2137 で funcref() が追加された

Vim

少し前なんですが Vim 7.4.2137 で任意の関数の Funcref を返す funcref() という組み込み関数が追加されました。

github.com

これは、既存の function() と同じように使用することが出来ます。

function! s:plus(a, b)
    return a:a + a:b
endfunction

let s:plus3 = funcref("s:plus", [3])
echo s:plus3(2)
" => 5

[function()funcref() の違い]

function()funcref() の違いですが、function()対象の関数が上書きされた場合に上書きされた関数を呼び出すのに対して、funcref()上書きされる前の関数を呼び出すという違いがあります。

function! s:test()
    return "homu"
endfunction

let s:function = function("s:test")
let s:funcref  = funcref("s:test")

" 両方共 s:test() を呼び出す
echo s:function()
" => homu
echo s:funcref()
" => homu

" s:test() を書き換える
function! s:test()
    return "mami"
endfunction

" 上書きした s:test() を呼ぶ
echo s:function()
" => mami

" 上書きされる前の s:test() を呼ぶ
echo s:funcref()
" => homu

" s:test を削除
delfunction s:test

" Error
" echo s:function()

" OK
echo s:funcref()
" => homu

このように関数が書き換わったのに関わらず『funcref() を呼び出した時』の関数を呼び出します。
また funcref() は組み込み関数に対しては使用できません。