Vimのインデントについて

Vimはデフォルトでもとても優秀なインデント機能があります。
更にVimには4つのインデントスタイルが存在しており、helpによると以下のようになっています。

'autoindent'  一つ前の行に基づくインデント
'smartindent' 'autoindent'と同様だが幾つかのC構文を認識し、適切な箇所のインデントを増減させる。
'cindent' 他の2つの方法よりも賢く動作し、設定することで異なるインデントスタイルにも対応できる。
'indentexpr'  この中で一番融通が利く: ある行のインデントを計算するのにVimスクリプトを実行する。
この方法が有効である(空でない)時にはその他 のインデントは抑制される。

特にCライクなプログラミング言語な場合は、非常に細かいインデント設定が出来るようになっており、'cindent'を設定すればより賢くインデントをしてくれるようになります。
必要に応じて"set cindent"を設定するようにしましょう。それぞれを同時に設定することは出来ません。

自分好みにインデントを決めたい場合

'cinoptions'または'cino'に対してオプション値を与える必要があります。
非常にきめ細かな設定が出来るようになっており"help cinoptions-values"という具合にヘルプを引けば詳細を知る事が出来ます。

例1

// インデント指定がない場合
int main()
{
  int a = 0;
  switch (a) {
    case 0:
      a = 2;
      break;
  }
}

// インデント指定がある場合
int main()
{
  int a = 0;
  switch (a) {
  case 0:
    a = 2;
    break;
  }
}

上記はswitch-case文でインデントを指定した時と指定していない時の違いです。
"case 0:"以降のインデントが変わっています。
上記の設定はvimrcに

set cinoptions+=:0

というオプション設定に値を加えた場合が下の例になります。

例2

// インデント指定がない場合
class Hoge {
  public:
    Hoge();
  private:
    int hoge;
};

// インデント指定がある場合
class Hoge {
public:
  Hoge();
private:
  int hoge;
};
set cinoptions+=g0

上記のオプション設定を加えると例のようになります。
また、例1と例2を複合させたい場合

set cinoptions+=:0,g0

というように指定する事が出来ます。

とりあえずヘルプで'cinoptions-values'を検索してみよう

ビックリするほどに複雑な設定例が出てきます。
恐らく自分好みのインデントスタイルを作るには困らないと思います。
インデントも環境によって様々な場合がありますので、自分好みに変えられるようにしておきましょう。