タブもしくはスペースとインデント

vimにおいてタブもしくはスペースとインデントは明確に区別されている。 インデントは、'>>' もしくは '<<' や自動インデントの設定によって挿入することが出来る。

タブ関連オプション

  • tabstop ts '\t'に対する空白数
  • softtabstop sts '<Tab>'キーの入力に対する空白数。
  • expandtab et trueの時、'<Tab>'キーの入力が自動的にスペースに置き換えられる

インデント関連オプション

  • shiftwidth sw インデントに対する空白数。noetの時、tabstopとの値に応じてスペースが補完される。
  • smarttab st 行の先頭でキーを入力すると、インデントの挿入になる。
  • autoindent ai 改行時に、前行と同数のインデントを自動挿入してくれる。
  • smartindent si 改行時に、ブロックに応じてインデントを自動挿入してくれる。

ソースファイルを編集する際のインデント設定例

プロジェクトやOSSごとにインデントにタブを使うかスペースを使うかまちまちです。 またスペースを使う際は、文字数も2、4、8といった感じでまちまちです。 そこで インデントで使用される空白数は tabstop だけで管理出来るようにすることが ベストプラクティス であると考えられます。

タブかスペースかは、expandtab をオン・オフすることで切り替えます。

例 '\t' をインデントとする設定

set noet ts=4 sts=-1 sw=0
  • sts=-1 値が0だとオフになり、インデントとしてスペースを使用している場合、<C-h>によるインデント戻りが効かなくなるので、負数にすることで shiftwidth に従うようにする。
  • sw=0 tabstopに従うようにする

まとめ

タブを "\t" とした理由は、実際のタブの制御コード値を表したいため。 Vimは編集時に<Tab>キーの入力をスペースに置き換える機能があるので、ややこしい。