repository updated

Chrome、Opera、Firefox のそれぞれのエクステンションの公式リポジトリに提出してある wasavi を 0.5.359 に更新した。

Opera 版はまだ審査されていないので最新にはなっていない。明日か明後日くらいには更新されるだろう。Firefox 版は、例によってフルレビューがさっぱり進んでいないので、安定版は 0.5.281 とかその辺りにとどまっている。他のバージョンを見る というリンクから今回上げた最新版を参照できる。Firefox 版のみ、最新版は beta 版扱いになっているが、内容は他ブラウザと同じ。

clipboard access #4

vim にあって vi にはない、insert/overwrite モード、および ex コマンド入力時の特殊なショートカットして、^R をプリフィクスとしてレジスタの内容を貼り付ける機能がある。それを作る。

タイトルの通り、これにはクリップボードレジスタ “*” も含まれる。クリップボードを指定された場合は非同期的にそれを読みだしつつよきに計らう仕組みにする必要がある。それから、paste イベントのハンドラはクリップボード以外のレジスタを指定された場合にも実際に貼り付けを行う窓口として流用できる(文字列中の改行を調整したり、特定の文字を予めエスケープしておく処理は共通なので)。

そのためには、paste イベントハンドラを機械的に発生させられる必要がある。これは W3C の Clipboard API では、window.ClipboardEvent コンストラクタを使用することで可能だ。従来は、この手の定石は document.createEvent() でイベントオブジェクトを生成し、initEvent() とか initUIEvent() とかその他もろもろで初期化し、任意のノードで dispatchEvent() という手順だったのだが、deprecated みたい。コンストラクタでイベントオブジェクトを生成する場合はパラメータをディクショナリで指定したりするところがナウいと思う。
var pasteEvent = new ClipboardEvent('paste', { bubbles: true, cancelable: true, dataType: 'text/plain', data: 'My string' } );
document.dispatchEvent(pasteEvent);

さて、この ClipboardEvent をブラウザが備えてないと困るわけだけど…… Opera と Firefox は備えている。意外なことに Chrome が備えていない。paste イベントは認識するのに ClipboardEvent も WebKitClipboardEvent もない。どういうことなのかな。webkit のソースを見るとそれっぽいものはあるようなので単に安定版 Chrome にはまだ来ていないということなのか?

too strict review

AMO へ wasavi 0.5.329 をレビューに出してかれこれ 2 ヶ月くらい経っているのだが、音沙汰がない。レビューに出している間に何度かメールでのやり取りをしているのだが、dropbox に対しての読み書きについてテストの手順を教えてくれとのリクエストに 7 月 30 日に返事して以来音沙汰がない。キューの位置は 10 of 145 である。よほど巨大なアドオンが前に詰まっているのか?

あまりに時間がかかるので、AMO へ提出する Firefox 版は当分ベータバージョンにするかもしれない。つまり 0.5.351beta のようになる。

ctrl-v

vim から拝借してきた機能の一つにプリフィクス付きの文字入力というものがある。

insert/overwrite モード、あるいは ex コマンド入力中に ^V を押すと、次に入力する文字がその文字そのものとして入力される(ただし insert/overwrite モードで ^M、^J を入力した場合のみは enter を入力した場合と同様に改行が行われる)。これはおもにコントロールコードの入力に使用されるのだが、wasavi では ^V に続けて数字、または o/O/x/X/u/U を押した場合はさらに特殊な状態に遷移する。

  • 数字: 最大 3 桁まで入力でき、10 進文字列として評価した値をコードポイントとしてみなした時の対応する文字に変換される
  • o/O: 最大 3 桁まで入力でき、8 進文字列として評価した値をコードポイントとしてみなした時の対応する文字に変換される
  • x/X: 最大 2 桁まで入力でき、16 進文字列として評価した値をコードポイントとしてみなした時の対応する文字に変換される
  • u: 最大 4 桁まで入力でき、16 進文字列として評価した値をコードポイントとしてみなした時の対応する文字に変換される
  • U: 最大 6 桁まで入力でき、16 進文字列として評価した値をコードポイントとしてみなした時の対応する文字に変換される

^VU でのコードポイント入力は Unicode の BMP を超えた先も対応していて、その場合はサロゲートペアが生成される。

What wasavi is, and is not

昨日の記事を書く過程で wasavi に言及しているブログなんかをぐぐってみた。で、何件かあった。それ自体は、非常にありがたいことである。あるのだけど、その中にちょっと気になるものがあった:

これは、テキストエリアを編集中に規定のキー(例:Ctrl+Enter)を押すと、Vimモードになり、:q を入力するまで、Vimのキーバインドを提供してくれるもの。

vimscriptによるプラグインは使えませんが、Vimとしての再現度はなかなかよいと思います。

