vim が持つ expandtab 絡みのさまざまなオプションであるが、とりあえず wasavi には expandtab オプション以外は実装しない。つまり smarttab と softtabstop は実装しない(tabstop、shiftwidth はすでに実装してある)。
で、実際に input モードで tab キーを押した際になにが起こるのかをまとめると:
- タブ(U+0009)をカーソル位置に挿入する
- 行頭のインデント中のタブを一旦すべて空白に置き換える
- 行頭のインデント中のマークをすべて退避する
- expandtab がオンなら、何もしない。オフなら、行頭のインデントを先頭から走査して、タブに置き換えられる箇所を置き換える。つまり tabstop の字数ぶん連続した U+0020 を U+0009 に置き換える。その過程で、退避したマークのオフセットのつじつま合わせも行う
- 退避したマークを再設定する
という感じになる。実はこの処理の大部分は、シフトコマンドのそれである。なのでまずその辺を詰めることになる。例えば tab キーを押した際の処理は左や右へシフトを行うわけではない。いわば 0 カウントだけシフトすることになる。という訳でそんな感じのいろいろな修正を施した。