19

我知道人们对如何在 Objective-C 中格式化方法调用有不同的看法,即

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

对比

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

我使用 .clang 格式文件中的哪些选项来控制这种缩进?(如果我不想要它,冒号排队等)

另外,只是我还是这个格式化程序对块一无所知?注意成功块的 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

我查看了clang-format源代码,其中完成了objective-c方法表达式的格式化,并在这里找到了它: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.cppBreakBeforeParamater = true中的任何地方都改变了(感谢@Matthias 提供代码参考)。 BreakBeforeParameter = false

这个解决方案并不漂亮,但很有效。现在 Clang-Format 不会将 ObjC 参数拆分为新行。

您可以从Dropbox下载修改后的工具。

PS。原始代码是从这个 repo 克隆的:http: //llvm.org/git/clang.git

于 2015-12-22T22:23:08.547 回答