最近の vimperator nightly build

http://d.hatena.ne.jp/teramako/20081016/p1id:teramako が解説してくれてるけど liberator オブジェクトに変更があって以前までの plugin が動かなくなってる。で、動くようにいろいろ変更したら互換性なくなってしまったのでちょっと書いとく。

とりあえず名前空間的な話から。コマンド追加するときは互換性を重視して commands.addUserCommand するのがいいって言ってるけど最上位にバラまかれた object を使うのも怖いので liberator.modules.commands.addUserCommand を使う感じで。というかちょっと手の込んだことをしてる plugin ( liberator.hints, liberator.commandline etc を使ってるやつ ) だと互換性もなにもないので最初から liberator. の後ろに modules. をくっつける簡単なお仕事 ( 置換 ) をした。

あと addUserCommand の第 3 引数に渡す関数の第 1 引数 ( ややこしいな。少し下のソース例参照で ) は今までは string だったんだけど以下のプロパティをもつ object に変更になってるみたい。これで互換性とかほとんど吹っ飛んだ感じ。

  • arguments
    • 複数の引数が指定されると配列で、単数だとそのままはいる。
  • literalArg
    • よくわかってない。
  • string
    • 引数そのままの文字列。

literalArg は何をしたいのかソース読んでもいまいちピンとこない。どうも commands.js ( http://www.mozdev.org/source/browse/~checkout~/vimperator/src/content/commands.js?rev=1.183;content-type=application%2Fjavascript ) 内でこちゃこちゃやってるみたいなんだけど。とりあえず引数使って何かやるコマンドを定義する場合は以下の感じに書けばいいんでないかな ?

// コマンドの後に入力された引数を単純にとってきたい場合
liberator.modules.commands.addUserCommand(
    ['foo'],
    'bar',
    function (args, special) {
        var arg = args.string;
        liberator.echo(special ? arg : 'buz');
    },
    { bang: true }
);

// 最初のひとつだけ有効にしたい場合
liberator.modules.commands.addUserCommand(
    ['ほげ'],
    'もげ',
    function (args) {
        var arg = (args.arguments.length > 1)
            ? args.arguments[0].toString()
            : args.string;
        liberator.echoerr(arg);
    },
    {}
);

まぁ最初に引数処理を強制されたわけだけどこっちのがわかりやすい気もする。

あと一つ、 migemo_hint.js がどうしても動かなかったので hintmatching あたりがあやしいと思ってソース追ってみたんだけど hints.js ( http://www.mozdev.org/source/browse/~checkout~/vimperator/src/content/hints.js?rev=1.91;content-type=application%2Fjavascript ) で ":set hintmatching=custom" にした場合の処理がなんかおかしい。 plugins.customHintMatcher(hintString) を取得してるみたいなんだけどそもそも plugins オブジェクトが定義されてないみたいなんだよね。ちゃんと追ってないからわかんないけどバグのにおいがする。パッチ書く場合はどこでグローバルオブジェクト定義すればいいんかな… ?