Je recherche un moyen de formater le code C ++ ci-dessous avec le format clang (version 9.0.0) de telle sorte que les définitions de fonction qui dépassent la limite de 80 colonnes soient brisées après les déclarations d'argument au lieu des qualificateurs de fonction C ++ comme noexcept
:
--- BasedOnStyle: LLVM AlignAfterOpenBracket: Align AllowAllArgumentsOnNextLine: 'true' AllowAllConstructorInitializersOnNextLine: 'true' AllowAllParametersOfDeclarationOnNextLine: 'true' AllowShortCaseLabelsOnASingleLine: 'false' AllowShortFunctionsOnASingleLine: Empty AllowShortLambdasOnASingleLine: Empty AlwaysBreakTemplateDeclarations: 'Yes' BinPackArguments: 'true' BinPackParameters: 'true' BreakConstructorInitializers: BeforeComma BreakConstructorInitializersBeforeComma: 'true' ConstructorInitializerIndentWidth: 2 FixNamespaceComments: 'true' IndentCaseLabels: 'true' IndentPPDirectives: AfterHash PenaltyBreakAssignment: 1000 PenaltyBreakBeforeFirstCallParameter: 50 PointerAlignment: Left ...
L'extrait ci-dessus montre mon code formaté avec le style par défaut LLVM
et le code ci-dessous est celui que je veux avoir après un formatage approprié:
void scheduler::stop_mark(service& current, service const& stopped) const noexcept { // ... }
La différence entre les deux extraits est que la ligne est interrompue après le service& current,
au lieu de noexcept
.
Ce comportement est reproductible lors de l'utilisation du style par défaut LLVM
mais j'utilise les options ci-dessous pour référence:
void scheduler::stop_mark(service ¤t, service const &stopped) const noexcept { // ... }
Est-il possible d'obtenir un tel formatage via le format clang?
J'ai déjà inspecté toutes les options possibles sur https://zed0.co.uk/clang-format-configurator/ et je n'ai pas trouvé l'option de format clang correspondante.
3 Réponses :
Je suis d'accord qu'aucune combinaison de règles n'obtiendra le résultat souhaité, mais il existe un moyen de le forcer lorsque vous repérez des choses comme celle-ci.
Ajoutez un commentaire de ligne (peut être vide) après votre premier paramètre. clang-format alignera alors vos paramètres pour vous.
void scheduler::stop_mark(service& current, // service const& stopped) const noexcept { // ... }
Vous pouvez justifier de ne pas attribuer de points comme bon vous semble. J'aurais préféré le silence, personnellement. Cela ne change rien au fait qu'il ne semble pas y avoir de configuration qui fasse ce que vous voulez.
À ma connaissance, vous ne pouvez pas faire cela.
Ma première pensée était de définir BinPackParameters
sur false
, mais il semble que le clang-format
ait une préférence pour interrompre les qualificateurs de fonction, même dans ce cas.
Pour ce que ça vaut, il semble que clang-format 10.0.1 fasse ce que vous voulez:
$> clang-format --version clang-format version 10.0.1 (Fedora 10.0.1-3.fc32) $> echo " void scheduler::stop_mark(service ¤t, service const &stopped) const noexcept { /* ... */ }" | clang-format --style=LLVM void scheduler::stop_mark(service ¤t, service const &stopped) const noexcept { /* ... */ }
Oui, vous avez raison, il semble que cela ait été corrigé dans l'une des dernières versions de LLVM
FWIW, il semble traiter l'entrée entre parenthèses (ex: param decl) comme une unité, ne se divise pas lors de la correspondance des parens, c'est-à-dire que
(
et)
sont sur la même ligne dans la limite des colonnes.