何が気になるといえば、つまり「Vim」の一語だ。

wasavi は vi のクローンであって、vim の何かではない。vim からいくつかの機能を拝借してはいるが、wasavi は vi のクローンであって、vim の何かではない。

したがって、vimscript が動かないんですけお! と言われても困るし、「vim の再現度」について評価されても「えっなんのこと?」としか答えることができない。なにより説明で “vi editor for any web page” と言っているのだ。なぜ vi ≒ vim という取り違えが起きるのだろうか?

これはつまり、現役の vi 系エディタのデファクトスタンダードが決定的に vim であるという現実がやはり根底にあるのだと思う。古い人間なら、vim なんて遅れてきた vi クローンの上にやたらめったら魔改造を施された、ある意味での異端児だ、などと思うだろう。つまり彼らにとっては、vi と vim は明らかに別のものである。しかし新しい人間にとっては、vi といえばつまり vim であり、vim のオリジンは vim 自身であり、historical vi はそのタイニー版でしかないということなのではないか。

将来 wasavi にスクリプティングやシンタックスハイライトの機能を実装するとして、その仕様はおそらく vim のそれとはかなり違うものになると思う。つまり今以上に「vim となんかちがうんですけど」的な扱い難いクレームが増えるかもしれない。これはなかなかに由々しき問題だ。

promote an extension

wasavi は Chrome、Opera、Firefox にそれぞれリリースしている。その中で、Chrome と Firefox はアクティブユーザー数を知ることができるのだけど、それぞれ 300 人台とか、100 人台とかである。これは、他のエクステンションを適当に眺めてみる分には、かなりつつましい数字だ。

これをたとえば万のオーダーにするには、やはりどこかのサイトで紹介されて爆発的に知れ渡る的なイベントが必要なんだろう。そして、それが起こるのを待つと言うよりはむしろ、こちらからいろいろな IT 系ニュースサイトに「wasavi を紹介してくださいお願いします」といった営業活動をしなくてはならないんだろうと思う。

しかしめんどくさそーなので別にやらないのであった。そもそもよく考えたら、ユーザー数が増えても別にメリットないじゃん。

the beast

Selenium に実行させるテストの総数が 666 になった(アサーションの総数は 2700 くらい)。

全コードの 66% が wasavi、33% がテストコードである。うーん半々くらいに持ってきたいところだが……。

clipboard access #3

クリップボードを介した貼り付けについて、Clipboard API をちょっと使用してみた。

貼り付けなので、ctrl+v か、shift+insert を押した場合に document に対して paste イベントが発生する。イベントハンドラの中で e.clipboardData.getData(‘text/plain’) とかすると貼り付けようとする文字列が得られる。その文字列を vi のコンテキストに従って適切に貼り付ける。また、e.preventDefault() してデフォルトのアクションは取り消しておく。

ただし、ctrl+v は挿入モードや行入力モードでのエスケープシーケンスの入力開始文字とかぶっている。そこで、貼り付けイベントを認識するのは shift+insert だけにした。この特別扱いを行うと、そのキーを再マップできなくなってしまうので、なおのこと ctrl+v は明け渡すことはできないのだ。

これにより、Presto Opera で wasavi を動かしている場合でも、限定的にクリップボードを使用することができるようになった。限定的というのはまず、書き込みはやはりできないということだ。また、コマンドモードで shift+insert した場合でもとりあえずクリップボードからの貼り付けを行うようにしたのだが、内部的には [cci]”*p[/cci] を実行するだけであり、エクステンション側でクリップボードの読み書きが自由にできない Presto Opera では動かない。

ついでと言ってはなんだけど、キーボード入力のハンドラで入れ子になっているコールバック関数を外に出した。つまりキー入力ごとに関数の評価を行なっていただろう箇所を取り除いたのだけど、なんか目に見えて入力のスピードが速くなった? えっそんなに差があるの。

yet another vi clone #4

javascript 製の vi というものをググってみると、以前から JS Vim なるものがひっかかるのだが、概要に述べられているリンクが 404 だったり、ドキュメントの類が一切なかったりで、何者がどういう意図で作ったものなのかよくわからず、気になっていた。

どうも ここ が現時点で有効なサイトのようだ。ページ上に実装済みの機能が示されているが、それほど多くはない。また、ex コマンドのたぐいはまだ実装されていない。

作った人の位置づけとしては vi clone ということらしいのだが、個人的な感覚で言えば、ex コマンド群を実装せずに vi clone と名乗るのは良くない。それはせいぜい「なんちゃって vi clone 見習い心得」くらいのものだ。

それはそれとして、sourceforge 上のソースは 2.0 だが、件のページでは 3.0 と地道に更新されているようなので、頑張ってほしいと思った。