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 して欲しい場合は ! をつけてコマンドを呼び出してください。