前回、Emacs にGoogle Style Guideを導入しました。

しかし、google-c-styleだけだとインデントをいい感じにしてくれるくらいのことしかしないので、フォーマッタも導入することにしました。

フォーマッタとしてclang-formatを使いました。

インストール

今回Ubuntuを使用したのでaptでインストールしました。各自のプラットフォームのインストール方法で行ってください。

$ sudo apt install clang-format # Ubuntu
$ brew install clang-format # macOS

使い方

clang-formatにはいくつかデフォルトでコーディングスタイルが用意されています。

スタイル コーディング規約
LLVM LLVM Coding Standards
Google Google C++ Style Guide
Chromium Chromium C++ style guide
Mozilla Coding style
WebKit Code Style Guidelines

-styleオプションにそれぞれllvm,google,chromium,mozilla,webkitを指定することで使用できます。指定しない場合はllvmになります。

-iオプションを使用するとファイルが上書きされます。使用しない場合は標準出力に表示れます。

$ clang-format -style=google hoge.cpp # Google のスタイル
$ clang-format -style=llvm hoge.cpp # LLVM のスタイル

スタイルのカスタマイズをするには、後述する.clang-formatという設定ファイルを用意します。設定ファイルを指定してフォーマットする場合は-style=fileオプションを使用します。

$ clang-format -style=file hoge.cpp # 標準出力に表示される
$ clang-format -style=file -i hoge.cpp # ファイルが上書きされる

.clang-format設定ファイルはディレクトリを遡って探すので、プロジェクトのルートディレクトリに配置すると良いです。

.clang-format設定ファイル

.clang-formatファイルを作成します。

Googleのコーディングスタイルをベースにカスタマイズするには、BasedOnStyleを指定し、好みのオプションを指定していきます。

BasedOnStyle:  Google # ここを上記の別のスタイルにすることで変えられる

# ここから自分の好みのオプションを指定する
IndentWidth:     4
Language:        Cpp
Standard:        Cpp11
TabWidth:        4
UseTab:          Never

上記の方法とは別に、それぞれのコーディングスタイルのオプションを全て出力する方法もあります。

$ clang-format -style=google -dump-config > .clang-format

Google C++ Style Guideに準拠した設定オプションが.clang-formatに書き出されます。これをベースにカスタマイズしても構いません。

設定オプション

公式ドキュメントに記載されている設定オプションについてコードを交えて紹介します。

全てのオプションは紹介しきれないので、私が使っているオプションをメインに紹介します。

BasedOnStyle

ベースにするコーディングスタイルを指定します。下記6つが指定できます。ここではなぜかMicrosoftも指定できるようです。

  • LLVM
  • Google
  • Chromium
  • Mozilla
  • WebKit
  • Microsoft

IndentWidth

インデント幅を指定します。私はインデントは4派です。

UseTab

タブを使うかを指定します。下記の値を使うことができます。

  • Never 使用しない
  • ForIndentation インデントのみに使用する
  • ForContinuationAndIndentation 継続行とインデントにのみ使用する
  • Always 常に使用する

TabWidth

タブ幅を指定します。

AccessModifierOffset

public:private:などのアクセス修飾子のオフセットを指定します。 IndentWidthの分インデントされているので、それを考慮したオフセットを指定します。

BasedOnStyle: Google
IndentWidth: 4
AccessModifierOffset: 0

の場合、

class Hoge {
    public:
    Hoge() {}

    private:
    int fuga() {}
};

になり、

BasedOnStyle: Google
IndentWidth: 4
AccessModifierOffset: -4

の場合、

class Hoge {
public:
    Hoge() {}

private:
    int fuga() {}
};

になります。