とりあえずこんな形にした:
- キーボードからの入力によって vi/ex コマンドが直接実行される際に
- レジスタを示すプリフィクス “* が入力されているか、レジスタに * を指定した ex コマンドである場合
コマンドの実行にさきがけてクリップボードの値を読み込み、そのコールバック内でコマンドを非同期的に実行する。コマンドの実行は setTimeout(command, 0) で独立したイベントキューに登録され、個別に行われる。ex コマンドは | で連結できるが、それもはやりコマンドごとに個別に実行される。
ということで、普通に使う分にはクリップボードを参照しながらの編集ができるようになる。
普通ではない使い方というのは vi コマンド @ や、ex コマンド @、または global/v で指定したサブコマンド、および外部インターフェースから vi コマンドを実行する場合で、これらはキーボードからの入力によって直接実行されるわけではない(つまり、実行のコンテキストがネストされている)ので、クリップボードの読み込みはできない。ネストされたコマンドは常に同期的に実行される。
バックグラウンドとの通信を同期的に行う仕組みがあれば別にこんなことはしなくて済むのだがなー。