コマンドラインからC系言語のコードフォーマットをかける方法


フォーマッティングルールを決めてそれに従ってコーディングを行なうことは、コードの可読性を向上させるために特に複数人プロジェクトでは大切だと考えています。

一方で、フォーマッティングルールをそれぞれの開発者が覚えてそれに従ってコードを書くのも、他の開発者が書いたコードがフォーマッティングルールに従っているかを確認するのも、それなりにコストのかかる作業ですので、自動的にフォーマットを揃えてくれるコードフォーマッタを使うのが良いということになります。

コードフォーマッタを通すタイミングや方法については「コードを書く人が都度フォーマッタを通す」「ファイル保存時に自動的にフォーマットされるように設定する」「コミット時に自動的にフォーマットされるように設定する」「コマンドラインからコマンドを使ってフォーマットをかける」などいろいろ考えられ、フォーマットし忘れを防ぐには保存時やコミット時に自動的にフォーマットをかけるのがいいと思いますが、それはそれとして、コマンドラインからコマンドを使ってフォーマットをかけられると便利なケースもあります。というわけで（無理矢理感ありますが）ここではC系言語を対象にコマンドラインからフォーマットをかける方法を紹介したいと思います。

## Eclipse

[Eclipse](https://www.eclipse.org/)は言わずと知れた統合開発環境です。主にJavaプログラムの開発用に用いられますが、プラグインを入れることによりいろいろな言語のプログラムの開発に使用することができます。

Eclipseではワークスペース全体またはプロジェクト毎にフォーマットルールを設定でき、GUI上でフォーマットをかけることができますが、実はコマンドラインからもフォーマットをかけることができます。

プロジェクトに設定されたフォーマットルールに従うようにコマンドラインからフォーマットをかけるには次のようにします。

```sh
$ eclipse -nosplash -application org.eclipse.jdt.core.JavaCodeFormatter -config $PROJ_DIR/.settings/org.eclipse.jdt.core.prefs Hoe.java Fuga.java
```

ここで`$PROJ_DIR`はフォーマットルールが設定されているプロジェクトのトップディレクトリです。

なおコマンドラインからフォーマットをかけられるのは現在のところJavaのみのようです。例えばCDTというC/C++プログラム開発のためのプラグインをインストールしていればGUIからC/C++のコードにフォーマットをかけることはできますが、コマンドラインからはフォーマットをかけることができないようです。残念。

## ClangFormat

[ClangFormat](http://clang.llvm.org/docs/ClangFormat.html)はclang（クラン）に付属しているC/C++/Objective-C/Objective-C++用のフォーマッタです。コマンドラインからは`clang-format`コマンドを使って利用することができます。

例えばGoogleのフォーマットスタイルでフォーマットをかけるには次のようにします。

```sh
$ clang-format -i -style=google Hoe.h Hoe.cpp
```

`-i`をつけることで元ファイルが上書きされます。

ClangFormatの難点はインストールが割と面倒だという点です（LLVMのソースコードからビルドする必要があります：2014年3月現在）。しかしながらビルドされた`clang-format`は単体で動作するので、プロジェクトで使う場合は元になったソースコードのバージョンの差異による挙動の違いを防ぐためにも誰か一人がビルドしたバイナリを皆で利用するのが良いでしょう。

## Artistic Style

(Artistic Style)[http://astyle.sourceforge.net/]はC/C++/C#/Objective-C/Objective-C++/Java用のコード整形ツールです。

例えばGoogleのフォーマットスタイルでC#のコードにフォーマットをかけるには次のようにします。

```sh
$ astyle --style=google --mode=cs --suffix=none Hoe.cs Fuga.cs
```

`--suffix=none`をつけることで元ファイルが上書きされます。

`astyle --help`とすることでコマンドラインオプションの詳細な説明が表示されます。

### SublimeAStyleFormatter

Artistic StyleのフロントエンドとしてSublime Text2用のプラグインである[SublimeAStyleFormatter](https://github.com/timonwong/SublimeAStyleFormatter)ながあります。こちらについては[「Sublime Text2にフォーマッタを導入する」](http://qiita.com/mikamikuh@github/items/bfa1c8067fa3bb71e52d)が参考になります。

なおSublimeAStyleFormatterの挙動のカスタマイズ方法は割とundocumentedなのですが、以下のページを見るとなんとなく分かるようになります。

- https://github.com/timonwong/SublimeAStyleFormatter/blob/master/README.md#settings
    - Sublime Text2での設定方法。ここに具体的に何を書けばいいかについては↓のページを参照。
- https://github.com/timonwong/SublimeAStyleFormatter/blob/master/options_default.json
    - Sublime Text2でのデフォルトの設定。これを設定用のJSONに書けばOK。各オプションの意味については↓のページを参照。
- http://astyle.sourceforge.net/astyle.html#_Options
    - Artistic Styleのオプションの説明。Sublime Text2で指定するオプションとほぼ対応しているので、ここの説明を読めば何をSublime Text2の設定用JSONに書けば良いかが分かる。

## フォーマッティングの抑制

ソースコードをスクリプト等で処理する場合など、ソースコードの一部分についてフォーマッティングを抑制したいことがあります。ここではフォーマッタ毎の抑制方法について説明します。

### Eclipse

フォーマッティングを抑制したいブロックを`// @formatter:off`と`// @formatter:on`で囲います。

```java
// @formatter:off
...
// @formatter:on
```

ただし、Javaのフォーマッタの設定でこのタグを有効にしておく必要があります。

![スクリーンショット 2015-02-06 12.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/39704/cfc75a72-be5c-858d-5388-f6b5b5075f23.png "スクリーンショット 2015-02-06 12.16.09.png")


### ClangFormat

フォーマッティングを抑制したいブロックを`// clang-format off`と`// clang-format on`で囲います。（参考：[CLANG-FORMAT STYLE OPTIONS](http://astyle.sourceforge.net/astyle.html)）

```objc
// clang-format off
...
// clang-format on
```

なおこの指定が有効なのはClangFormatの3.6からのようです。3.5で試したところ認識されませんでした。

### Artistic Style

フォーマッティングを抑制したいブロックを`// *INDENT-OFF*`と`// *INDENT-ON*`で囲います。（参考：[Artistic Style 2.05](http://clang.llvm.org/docs/ClangFormatStyleOptions.html#disabling-formatting-on-a-piece-of-code)）

```cs
// clang-format off
...
// clang-format on
```

## まとめ

コマンドラインからファイルにフォーマットをかけるためのツールとしてEclipse、ClangFormat、Artistic Styleを紹介しました。個人的にはJava＋Eclipseで開発しているならEclipse、C#以外のC系言語で開発しているならClangFormatかArtistic Style、C#で開発しているならArtistic Styleかなーと思います。