uncrustifyおかわり

はじめに

uncrustifyはObjective-Cに対応したソースコードの整形ツールです。

以前にCocoa勉強会での発表時から時間がたち、uncrustifyのObjective-C対応が進みました。 また、XCodeのバージョンも進みuncrustifyを呼び出す方法が変わりました。

現在のuncrustifyとXCodeのバージョンにあった設定と手法を紹介します。

開発環境

開発環境は以下の通りです

MacOSX:10.8.2
XCode:4.5.2
uncrustify:0.59

インストール

MacPortsにパッケージがありますので、これを使います。インストール方法は以下の通りです。

$ sudo port install uncrustify

主な使用方法

uncrustifyは単純なコマンドラインのプログラムです。 以下の様にして、整形したいファイルを指定するだけです。

$ uncrustify [options] [files ...]

主に使うオプションは以下の通りです。

-c CFG 設定ファイルCFGを使う
-f FILE FILEを入力ファイルとして扱う
-o FILE 出力をFILEに書き出す。
-F FILE FILEに1行毎にファイルパスを書いておくと一括で処理。
--replace 入力ファイルを出力結果で置換える。(バックアップは取る)
--no-backup 入力ファイルを置換えてバックアップは取らない。
-l OC 言語の指定。Objective-CはOC、Objective-C++はOC+。

整形フォーマットは設定ファイルで指定します。

設定ファイルの設置

MacPortsでインストールした場合は、”/opt/local/share/uncrustify/”に設定ファイルのサンプルがおいてあります。 これらの設定をコピペして変更しながら使うとお好みの形式に近づけられます。

設定ファイルの項目数は400個くらいあります。全体を眺めるのに必要な略語を以下に示します。

略語一覧

略語 意味
indent 行の最初のインデント関連
sp 要素間の空白関連
align 桁揃え関連。変数宣言等で型と変数名を縦方向にそろえるとか
nl 改行関連
mod 順序をsortしたり、{}を追加したり等の コードを変更をする
cmd コメントの中身の改変
pp プリプロセッサ関連
oc Objective-C関連

Objective-Cに関連する項目を次の表に示します。 sp_xxxx系の項目はお好みで。

項目 設定値
sp_before_oc_colon メッセージ式の’:’の前に空白を挿入/削除する
sp_after_oc_colon -(int) f:(int) x;と-(int) f: (int) x;の様に:と型名の間にスペースを入れるか否か
sp_after_oc_scope -(void)foo;や+(int)bar;の+-等の記号の後にスペースを入れるか否か
sp_after_oc_type メッセージ式の引数の型名の後に空白を挿入/削除する
sp_after_oc_return_type -(void) foo;等の型と関数名の間にスペースを入れるか否か
sp_before_send_oc_colon ‘[object setValue:1];’ vs ‘[object setValue :1];’これremoveじゃないとダメだろ
sp_after_send_oc_colon ‘[object setValue:1];’ vs ‘[object setValue: 1];’普通は左側
sp_after_oc_at_sel ‘@selector(msgName)’ vs @selector (msgName)’‘普通は左側
sp_before_oc_block_caret ‘^int (int arg){…}’ vs. ‘ ^int (int arg){…}’
sp_after_oc_block_caret ‘^int (int arg){…}’ vs. ‘^ int (int arg){…}’
align_oc_msg_colon_span # Obj-C message on the ‘:’ but stop after this many lines (0=don’t align)
align_oc_msg_spec_span # the span for aligning ObjC msg spec (0=don’t align)
align_oc_decl_colon # Aligning parameters in an Obj-C ‘+’ or ‘-‘ declaration on the ‘:’

コマンドラインからの使い方

MacPortsでインストールした場合は、”/opt/local/share/uncrustify/”に設定ファイルのサンプルがおいてあります。 以下のような感じで”/opt/local/share/uncrustify/”以下の設定ファイルを色々と試して、好みに近い物を探すと最初から設定ファイルを手書きするより楽です。

$ uncrustify -l OC -c /opt/local/share/uncrustify/kr-indent.cfg testClass.m

実行するとtestClass.m.uncrustifyが出来たと思いますので、diffをとって変更された箇所を確認してください。

さらに、以下のようにopeddiffすればビジュアルに変更点を確認出来きて便利です。

$ uncrustify -l OC -c /opt/local/share/uncrustify/kr-indent.cfg testClass.m
$ opendiff testClass.m testClass.m.uncrustify

FileMerge.appが開いてこんな感じになります。

../../../_images/opediff.tiff

XCode4からの使い方

XCode3の時に使えたScriptMenuが使えなくなったので、以下の2種類の方法があるようです。

残念ながら私には能力が無いのでどちらも試していません。 XCodeのビヘイビアもAppleScriptもAutometrも全部使った事が無いのです。

そのうち試して追記します。