引き続き、input モードに不足している部分を補っていく。
ちなみに input モードというのは、i とか a とか押すと遷移する例のモードのことだ。vi が起動してすぐの状態は “command モード” だと一般的に浸透している(と思われる)のに対し、例のモードは “insert モード” とか “edit モード” とか、微妙に表記が定まっていない気がする。しかし posix の定義に倣うならば、例のモードは “input モード” で、とりあえずそう書くことにする。正確には input モードは総称で、実際には insert モードと overwrite モードがある。
input モードで何がめんどくさいかというと、backspace/delete の振る舞いおよび、一部の特殊なキー入力(矢印キーなど)がサポートされている点だ。
input モードでは、以下の情報が逐一更新される。
- 入力開始位置
- 入力したテキスト。これは input モードを抜けた後にレジスタ “.” に格納される
- 入力したコマンド。これは input モードを抜けた後に “.” コマンドで再生されるべきもの
- undo ログ
これらの更新と、backspace/delete および特殊なキー入力による機能が矛盾なく両立させないといけない。また、abbreviation も考慮する必要がある。”f” を “foo” に展開するような abbrev があったとき、キーボードから “if bar” およびエスケープキーを入力すると:
- 入力したテキストは [cci]f^Hfoo bar[/cci] となる(vim では)
- 入力したコマンドは [cci]if bar^[[/cci] となる
ちなみに map の展開はこの前の段で完了しているので、入力されたテキスト、コマンド共に格納されるのは map 展開後の何かだ。ところで abbrev の展開が ^H 付きの構造になってるのってどういう意味あるのかな。別に単に展開後の文字列に置き換えても構わない気がする……。