Как отформатировать исходный код с фигурными скобками на новых строках с блоками и 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 действительно хорош, но, возможно, блоки тоже новые?

какие идеи?

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

2 ответов


последнее (около 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 значение "force".

Теперь 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!");
                }];
        }];
});

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

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