さて、wasavi の根幹の動作ロジックを Promise ベースに大改造した大元の動機のひとつである、migemo 対応について考えてみたい。
とりあえず Chrome extension としての migemo についてまとめてみたい。migemo 自体のホームはここ。そして Chrome 版の migemo というのは、検索文字列に対応する migemo 的な正規表現を返す API を提供することに特化した拡張で、migemo server ということになっている。
まず edvakf さんが制作した ChromeMigemo Extension というものがかつてあった。これ自体はすでにサポートを終了しているが、ソースは公開されている。ただ困ったことに API リファレンスといったドキュメントはないので、このリポジトリ自体はエンドユーザにとってはそれほど有用ではない。API リファレンス的なものは辛うじて彼のはてなダイアリーの古い記事から得られる。
さて、これを現在サポートしているのは mono さんで、blog の記事でfork 版である Migemo Server for Google Chrome™の告知がなされている。wasavi もこれを参照する。
これを wasavi の [cci]/[/cci]、[cci]?[/cci] コマンドに組み込むわけだが。もともとこれらのコマンドは正規表現を入力して検索するものだ。これが migemo に対応すると、入力した文字列が内部で複雑な正規表現に変換された後に検索が行われるという流れになる。つまり何か入力してそれを検索するという手順は同じなのだが、入力するものの性格は全く違うということだ。migemo の場合は入力するのは文字列リテラルなのだ。
そうなると、コマンド自体を別に起こす(例えば、[cci]g/[/cci]、[cci]g?[/cci] とか)ほうが筋がいいのかもしれない。しかし、ここはやはり [cci]/[/cci]、[cci]?[/cci] コマンドにまとめたい。
ところで vim では、正規表現中に [cci]\C[/cci] というものを含めると ignorecase オプションの値にかかわらず、必ず大文字・小文字を区別して検索するようになる。[cci]\C[/cci] には正規表現のメタキャラクタとしての効果は何もなく、それが正規表現中に存在するか否かに意味があるというわけだ。この考え方を流用してみよう。メタキャラクタ [cci]\M[/cci] を導入し、これが検索文字列に含まれている場合は migemo で検索、そうでない場合は従来の検索というように振り分ける。
このやりかたにすると、検索文字列の入力中に「やっぱ migemo で検索しよーっと」とかその逆が簡単に切り替えられるし、また [cci]map g/ /\\M[/cci] などとすることも可能なので、migemo 検索を独立したコマンドにしたいという向きにも対応できる。
というわけで、できた。