Vim script の現在のカーソル位置の関数を呼び出す

この記事は Vim Advent Calendar 2012 281日目の記事になります。


さて、Vim script でユニットテストのコードを書いていると『カーソル位置の関数を評価したい』と思うことがよくあります

" いずれかの関数内にカーソルをあわせてテスト関数を評価したい
function! s:test1()
    " ...
endfunction


function! s:test2()
    " ...
endfunction


function! s:test3()
    " ...
endfunction


まぁそれに限らずカーソル位置の関数を評価したいと思うことは稀によくあると思います。
と、いうことでそれを行うスクリプトを簡単に書いてみました。

[必要なプラグイン]

NeoBundle "tyru/current-func-info.vim"
NeoBundle "thinca/vim-scall"

[ソースコード]

function! s:apply_func(funcname, is_source, args)
    if empty(a:funcname)
        return
    endif

    if a:is_source
        source %
    endif

    let funcname = matchstr(a:funcname, '^s:\zs.*\ze')
    if empty(funcname)
        return call(a:funcname, a:args)
    else
        return call("Scall", [funcname] + a:args)
    endif
endfunction


command! -bang -nargs=*
\   ApplyFuncInCursor call s:apply_func(cfi#get_func_name(), <bang>0, [<args>])

command! -bang -nargs=*
\   EchoApplyFuncInCursor echo s:apply_func(cfi#get_func_name(), <bang>0, [<args>])


" 呼び出し用のキーマッピング
nnoremap <Plug>(apply-function-in-cursor) :ApplyFuncInCursor!<CR>
nmap <Leader>s <Plug>(apply-function-in-cursor)


current-func-info.vim でカーソル位置の関数名を取得して、scall.vim でその関数の呼び出しを行なっています。
よい組み合わせですね。
今回は Vim script のみでしたが、他の言語でもカーソル位置の関数を quickrun.vim を使用してサッと実行できるとよさそうですね。

[注意]

関数を評価する前にそのスクリプトを :source しなければ最新の関数が呼ばれない可能性があります。
関数を評価する前に :source して欲しい場合は ! をつけてコマンドを呼び出してください。