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