2015-05-07 15 views
13

Próbując skonfigurować plik formatu .clang dla projektu używającego Objective-C, natknąłem się na problem, w którym, nawet przy 0 maksymalnej szerokości linii, długi Objective- Metody C są przecinane na wiele linii. Na przykład w ten sposób:clang-format: Przestań łamać długie metody w górę

AFHTTPRequestOperation *returnOperation = [self POST:endpoint parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
     [formData appendPartWithFormData:[[secureStore valueForKey:storeKey] dataUsingEncoding:NSUTF8StringEncoding] name:tokenKey]; 
     if ([provider isEqualToString:kTwitterKey]) { 
      [formData appendPartWithFormData:[[secureStore twitterSecretToken] dataUsingEncoding:NSUTF8StringEncoding] name:kTwitterSecretKey]; 
      [formData appendPartWithFormData:[email dataUsingEncoding:NSUTF8StringEncoding] name:kEmailKey]; 
     } 
     [formData appendPartWithFormData:[[secureStore token] dataUsingEncoding:NSUTF8StringEncoding] name:tokenKey]; 
    } success:^(AFHTTPRequestOperation *operation, NSDictionary *response) { 
     [secureStore setToken:response[kTokenKey]]; 
     if (completionHandler) { 
      completionHandler(nil, response); 
     } 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     if (completionHandler) { 
      completionHandler(error, nil); 
     } 
    }]; 

zostaje przekształcony w ten sposób:

AFHTTPRequestOperation *returnOperation = [self POST:endpoint 
     parameters:nil 
     constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
      [formData appendPartWithFormData:[[secureStore valueForKey:storeKey] dataUsingEncoding:NSUTF8StringEncoding] name:tokenKey]; 
      if ([provider isEqualToString:kTwitterKey]) { 
       [formData appendPartWithFormData:[[secureStore twitterSecretToken] dataUsingEncoding:NSUTF8StringEncoding] name:kTwitterSecretKey]; 
       [formData appendPartWithFormData:[email dataUsingEncoding:NSUTF8StringEncoding] name:kEmailKey]; 
      } 
      [formData appendPartWithFormData:[[secureStore token] dataUsingEncoding:NSUTF8StringEncoding] name:kTokenKey]; 
     } 
     success:^(AFHTTPRequestOperation *operation, NSDictionary *response) { 
      [secureStore setToken:response[kTokenKey]]; 
      if (completionHandler) { 
       completionHandler(nil, response); 
      } 
     } 
     failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      if (completionHandler) { 
       completionHandler(error, nil); 
      } 
     }]; 

Chciałbym pozostawić podział metod na wiele linii do autora, ale wciąż mają kontrolę formatyzatora dla prawidłowego rozmieszczenia nawiasów , na przykład. Sugestie, jak naprawić to dziwne wewnętrzne wcięcie, również będą mile widziane.

Edytuj: Oto mój plik w formacie .clang, jeśli ktoś jest zainteresowany. Próbuję odtworzyć głównie style New York Times Objective-C.

--- 
Language: Cpp 
AccessModifierOffset: -2 
AlignAfterOpenBracket: false 
AlignEscapedNewlinesLeft: false 
AlignOperands: false 
AlignTrailingComments: true 
AllowAllParametersOfDeclarationOnNextLine: false 
AllowShortBlocksOnASingleLine: false 
AllowShortCaseLabelsOnASingleLine: false 
AllowShortFunctionsOnASingleLine: false 
AllowShortIfStatementsOnASingleLine: false 
AllowShortLoopsOnASingleLine: false 
AlwaysBreakAfterDefinitionReturnType: false 
AlwaysBreakBeforeMultilineStrings: false 
AlwaysBreakTemplateDeclarations: false 
BinPackArguments: true 
BinPackParameters: true 
BreakBeforeBinaryOperators: false 
BreakBeforeBraces: Stroustrup 
BreakBeforeTernaryOperators: false 
BreakConstructorInitializersBeforeComma: false 
ColumnLimit: 0 
CommentPragmas: '^ IWYU pragma:' 
ConstructorInitializerAllOnOneLineOrOnePerLine: false 
ConstructorInitializerIndentWidth: 4 
ContinuationIndentWidth: 4 
Cpp11BracedListStyle: true 
DerivePointerAlignment: false 
ExperimentalAutoDetectBinPacking: false 
IndentCaseLabels: true 
IndentWrappedFunctionNames: false 
IndentWidth: 4 
KeepEmptyLinesAtTheStartOfBlocks: false 
MaxEmptyLinesToKeep: 1 
NamespaceIndentation: None 
ObjCBlockIndentWidth: 4 
ObjCSpaceAfterProperty: true 
ObjCSpaceBeforeProtocolList: false 
PenaltyBreakBeforeFirstCallParameter: 0 
PenaltyBreakComment: 0 
PenaltyBreakFirstLessLess: 0 
PenaltyBreakString: 0 
PenaltyExcessCharacter: 0 
PenaltyReturnTypeOnItsOwnLine: 0 
PointerAlignment: Right 
SpaceAfterCStyleCast: false 
SpaceBeforeAssignmentOperators: true 
SpaceBeforeParens: ControlStatements 
SpaceInEmptyParentheses: false 
SpacesBeforeTrailingComments: 1 
SpacesInAngles: false 
SpacesInContainerLiterals: true 
SpacesInCStyleCastParentheses: false 
SpacesInParentheses: false 
SpacesInSquareBrackets: false 
Standard: Cpp11 
TabWidth: 8 
UseTab: Never 
+1

Mam ten sam problem także! Dziwne jest to, że działało to doskonale z ustawieniem ColumnLimit na 0 przed chwilą. Teraz mam ten wymuszony bałagan wielopłaszczyznowy, który doprowadza mnie do szaleństwa! – tobihagemann

+0

Zauważyłem to samo, wygląda na to, że format clang 3.7 ma inne zachowanie w miejscu, w którym umieszcza znaki nowej linii - szukam również rozwiązania tego problemu, ale tymczasowo przełączyłem się na starszą wersję formatu clang - jeśli używasz Xcode formatu clang to commit zadziała jak przed https://github.com/travisjeffery/ClangFormat-Xcode/tree/c8343aa596bf96c8afa5cc4bfc3728227ace1224 – SomeGuy

+0

Możemy śledzić zgłoszony błąd o tym na ClangFormat-Xcode tutaj: https://github.com/travisjeffery/ClangFormat-Xcode/issues/81 –

Odpowiedz

2

Używam następujące config, który nie będzie rozbić długiej metody

BasedOnStyle: LLVM 
IndentWidth: 4 
AllowShortIfStatementsOnASingleLine: true 
IndentCaseLabels: false 
ColumnLimit: 0 

I można dostać ustawienie LLVM używając polecenia

clang-format -style=llvm -dump-config > .clang-format 
+0

'ColumnLimit' wykonał zadanie! – Paschalis

+0

również ustawienie 'AlwaysBreakBeforeMultilineStrings' na false spowoduje, że twoje wywołania funkcji, makra itp. Będą łamane przez literały wywołania! – Paschalis

+0

@Paschalis W moim komputerze domyślny format cll llvm już ustawił 'AlwaysBreakBeforeMultilineStrings: false' –