expandtab #3

vim が持つ expandtab 絡みのさまざまなオプションであるが、とりあえず wasavi には expandtab オプション以外は実装しない。つまり smarttab と softtabstop は実装しない(tabstop、shiftwidth はすでに実装してある)。

で、実際に input モードで tab キーを押した際になにが起こるのかをまとめると:

  1. タブ(U+0009)をカーソル位置に挿入する
  2. 行頭のインデント中のタブを一旦すべて空白に置き換える
  3. 行頭のインデント中のマークをすべて退避する
  4. expandtab がオンなら、何もしない。オフなら、行頭のインデントを先頭から走査して、タブに置き換えられる箇所を置き換える。つまり tabstop の字数ぶん連続した U+0020 を U+0009 に置き換える。その過程で、退避したマークのオフセットのつじつま合わせも行う
  5. 退避したマークを再設定する

という感じになる。実はこの処理の大部分は、シフトコマンドのそれである。なのでまずその辺を詰めることになる。例えば tab キーを押した際の処理は左や右へシフトを行うわけではない。いわば 0 カウントだけシフトすることになる。という訳でそんな感じのいろいろな修正を施した。

Leave a Reply

Your email address will not be published. Required fields are marked *