LoginSignup
31
30

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-30

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

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

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

Eclipse

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

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

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

$ 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はclang(クラン)に付属しているC/C++/Objective-C/Objective-C++用のフォーマッタです。コマンドラインからはclang-formatコマンドを使って利用することができます。

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

$ 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#のコードにフォーマットをかけるには次のようにします。

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

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

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

SublimeAStyleFormatter

Artistic StyleのフロントエンドとしてSublime Text2用のプラグインであるSublimeAStyleFormatterながあります。こちらについては「Sublime Text2にフォーマッタを導入する」が参考になります。

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

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

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

Eclipse

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

// @formatter:off
...
// @formatter:on

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

スクリーンショット 2015-02-06 12.16.09.png

ClangFormat

フォーマッティングを抑制したいブロックを// clang-format off// clang-format onで囲います。(参考:CLANG-FORMAT STYLE OPTIONS

// clang-format off
...
// clang-format on

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

Artistic Style

フォーマッティングを抑制したいブロックを// *INDENT-OFF*// *INDENT-ON*で囲います。(参考:Artistic Style 2.05

// clang-format off
...
// clang-format on

まとめ

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

31
30
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
31
30