書いたこと
- インデントとは何なのか
- インデントの挿入方法
- コーディングを行うためのインデント設定ベストプラクティス
インデントとは何なのか
プログラミングの世界では、行の先頭からの空白 をインデントと呼びます。
ですが、コンピューターの世界では、直接的にインデントを表す制御文字は存在しません。
かろうじて「水平タブ (\0x09 in ascii)」が存在しますが、これは直接インデントを表すものではなく、世の中にはインデントを「スペース(\0x20 in ascii)」で表す人もいます。
つまり「インデント」とは 概念 なのです。
Vimにおけるインデント
そんな中、Vimはファイルの解析を行い、先頭からの空白をインデントとして認識し、見た目の空白数 を挿入します。
その際には、以下のオプションが使われます。
| オプション | 説明 |
|---|---|
| shiftwidth | インデントの見た目の空白数の設定値 |
インデントの挿入と削除
インデントの挿入・削除には、手動と自動がある。
手動挿入
ノーマルモード
>> or << を行うことで選択行にインデントが挿入される。
インサートモード
| キー操作 | 説明 |
|---|---|
| <C-t> | インデントの挿入 |
| <C-d> | インデントの削除 |
自動挿入
インサートモードにて、以下のオプションによって自動的に挿入される。
| オプション | 説明 |
|---|---|
| autoindent (ai) | 改行時に、前の行と同じ数だけ自動でインデントを挿入される |
| smartindent (si) | 改行時に、ブロックに応じて自動でインデント数を調整して挿入される |
| smarttab (st) | 行の先頭で<Tab>キーを入力するとインデントを挿入する |
インデント 見た目の空白数の正体
手動や自動でインデントを埋め込む時、Vimは行の先頭に「タブ制御文字 (\0x09)」もしくは「スペース (\0x20)」を書き込みます。
埋め込まれる文字はオプションの値によって決まる
例: set shiftwidth=6 softtabstop=4 noexpandtab としたとき、インデントによって埋め込まれる制御文字
[\0x09][\0x20][\0x20]
上記、
noexpandnoet<TAB>キーの入力をスペースに置き換えないsofttabstopsts<TAB>キーの入力による見た目の空白数
であるから、
- インデントの見た目の空白数は 6
- <TAB>キーの入力による見た目の空白数は 4
- <TAB>キーの入力をスペース (\0x20) に置き換えない
そのため見た目の空白数の足りない分(2つ分)がスペースで補われています。
プログラマーのためのインデント設定 ベストプラクティス
プロジェクトやOSSによってインデントにスペースを使うかタブを使うかまたスペースを使う場合、スペースの数を2にするか4にするか8にするかマチマチです。
そこでインデントにタブかスペースを使うかは expand で切り替えられるようにし、スペースが使われる場合は、文字数を tabstop のみで変えらえるようにします。
例: タブをインデントとする場合
set noet ts=4 sts=-1 sw=0
-
softtabstopsts→ 負数にするとshiftwidth (sw)に従う -
shiftwidthsw→ 0にすることで、tabstopに従う
こうすることによって、
- タブからスペースの切り替えは、
expandtabで OK - 挿入する見た目の空白数は
tabstopの値を変更するだけで OK
となります。
ぜひ、お試しください。
Appendix
tabstop と softtabstop の違い
| オプション | 説明 |
|---|---|
| tabstop | タブ制御文字(\0x09 in ascii)に対する見た目上の空白数を設定する |
| softtabstop | インサートモード時に、<Tab>キー、<BS>キーの入力に対する見た目上の空白数を設定する |