sci

最果て風呂

Vim プラグインを作成する

source で読み込んで使ってきたスクリプトプラグイン化してみる。世の中には良い記事があふれていて丁寧な解説がなされているのだけれども、あまり上手くいかなかった。もっと Vim script を書けということなのかな。

プラグインフォルダの中では autoloadplugin とに分れているのだが、関数などの本体は autoload の方に入れて、キーマップ類を plugin の方に入れるみたい。

autoload では関数にプラグインのプレフィクス(今回は mto)を # でくっつける。

function! mto#hoge()
    何か...
endfunction

のような形になる。注意点は function! hoge() だけでなく、call hoge() にも mto# を付けてやらないといけないこと。エラー出まくった。

plugin ではコマンドの頭に <Plug> を付けてプラグインのプレフィクスを付けて、呼び出す関数を付ける、という名前にするらしい。が、ちょっとそこまで面倒を見るのは大変なので、とりあえず二つに分けてみて動くかどうか試してみる。

if exists('s:save_cpo')
   finish
endif

これを入れてなくてハマった。とりあえず動いた。

話はそれるけれども、usr_41 を読んでいて、substitute を使うよりも split join を使った方がいいのかもしれないと思いはじめた。

autoload の方に

if exists('s:save_cpo')
   finish
endif

を記述しないと起動時にエラーになってしまうのは、unlet s:save_cpo をしているせいなのかもしれない。マニュアルでは書いてあるけど、他の人のやつを見ると書いてないもの。試しに削除してみると大丈夫だった。

すべての関数に mto# プレフィクスを付ける必要はないみたい。別のファイルから呼ばれる、つまりキーマッピングされている関数のみで良いのではないか?代わりに s: を付けてみよう。予想した通りだった。

twitvim.vim を利用してつぶやく部分が E700: Unknown function: <SNR>13_post_twitter というエラーになってしまう。スコープの問題なんだろうな。:function で一覧を見てみると、twitvim#post_twitter(mesg, inreplyto) となってる。あ、<SNR>13_post_twitter(mesg, inreplyto) もあるな。

試しにコマンドモードから :call <SNR>13_post_twitter("hoge", 0) とするとつぶやけてしまった。やっぱりスコープか。ここに時間をかけないで、キーマップのところをやるか。

とりあえず最低限に動くようになったので、GitHubリポジトリを作成した。