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

Vim - Vim scriptなら関数呼び出しや関数名に変数展開を使える!

vim

この記事はVim Advent Calendar 2013の39日目です。
前日はcocoponさんの【Vimカッコイイ計画最終章】もしCSSでVimのカラースキームがつくれたら…?でした。

Vimカッコイイ。

Vim scriptにおける関数のおさらい

Vim scriptでの関数定義は以下のようになっています。

function! s:foo_func()
  echo 'foo'
endfunction

スコープによってs:を付けずに大文字始まり(Foo_funcなど)になったりしますが、
それを除けば他のプログラミング言語と同じようなルールになっています。

呼び出しのコードは次のようになります。

" fooと出力される
call s:foo_func()

コード全体ではこのようになります。

function! s:foo_func()
  echo 'foo'
endfunction

" fooと出力される
call s:foo_func()

Vim scriptなら変数展開で関数呼び出しできる!

こちらをご覧ください。

function! s:foo_func()
  echo 'foo'
endfunction

function! s:bar_func()
  echo 'bar'
endfunction

let s:name = 'foo'

" fooと出力される
call s:{s:name}_func()

変数s:nameが展開されて、これはs:foo_func()として実行されます。
もちろんs:nameの値を'bar'に変えるとs:bar_func()として実行されます。

Vim scriptなら変数展開で関数定義できる!

さらにこの変数展開は関数定義時の関数名にも使えます。

let s:name = 'foo'

function! s:{s:name}_other_func()
  echo 'other'
endfunction

" otherと出力される
call s:foo_other_func()

すごい!Vimカッコイイ!

おわり

可読性が下がるので使わない方がいいと思います。
詳しく知りたい方は:help curly-braces-names:help curly-braces-function-names