我知道人们对如何在Objective-C中格式化方法调用有不同的看法,即
[self presentViewController:scanViewController
animated:YES
completion:nil];
vs
[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);
}];
答案 0 :(得分:10)
我查看了clang格式的源代码,其中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?
答案 1 :(得分: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格式化将所有参数放在不同的行上并对齐冒号。
答案 2 :(得分:1)
我有同样的问题:我想在块参数的方法中禁用冒号对齐。
最后,我通过改变Clang-Format
源代码中的行为来解决它:
我在ContinuationIndenter.cpp的任何地方都将BreakBeforeParamater = true
更改为BreakBeforeParameter = false
(感谢@Matthias参考代码)。
这个解决方案并不美观但有效。现在,Clang-Format不会将ObjC参数分割为新行。
您可以从Dropbox下载修改后的工具。
PS。原始代码是从此repo克隆的:http://llvm.org/git/clang.git