Hatena::Groupvim

[script]<SID>とs:関数

[script]<SID>とs:関数

まずはじめに、スクリプト内で使われる s: を接頭語とした s:funcname などのスクリプト関数(又は変数)は、そのスクリプト内だけで有効な関数だと思われがちだが、実際は違い、グローバルな場所から参照可能な関数である。

s: で定義した場合、接頭に <SNR>数値_ といった名前がつけられたグローバルな関数が定義される。例えば自分の vim で :call <SNR>[tab] と打ってみて欲しい。ずらーっと表示されるであろう。

スクリプト内部で有効な変数を定義する場合は s: をつけるだけでそうなるために便利である。ただこのスクリプトの外側から呼び出したいときはどうすればいいのだろうか?通常、スクリプト内部の関数に外部からアクセスする必要があるのは間違った設計と言えよう。しかし必要となる場合もあるのだ。それは主にフックでの関数呼び出しである。

例えば / が入力されたときに s:ExampleFunc() が呼ばれるような plugin、の内容はこんな感じだ。

function! s:ExampleFunc()
  echo 'example function'
endfunction

nmap / :call s:ExampleFunc()<CR>

しかしこれを実際にロードして / を打つと

E81: スクリプト以外で<SID>が使われました

エラーメッセージが表示される。そう、 / を押したときにそのバッファスクリプト関数を呼び出そうとされるため、このようなメッセージが表示されてしまう。それを回避するには明示的に <SID> をつける必要がある。

function! s:ExampleFunc()
  echo 'example function'
endfunction

nmap / :call <SID>ExampleFunc()<CR>

とすれば nmap での定義時に <SNR>数値_ExampleFunc()<CR> が定義されるため、別のバッファなどから呼び出すことが可能になるのである。