19

Objective-C でメソッド呼び出しをフォーマットする方法について、さまざまな意見があることは知っています。つまり、

[self presentViewController:scanViewController
                   animated:YES
                 completion:nil];

[self presentViewController:scanViewController animated:YES completion:nil];

このインデントを制御するために使用する .clang-format ファイルのオプションは何ですか? (嫌ならコロンを並べる等)

また、それは私だけですか、それともこのフォーマッタはブロックを知らないのですか? 成功ブロックの if ステートメントがインデントされておらず、失敗ブロックの NSLog 関数もインデントされていないことに注意してください。

[self.client getPath:path
    parameters:parameters
    success:^(AFHTTPRequestOperation *operation, id responseObject) {
    if ([from_id isEqualToString:self.from_id]) {
        self.image.image = [UIImage imageWithData:responseObject];
    }
    }
    failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(error.description);
    }];
4

3 に答える 3

11

Objective-Cメソッド式のフォーマットが行われているclang形式のソースコードを調べて、ここで見つけました:http://llvm.org/svn/llvm-project/cfe/trunk/lib/Format/ContinuationIndenter.cpp

コード:

// If this '[' opens an ObjC call, determine whether all parameters fit
// into one line and put one per line if they don't.
if (Current.Type == TT_ObjCMethodExpr &&
    getLengthToMatchingParen(Current) + State.Column >
        getColumnLimit(State))
  BreakBeforeParameter = true;

ご覧のとおり、動作は構成オプション ColumnLimit によってのみ制御されます。改行を抑制するには、0 に設定します。残念ながら、これはもちろん完全なフォーマットに影響を与えます。

ブロック内のインデントの欠落に関する問題について: 最新の Visual Studio プラグイン (SVN r203967) では再現できませんでした。おそらく ContinuationIndentWidth をいじったことがありますか?

于 2014-03-20T12:40:21.167 に答える
2

私の変数 ColumnLimit はゼロです。メソッド呼び出しは次のようにフォーマットされます。

[self presentViewController:scanViewController animated:YES completion:nil];

ColumnLimit 変数を変更せずに、次のようにフォーマットしたいと思います。

[self presentViewController:scanViewController
               animated:YES
             completion:nil];

これを実現するための clang 構成オプションはないようです。しかし、私は自分に合った解決策を見つけました:

最初のパラメーター (ここでは scanViewController) の直後に // と改行を追加すると、clang を使用してコードをフォーマットすると、目的の結果が得られます。

[self presentViewController:scanViewController //
                   animated:YES
                 completion:nil];

これは、clang フォーマットがすべてのパラメーターを別々の行に配置し、コロンを揃えることを意味します。

于 2015-02-15T12:21:41.970 に答える
1

私は同じ問題を抱えていました:ブロックパラメータを持つメソッドでコロンの配置を無効にしたかったのです。

最後に、Clang-Formatソース コードの動作を変更することで解決しました: ContinuationIndenter.cppのすべての場所
に変更BreakBeforeParamater = trueしました(コードへの参照について @Matthias に感謝します)。 BreakBeforeParameter = false

このソリューションは美しくはありませんが、機能します。現在、Clang-Format は ObjC パラメータを新しい行に分割しません。

修正したツールはDropboxからダウンロードできます。

PS。元のコードは、このリポジトリから複製されました: http://llvm.org/git/clang.git

于 2015-12-22T22:23:08.547 に答える