LoginSignup
16
14

More than 1 year has passed since last update.

[Vim] インデントという概念がある

Last updated at Posted at 2019-08-25

書いたこと

  • インデントとは何なのか
  • インデントの挿入方法
  • コーディングを行うためのインデント設定ベストプラクティス

インデントとは何なのか

インデントを表す直接的な制御文字はコンピューターの世界には存在しません。
かろうじて「水平タブ (\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 のみで変えらえるようにします。

例: タブをインデントとする場合

.vimrc
set noet ts=4 sts=-1 sw=0
  • softtabstop sts → 負数にすると shiftwidth (sw) に従う
  • shiftwidth sw → 0にすることで、 tabstop に従う

こうすることによって、

  • タブからスペースの切り替えは、 expandtab で OK
  • 挿入する見た目の空白数は tabstop の値を変更するだけで OK

となります。

ぜひ、お試しください。

Appendix

tabstopsofttabstop の違い

オプション 説明
tabstop タブ制御文字(\0x09 in ascii)に対する見た目上の空白数を設定する
softtabstop インサートモード時に、<Tab>キー、<BS>キーの入力に対する見た目上の空白数を設定する

参照

16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14