Vim プラグインを作成する
source
で読み込んで使ってきたスクリプトをプラグイン化してみる。世の中には良い記事があふれていて丁寧な解説がなされているのだけれども、あまり上手くいかなかった。もっと Vim script
を書けということなのかな。
プラグインフォルダの中では autoload
と plugin
とに分れているのだが、関数などの本体は 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)
とするとつぶやけてしまった。やっぱりスコープか。ここに時間をかけないで、キーマップのところをやるか。