前回、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

前回と同じようにGoogle Style Guideをベースに修正しました。

以下のような設定を.clang-formatという名前で保存します。後述するコマンドのように-style=fileのオプションを渡すことで.clang-formatの設定を読ませることができます。その時にコマンドを実行したディレクトリから親ディレクトリに遡って.clang-formatを探しますので、プロジェクトのルートディレクトリに置くと良いでしょう。

もっと詳細に知りたい場合は公式ドキュメントを確認してください。

---
BasedOnStyle:  Google # ここを上記の別のスタイルにすることで変えられる
IndentWidth:     4
---
Language:        Cpp
Standard:        Cpp11
IndentCaseLabels: false
TabWidth:        4
UseTab:          ForIndentation

フォーマットは以下のコマンドで行います。-iオプションをつけることでファイルを上書きします。いきなり変わると怖いので違うファイルにリダイレクトして差分を確認してからの方がいいかと思います。gitなどを使ってる場合はいきなり上書きして差分を見てもいいかもしれませんね。

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

もし複数で開発しているプロジェクトなどでしたら、git commitするときにコーディング規約を守ってない場合失敗する、などして強制的に守らせるのもありかもしれませんね。