autoloadでいこう
chatworkを操るvimプラグインを作っているところで、autoloadで2分ほど悩んだので書きます。
autoloadについては、:help autoload
を見るか、モテる男のVim Script短期集中講座こちらを読めばすぐにわかるでしょう。
autoloadされない!!
今回初めて、プラグインにvitalを組み込んでみました。
しかし、開発中:Vitalize --init .
して、autoload
ディレクトリはでき、autoload
のなかにvital.vim
, vital/chatwork.vital
などが作られたことは確認したのですが、vitalにそんなversionはないよ!!と怒られてしまっていました。
しかしそれもそのはず。autoload
という名前ならなんでも読み込まれるわけじゃないので!恥ずかしい。
:helo autoload
から一部引用しましょう
このような関数が呼ばれ、それがまだ定義されていなかった場合、Vimは'runtimepath' 内の"autoload"ディレクトリから"filename.vim"というスクリプトファイルを探す。 例えば"~/.vim/autoload/filename.vim"のように。そしてこのファイルは次のような関 数を定義していなければならない: >
Vimは'runtimepath'内の"autoload"ディレクトリから
ここですね。開発中のディレクトリはruntimepathに入っていなかったのです。
とりあえず解決するなら、setlocal runtimepath+=.
とかでruntimepathに入れてしまえば解決しますが、pathが通った場所に置けばいいでしょう。
autoloadに書いた関数を呼び出せない!!
autoload/chatwork.vim
の中に諸々関数を定義し、plugin/chatwork.vim
からそれを呼び出すcommandを定義するような形で作っていました。
!command LoginToChatwork :call g:Login()
というような感じです。
しかしそんな関数ないよ!と怒られてしまいます。当然ですね。
autoload以下の関数を呼び出すときは、foo#bar#baz()のような形式でないといけません。
!command LoginToChatwork :call chatwork#Login()
今度もダメですね。こんな関数はないのです。その時僕はautoload以下に、g:Login
という関数を定義していました。それは呼べませんね。
gist.vimなどを参考にしてg:Login
の関数名を修正してみました。
function! g:chatwork#login()
というような感じです。これで勝つる!
しかし、今度は関数名とファイル名が合ってないよ、と怒られます。
それも当然です。
autoload側で定義するときは、ディレクトリ名#ディレクトリ名#ファイル名#関数名と定義しないといけません。
g:とかつけちゃっているもんだからうまくいかないんですね。g:を外して、
function! chatwork#login()
にして、ようやくうまくいきました。g:を付けないと外から呼べないと思っていましたが、関数はデフォルトでグローバルスコープでした。
こんなところです。
困ったらhelpみましょう