はじめに
Vim プラグインの勉強を続けています。勉強していて、autoload に指定した関数をどう呼ぶかについてすこしハマったので、整理のために書いておきます。
tl;dr
autoload 以下のファイル名と関数名のプレフィックスは一致させる必要があるようです。
autoload に書いた関数が呼ばれない
例として Hello World
と表示する関数を helloworld.vim
に作っていたとします。
最初、関数名を以下のようにしていました。
autoload/helloworld.vim
function! EchoHelloWorld()
echo "Hello World"endfunction
その上でプラグインを Vim に設定した上で、:call EchoHelloWorld()
と実行しても、E117: 未知の関数です: HelloWorld
というエラーが表示されてしまいました。
どう指定するか
Vim のマニュアルに記載がありました。以下抜粋します。
Vim には autoload という仕組みがあります。同じこと
を次のように書くことができます:
call mylib#myfunction(arg)
(中略)
Vim は関数の名前を見て、それが未定義なら、
'runtimepath' の中から "autoload/mylib.vim" を探します。
(中略)
ただし、関数名の '#' より前の部分はスクリプトの名前と同じにする必要があります。
そうしないと Vim はどのスクリプトを読み込めばいいのかわかりません。
つまり autoload
以下のファイル名を起点に、そこに定義されている関数を読み込みに行くというような動きをしていることがわかります。
上記の例では、ファイル名と関数名のプレフィックスが一致していなかったため、呼び出された関数を定義できなかったということでした。
ファイル名#関数名
というルールに則ることが必要なのですね。今回の場合は、helloworld#EchoHelloWorld
と定義するべきでした。
おわりに
確かな情報はやはりマニュアルですね。ブログ記事や他のプラグインの書き方も参考にしつつ、マニュアルで正否を確かめるということが必要だなと思いました。