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 にはまだ来ていないということなのか?