というわけで、wasavi.js を分割した。
- extension_wrapper.js
- classes.js
- classes_ex.js
- classes_search.js
- classes_subst.js
- classes_ui.js
- classes_undo.js
- init.js
- utils.js
- wasavi.js
の複数のファイルで成り立つようにした。
* * *
挿入モードでテキストを入力する際、vi には以下の ctrl 併用のショートカットが定義されている。また、vim では [cci]:help ins-special-keys[/cci] で参照できるが、以下のリスト以外にも(それはもう膨大に)ショートカットが用意されている。
- ^D: shift
- ^H: カーソル左の 1 文字削除
- ^J, ^M: 改行
- ^T: unshift
- ^U: 入力のやり直し
- ^V: リテラルの入力
- ^W: カーソル左の 1 単語削除
-
- ^V [0-9]{1,3}
- 10進でバイトを入力
-
- ^V [oO] [0-7]{1,3}
- 8進でバイトを入力
-
- ^V [xX] [0-9a-f]{1,2}
- 16進でバイトを入力
-
- ^V u [0-9a-f]{1,4}
- 16進で Unicode コードポイントを入力
-
- ^V U [0-9a-f]{1,8}
- 16進で Unicode コードポイントを入力
-
- ^V (上記以外の 1 文字)
- 入力した 1 文字そのものを入力
wasavi ではまだ完全に実装できていない。この中で、^V について考えてみる。
^V は後続する文字の特別な意味を打ち消し、単なる文字としてバッファに挿入する。ここまでは、wasavi でも実装済みなのだが vim ではこの機能が更に拡張されている(:help i_CTRL-V_digit)。すなわち、
という感じ。これを wasavi に持って来たい。
まず javascript アプリケーションなので、取り扱う文字は UTF-16 に固定される。したがってバイトの入力であっても Unicode のコードポイントとして扱う必要がある。つまり x/u/U の違いは最大入力文字数だけになる。
^V の次に [0-9oOxXuU] を入力しコードポイント入力モードに入った場合、それを完了させる方法は 2 つある。まずそれぞれのモードの最大入力文字数に達した時点で、自動的に完了する。次にそれぞれのモードが受け付けるコードポイントの構成文字以外の文字 c を入力すると、その時点で蓄えられたコードポイント文字列から文字を生成し、それがバッファに入力される(コードポイント文字列が空の場合は何も入力されない)。入力される場合は、abbreviation の展開処理を迂回する。その直後 c が入力される。こちらは abbreviation の展開処理を経由する。
なお vim では U プリフィクスを使用した場合、最大 8 桁の 16進数(ただしヘルプでは最大値は 0x7fffffff とのことだ)を入力できるそうだが、でも Unicode って最大 U+10FFFF だよね。クリップしてエラーにしたほうがいいのかな?
またもちろん、U+10000 以上のコードポイントを入力した場合は、サロゲートペアに分割して 2 文字を入力する必要がある。
だいたいこんな感じの仕様でいいかな!
Pingback: 赤心慶福 — going back and forth