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

エンジニアですよ!

頑張れ俺くん、巨匠と呼ばれるその日まで

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みましょう