Last active
July 18, 2024 17:20
-
-
Save YodaEmbedding/c2c77dc693d11f3734d78489f9a6eea4 to your computer and use it in GitHub Desktop.
.clang-format for Rust style (rustfmt)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
AccessModifierOffset: -2 | |
AlignAfterOpenBracket: BlockIndent # New in v14. For earlier clang-format versions, use AlwaysBreak instead. | |
AlignConsecutiveMacros: false | |
AlignConsecutiveAssignments: false | |
AlignConsecutiveDeclarations: false | |
AlignEscapedNewlines: DontAlign | |
AlignOperands: false | |
AlignTrailingComments: false | |
AllowAllArgumentsOnNextLine: false | |
AllowAllConstructorInitializersOnNextLine: false | |
AllowAllParametersOfDeclarationOnNextLine: false | |
AllowShortBlocksOnASingleLine: Empty | |
AllowShortCaseLabelsOnASingleLine: false | |
AllowShortFunctionsOnASingleLine: Empty | |
AllowShortIfStatementsOnASingleLine: Never | |
AllowShortLambdasOnASingleLine: All | |
AllowShortLoopsOnASingleLine: false | |
AlwaysBreakAfterReturnType: None | |
AlwaysBreakBeforeMultilineStrings: true | |
AlwaysBreakTemplateDeclarations: Yes | |
BinPackArguments: false | |
BinPackParameters: false | |
BreakBeforeBinaryOperators: NonAssignment | |
BreakBeforeBraces: Attach | |
BreakBeforeTernaryOperators: true | |
BreakConstructorInitializers: AfterColon | |
BreakInheritanceList: AfterColon | |
BreakStringLiterals: false | |
ColumnLimit: 80 | |
CompactNamespaces: false | |
ConstructorInitializerAllOnOneLineOrOnePerLine: true | |
ConstructorInitializerIndentWidth: 4 | |
ContinuationIndentWidth: 4 | |
Cpp11BracedListStyle: true | |
DerivePointerAlignment: false | |
FixNamespaceComments: true | |
IncludeBlocks: Regroup | |
IncludeCategories: | |
- Regex: '^<ext/.*\.h>' | |
Priority: 2 | |
SortPriority: 0 | |
CaseSensitive: false | |
- Regex: '^<.*\.h>' | |
Priority: 1 | |
SortPriority: 0 | |
CaseSensitive: false | |
- Regex: '^<.*' | |
Priority: 2 | |
SortPriority: 0 | |
CaseSensitive: false | |
- Regex: '.*' | |
Priority: 3 | |
SortPriority: 0 | |
CaseSensitive: false | |
IncludeIsMainRegex: '([-_](test|unittest))?$' | |
IndentCaseLabels: true | |
IndentPPDirectives: BeforeHash | |
IndentWidth: 4 | |
IndentWrappedFunctionNames: false | |
KeepEmptyLinesAtTheStartOfBlocks: false | |
MaxEmptyLinesToKeep: 1 | |
NamespaceIndentation: Inner | |
PointerAlignment: Left | |
ReferenceAlignment: Left # New in v13. int &name ==> int& name | |
ReflowComments: false | |
SeparateDefinitionBlocks: Always # New in v14. | |
SortIncludes: true | |
SortUsingDeclarations: true | |
SpaceAfterCStyleCast: false | |
SpaceAfterLogicalNot: false | |
SpaceAfterTemplateKeyword: false | |
SpaceBeforeAssignmentOperators: true | |
SpaceBeforeCpp11BracedList: true | |
SpaceBeforeCtorInitializerColon: true | |
SpaceBeforeInheritanceColon: false | |
SpaceBeforeParens: ControlStatements | |
SpaceBeforeRangeBasedForLoopColon: true | |
SpaceInEmptyParentheses: false | |
SpacesBeforeTrailingComments: 2 | |
SpacesInAngles: false | |
SpacesInCStyleCastParentheses: false | |
SpacesInContainerLiterals: false | |
SpacesInParentheses: false | |
SpacesInSquareBrackets: false | |
Standard: Cpp11 | |
TabWidth: 4 | |
UseTab: Never |
Should we let AllowShortBlocksOnASingleLine: Empty
? It will allow us to do this:
int count = 0;
for (; count < 10; ++count) {}
I've tested with rustfmt, it forces an empty block on the same line.
👍🏻
When clang-format 16 is widely supported, you could consider adding BreakAfterAttributes: Always
thank you so much for this :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This style tries its best to match Rust style, which is highly readable and maintains conventions found in modern programming styles from other languages. For things that are unique to C++, I have aimed for either maximum clarity, or how I think the Rust style guide would have handled such a situation.
Most options require clang-format v9+ (released in 2019). Some options (e.g.
AlignAfterOpenBracket: BlockIndent
) may require clang-format v14+ (released in 2022).Related alternative styles:
https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/c++/c++.md
https://google.github.io/styleguide/cppguide.html
Useful links:
The indent size is 4 spaces. If you prefer 2 spaces, run:
Here are some flags that are personal taste, and are not strictly specified by rustfmt, so I chose something reasonable:
Personal taste
Other suggested settings that are not currently in the config above:
Future replacement settings for deprecations:
These will be updated in the posted config in a few years once everyone has moved to using newer clang-format versions.
Changelog: