Проблема формата Clang с параметрами объявления многострочной функции

Clang Format постоянно делает это:

bool importSomethingIn( const boost::property_tree::ptree& inBoostTree,
                        int inSomeIndex,
                        std::shared_ptr<Something>
                            inSomething,
                        int x,
                        int y );

Когда я хочу это сделать:

bool importSomethingIn( const boost::property_tree::ptree& inBoostTree,
                        int inSomeIndex,
                        std::shared_ptr<Something> inSomething,
                        int x,
                        int y );

Обратите внимание, что он добавляет новую строку и отступ перед символом inSomething. Кажется, что это всегда шаблонные типы, которые вызывают такое поведение.

Как я могу остановить его от этого?

Вот мой текущий формат .clang:

BasedOnStyle: LLVM
Language: Cpp
AccessModifierOffset: -4
AlignEscapedNewlinesLeft: false
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortFunctionsOnASingleLine: false
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: true
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false
BinPackParameters: false
BreakBeforeBinaryOperators: false
BreakBeforeBraces: Allman
BreakBeforeTernaryOperators: false
BreakConstructorInitializersBeforeComma: false
ColumnLimit: 120
CommentPragmas: ''
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DerivePointerBinding: false
ExperimentalAutoDetectBinPacking: false
IndentCaseLabels: true
IndentFunctionDeclarationAfterType: true
IndentWidth: 4
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: false
MaxEmptyLinesToKeep: 2
NamespaceIndentation: All
ObjCBlockIndentWidth: 4
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left
PointerBindsToType: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: true
Standard: Cpp11
TabWidth: 8
UseTab: Never

Редактировать: я использую плагин Xcode формата clang, который я получил здесь в github в июле 2016 года (сначала установил Alcatraz, затем плагин формата clang с Аклатразом). Я не совсем уверен, где находится двоичный файл в формате clang, поэтому не видел номер версии той, которая поставлялась с плагином.

Однако, основываясь на приведенных ниже предложениях, я установил clang-format с помощью Homebrew, что дало мне версию 3.9.0. Затем я установил плагин Xcode на «использовать системный формат clang» и получил желаемый результат, так что я думаю, что это, должно быть, ошибка.


person Matthew James Briggs    schedule 19.07.2016    source источник
comment
Какую версию clang-формата вы используете? Используя ваш пример кода и формат .clang, я получаю желаемый результат с форматом clang 3.8.0 (в Windows).   -  person jpw    schedule 24.07.2016
comment
то же самое - получение желаемого вывода на Mac с clang-форматом версии 3.9.0 (tags/google/stable/2016-06-27), установленным вместе с Homebrew; запускал clang-format из командной строки с файлом опций, как указано выше.   -  person dmitris    schedule 25.07.2016


Ответы (2)


Ваш случай мне кажется нормальным на ubuntu 16.04 с clang-format 3.8

  • Установите clang-format-3.8

      sudo apt-get install clang-format-3.8
    
  • In ~/.vimrc

      map <F3> :pyf /usr/share/vim/addons/syntax/clang-format-3.8.py<cr>                  
      imap <F3> <C-o>:pyf /usr/share/vim/addons/syntax/clang-format-3.8.py<cr>            
    
  • Используйте формат .clang и исходный код @OP.

      mkdir ~/test
      vim ~/test/.clang-format
      vim ~/test/test.cpp
    
  • Отформатируйте test.cpp в vim (используя F3), тогда результат:

      bool importSomethingIn( const boost::property_tree::ptree& inBoostTree,
                              int inSomeIndex,
                              std::shared_ptr<Something> inSomething,
                              int x,
                              int y );
    
person Jethro Yu    schedule 25.07.2016
comment
Отметив это как правильный ответ, я получил версию 3.9 с Homebrew и сказал плагину Xcode использовать системный формат clang, который устранил проблему. - person Matthew James Briggs; 26.07.2016

Я думаю, что это вызвано ColumnLimit. Я думаю, что это ошибка ... У меня была эта проблема, и я решил ее, изменив эту переменную. Попробуйте установить:

 ColumnLimit: 0

Причина

Длина bool importSomethingIn( const boost::property_tree::ptree& inBoostTree, int inSomeIndex, std::shared_ptr<Something>" has 117+-3 chars in dependence of computing invisible chars. составляет 117+-3 в зависимости от вычисления невидимых символов. ColumnLimit: 120 был установлен и это одна из возможных причин, я думаю, он был обрезан.

person Přemysl Šťastný    schedule 24.07.2016
comment
Это не причина. Если бы это было так, то Clang Format также разделил бы ту самую 1-ю строку, которая длиннее. Но это не так. - person underscore_d; 24.07.2016
comment
Он был обрезан после 115 символов текста. ColumnLimit: 120 установлен. inSomething, имеет 12 символов. Вот почему это было вырезано. Попробуйте научиться вычислять :) . - person Přemysl Šťastný; 24.07.2016
comment
Я предполагаю, что мы должны учитывать количество столбцов в каждой строке, а не с начала всего объявления. В строке нарушения я считаю 50 символов до > включительно, где он разделяется. Но в любом случае, с самого начала всего объявления 163 символа, а не 115. Так что это тоже не объясняет. - person underscore_d; 24.07.2016
comment
bool importSomethingIn( const boost::property_tree::ptree& inBoostTree, int inSomeIndex, std::shared_ptr‹Something› имеет 117+-3 символов в зависимости от вычисления невидимых символов. Теперь вы меня понимаете? - person Přemysl Šťastný; 24.07.2016
comment
Хорошо, теперь математика имеет смысл. Но моя проблема в том, что мне очень трудно поверить, что Clang Format сделал бы что-то настолько глупое, чтобы (A) разделить строку запятой, но (B) соответственно не сбросить количество символов до 0 для новой строки. .. и вместо этого разбивает более позднюю строку на основе количества символов, достигнутых в гипотетической, неразделенной 1-й строке... Так что для меня либо что-то еще является причиной, либо вы обнаруживаете ошибку в Clang Format ! Что, если это так, должно быть уже исправлено, так как jpw говорит, что они получают желаемый результат, используя 3.8. Так что ОП должен был бы указать свою версию - person underscore_d; 24.07.2016
comment
Я думаю, что это ошибка ... У меня была эта проблема, и я решил ее, изменив эту переменную ... но это может быть вызвано и чем-то другим ... - person Přemysl Šťastný; 24.07.2016