如何使用块和Xcode在带有大括号的新行上格式化源代码?

Olo*_*f_t 11 xcode objective-c objective-c-blocks uncrustify

有没有办法让Xcode不重新格式化格式化的代码,或者是否有像uncrustify这样的工具可以格式化使用块的源代码?

对于objective-c中的块,代码变得难以阅读.一种解决方案是写出块定义并在新行上放置花括号,如下所示:

dispatch_async(dispatch_get_global_queue(0, 0), ^(void)
{
    //block of code
});
Run Code Online (Sandbox Code Playgroud)

和:

[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop)
{
    //block of code
}];
Run Code Online (Sandbox Code Playgroud)

美丽而轻松!

但是Xcode不保留这种格式,我找不到以这种方式制作unrustify输出代码的方法.Uncrustify真的很好,但也许块太新了?

有任何想法吗?

[免责声明:我知道这可能变成"巨魔小时",但代码应该是一样容易地阅读,并在同一列有括号,使事情变得更加清晰(对我来说).特别是如果你在一个街区内有几个街区.因此,如果你不喜欢这样的代码,请尝试忽略这个问题.]

Olo*_*f_t 3

最新的(大约两个月前左右)更新 uncrustify 几乎解决了问题。只需在配置文件中设置以下项目:

indent_oc_block                          = true 
indent_with_tabs                         = 0        
indent_columns                           = 4        # set to the same as indent_switch_case
indent_switch_case                       = 4        # set to the same as indent_columns
Run Code Online (Sandbox Code Playgroud)

(我使用 indent_with_tabs = 0 因为我无法让它与制表符一起使用。可能没有必要。)

当然,对于 {} 之后/之前的新行,将 nl_some_parameter_brace 的所有内容设置为“force”。

现在 uncrustify 将处理您的代码,它不会为您将新行插入到块中,这样的代码将仍然丑陋:

dispatch_async(dispatch_get_global_queue(0, 0), ^(void) {
    //code
}
Run Code Online (Sandbox Code Playgroud)

如果有人找到一种方法让它适当地插入新行,请告诉我。

感谢@ipmcc 对 uncrustify 的更新。

编辑:是的,每当您复制/粘贴时,xCode 都会混淆代码。我使用这个很棒的 xCode 插件来简化工作流程:https://github.com/benoitsan/BBUncrustifyPlugin-Xcode

编辑 2:Uncrustify 不能很好地处理嵌套块(仍然比 Xcode 更好)。例如,嵌套块变为:

dispatch_async(dispatch_get_global_queue(0, 0), ^(void)
{
    [array enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop)
        {
            [array enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop)
                {
                    NSLog(@"the pumpkin pie!");
                }];
        }];
});
Run Code Online (Sandbox Code Playgroud)