web-dev-qa-db-ja.com

clang形式では、ペナルティは何をしますか?

clang-format sytle options documentation には、PenaltyXXXと呼ばれる多くのオプションが含まれています。ドキュメントには、これらのペナルティの使用方法が説明されていません。これらのペナルティ値の使用方法とそれらが達成する効果(例として)について説明できますか?

42
Scott Langham

行の長さの制限を超える行がある場合、clang-formatは1つ以上の改行somewhereを挿入する必要があります。ペナルティは、特定の改行動作を妨げる方法と考えることができます。例えば、あなたが持っているとしましょう:

Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(args);
// and the column limit is here:                                        ^

Clang形式はおそらく少し奇妙に見えるようにフォーマットします:

Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(
    args);

このような場合は、1行または2文字で行の長さに違反してもかまいません。そのため、PenaltyExcessCharacterを小さい数に設定し、PenaltyBreakBeforeFirstCallParameterをより高い数。

個人的には、戻り値の型がそれ自身の行にあるときは本当に嫌なので、PenaltyReturnTypeOnItsOwnLineを不条理に大きな数に設定します。

余談ですが、このシステムはLatexから継承されたもので、改行、改ページ、ハイフネーションのすべての種類のペナルティを指定できます。

27
JHumphrey

これらのペナルティ値の使用方法と、それらが達成する効果(例として)について説明できますか?

このGit 2.15の例を見ることができます(2017年第4四半期)clang-format for Gitプロジェクト Cで記述:

Johannes Schindelin(dscho による commit 42efde4 (2017年9月29日)を参照してください。
Johannes Schindelin-dscho- によってマージ commit 42efde4 、2017年10月1日)

ここで、古い値と新しい値を確認できます。

clang

これらの値を説明するには:

clang-format:改行ペナルティを調整します

私たちは本当に、本当に、列を1行あたり80に制限したいと思います。Gitメーリングリストの数少ない一貫したスタイルのコメントの1つは、行が80列を超えないようにすることです(たとえ79列/行でもコードがdiffとして頻繁に表示され、diffが余分な文字を追加することを考えると、より意味があります。

ブランドンウィリアムスが指摘しているように、余分なキャラクターに対する5のペナルティは、それを保証するには低すぎます。

このスレッドを参照

既存のclang形式の例とドキュメントから、100はStuff You Really Don't Wantに適切であると見なされるペナルティであると思われるので、それを「余分な文字」、つまり過度に長い行に対するペナルティ。

その間、ペナルティをさらに調整します。コメントや文字列リテラル内の改行を防ぐことにそれほど熱心ではないため、ペナルティ100は非常に高いようです。

同様に、改行を代入演算子から遠ざけることについては、それほど厳格ではありません(多くのGitのコードは、80列/行の制限を維持するために=文字の直後に改行します)。

関数の戻り値の型が独自の行にあることについては、ペナルティ0が示唆するよりも少ししか目立たないので、これも調整されました。

最後に、呼び出しの最初のパラメーターの前で特別な分割を行うことはありませんが、80列/行よりも短い行を維持する場合は、これを行うため、呼び出しの最初のパラメーターの前で分割するペナルティを下げます。コメントに改行を入れるのと同じくらいです。

7
VonC