Как отформатировать исходный код с фигурными скобками на новых строках с блоками и Xcode?

Есть ли способ сделать Xcode не форматировать форматированный код, или есть инструмент, такой как uncrustify, который может форматировать исходный код, который использует блоки?

С блоками в objective-c код стал трудно читать. Одним из решений является выписать определение блока и поместить фигурные скобки на новые строки, например:

dispatch_async(dispatch_get_global_queue(0, 0), ^(void)
{
    //block of code
});

и

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

Красивая и простая!

Но Xcode не сохраняет этот формат, и я не могу найти способ сделать uncrustify код вывода таким образом. Uncrustify действительно хорош, но, возможно, блоки слишком новы?

Любые идеи?

[отказ от ответственности: Я знаю, что это может превратиться в "час тролля", но код должен быть максимально прост в чтении, а наличие фигур в одной колонке делает вещи более ясными (для меня). Особенно, если у вас есть несколько блоков внутри блока. Поэтому, если вам не нравится код, похожий на этот, попробуйте просто игнорировать вопрос.]

Ответ 1

Последнее (около 2 месяцев или около того) обновление для 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

(я использовал indent_with_tabs = 0, потому что я не мог заставить его работать с вкладками. Возможно, это не обязательно.)

И, конечно, для новой строки после/до {} установите все, что вы хотите, чтобы nl_some_parameter_brace "принудительно".

Теперь uncrustify обработает ваш код, он не будет вставлять вам новые строки в блоки, такой код останется уродливым:

dispatch_async(dispatch_get_global_queue(0, 0), ^(void) {
    //code
}

Если кто-то найдет способ внести в него новые строки, пожалуйста, скажите мне.

Спасибо @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!");
                }];
        }];
});

Ответ 2

XCode использует встроенные "фрагменты кода" для автозаполнения. Откройте библиотеку фрагментов кода, щелкнув значок {} в области библиотеки. Вы не можете редактировать фрагменты непосредственно в самом XCode, но приложение SnippetEdit позволяет редактировать их.

Я предлагаю вам сделать резервную копию файла 'codenippets' перед их редактированием. Он расположен в /Applications/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources/SystemCodeSnippets.codesnippets