Rustfmt is designed to be very configurable. You can create a TOML file called rustfmt.toml or .rustfmt.toml, place it in the project or any other parent directory and it will apply the options in that file. If none of these directories contain such a file, both your home directory and a directory called rustfmt in your global config directory (e.g. .config/rustfmt/) are checked as well.
A possible content of rustfmt.toml or .rustfmt.toml might look like this:
indent_style = "Block" reorder_imports = false
Each configuration option is either stable or unstable. Stable options can be used directly, while unstable options are opt-in. To enable unstable options, set unstable_features = true in rustfmt.toml or pass --unstable-features to rustfmt.
Below you find a detailed visual guide on all the supported configuration options of rustfmt:
indent_styleIndent on expressions or items.
"Block""Block", "Visual""Block" (default):fn main() { let lorem = vec![ "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", ]; }
"Visual":fn main() { let lorem = vec!["ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit"]; }
"Block" (default):fn main() { if lorem_ipsum && dolor_sit && amet_consectetur && lorem_sit && dolor_consectetur && amet_ipsum && lorem_consectetur { // ... } }
"Visual":fn main() { if lorem_ipsum && dolor_sit && amet_consectetur && lorem_sit && dolor_consectetur && amet_ipsum && lorem_consectetur { // ... } }
See also: control_brace_style.
"Block" (default):fn lorem() {} fn lorem(ipsum: usize) {} fn lorem( ipsum: usize, dolor: usize, sit: usize, amet: usize, consectetur: usize, adipiscing: usize, elit: usize, ) { // body }
"Visual":fn lorem() {} fn lorem(ipsum: usize) {} fn lorem(ipsum: usize, dolor: usize, sit: usize, amet: usize, consectetur: usize, adipiscing: usize, elit: usize) { // body }
"Block" (default):fn main() { lorem( "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", ); }
"Visual":fn main() { lorem("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit"); }
"Block" (default):fn lorem< Ipsum: Eq = usize, Dolor: Eq = usize, Sit: Eq = usize, Amet: Eq = usize, Adipiscing: Eq = usize, Consectetur: Eq = usize, Elit: Eq = usize, >( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, adipiscing: Adipiscing, consectetur: Consectetur, elit: Elit, ) -> T { // body }
"Visual":fn lorem<Ipsum: Eq = usize, Dolor: Eq = usize, Sit: Eq = usize, Amet: Eq = usize, Adipiscing: Eq = usize, Consectetur: Eq = usize, Elit: Eq = usize>( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, adipiscing: Adipiscing, consectetur: Consectetur, elit: Elit) -> T { // body }
"Block" (default):fn main() { let lorem = Lorem { ipsum: dolor, sit: amet, }; }
"Visual":fn main() { let lorem = Lorem { ipsum: dolor, sit: amet }; }
See also: struct_lit_single_line, indent_style.
"Block" (default):fn lorem<Ipsum, Dolor, Sit, Amet>() -> T where Ipsum: Eq, Dolor: Eq, Sit: Eq, Amet: Eq, { // body }
"Visual":fn lorem<Ipsum, Dolor, Sit, Amet>() -> T where Ipsum: Eq, Dolor: Eq, Sit: Eq, Amet: Eq { // body }
use_small_heuristicsWhether to use different formatting for items and expressions if they satisfy a heuristic notion of ‘small’.
"Default""Default", "Off", "Max"Default (default):enum Lorem { Ipsum, Dolor(bool), Sit { amet: Consectetur, adipiscing: Elit }, } fn main() { lorem( "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", ); let lorem = Lorem { ipsum: dolor, sit: amet, }; let lorem = Lorem { ipsum: dolor }; let lorem = if ipsum { dolor } else { sit }; }
Off:enum Lorem { Ipsum, Dolor(bool), Sit { amet: Consectetur, adipiscing: Elit, }, } fn main() { lorem("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing"); let lorem = Lorem { ipsum: dolor, sit: amet, }; let lorem = if ipsum { dolor } else { sit }; }
Max:enum Lorem { Ipsum, Dolor(bool), Sit { amet: Consectetur, adipiscing: Elit }, } fn main() { lorem("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing"); let lorem = Lorem { ipsum: dolor, sit: amet }; let lorem = if ipsum { dolor } else { sit }; }
binop_separatorWhere to put a binary operator when a binary expression goes multiline.
"Front""Front", "Back""Front" (default):fn main() { let or = foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo || barbarbarbarbarbarbarbarbarbarbarbarbarbarbarbar; let sum = 123456789012345678901234567890 + 123456789012345678901234567890 + 123456789012345678901234567890; let range = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ..bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; }
"Back":fn main() { let or = foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo || barbarbarbarbarbarbarbarbarbarbarbarbarbarbarbar; let sum = 123456789012345678901234567890 + 123456789012345678901234567890 + 123456789012345678901234567890; let range = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; }
combine_control_exprCombine control expressions with function calls.
truetrue, falsetrue (default):fn example() { // If foo!(if x { foo(); } else { bar(); }); // IfLet foo!(if let Some(..) = x { foo(); } else { bar(); }); // While foo!(while x { foo(); bar(); }); // WhileLet foo!(while let Some(..) = x { foo(); bar(); }); // ForLoop foo!(for x in y { foo(); bar(); }); // Loop foo!(loop { foo(); bar(); }); }
false:fn example() { // If foo!( if x { foo(); } else { bar(); } ); // IfLet foo!( if let Some(..) = x { foo(); } else { bar(); } ); // While foo!( while x { foo(); bar(); } ); // WhileLet foo!( while let Some(..) = x { foo(); bar(); } ); // ForLoop foo!( for x in y { foo(); bar(); } ); // Loop foo!( loop { foo(); bar(); } ); }
comment_widthMaximum length of comments. No effect unlesswrap_comments = true.
80Note: A value of 0 results in wrap_comments being applied regardless of a line's width.
80 (default; comments shorter than comment_width):// Lorem ipsum dolor sit amet, consectetur adipiscing elit.
60 (comments longer than comment_width):// Lorem ipsum dolor sit amet, // consectetur adipiscing elit.
See also wrap_comments.
condense_wildcard_suffixesReplace strings of _ wildcards by a single .. in tuple patterns
falsetrue, falsefalse (default):fn main() { let (lorem, ipsum, _, _) = (1, 2, 3, 4); let (lorem, ipsum, ..) = (1, 2, 3, 4); }
true:fn main() { let (lorem, ipsum, ..) = (1, 2, 3, 4); }
control_brace_styleBrace style for control flow constructs
"AlwaysSameLine""AlwaysNextLine", "AlwaysSameLine", "ClosingNextLine""AlwaysSameLine" (default):fn main() { if lorem { println!("ipsum!"); } else { println!("dolor!"); } }
"AlwaysNextLine":fn main() { if lorem { println!("ipsum!"); } else { println!("dolor!"); } }
"ClosingNextLine":fn main() { if lorem { println!("ipsum!"); } else { println!("dolor!"); } }
disable_all_formattingDon't reformat anything
falsetrue, falseerror_on_line_overflowError if Rustfmt is unable to get all lines within max_width, except for comments and string literals. If this happens, then it is a bug in Rustfmt. You might be able to work around the bug by refactoring your code to avoid long/complex expressions, usually by extracting a local variable or using a shorter name.
falsetrue, falseSee also max_width.
error_on_unformattedError if unable to get comments or string literals within max_width, or they are left with trailing whitespaces.
falsetrue, falsefn_args_densityArgument density in functions
"Tall""Compressed", "Tall", "Vertical""Tall" (default):trait Lorem { fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet); fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet) { // body } fn lorem( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: Consectetur, adipiscing: Adipiscing, elit: Elit, ); fn lorem( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: Consectetur, adipiscing: Adipiscing, elit: Elit, ) { // body } }
"Compressed":trait Lorem { fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet); fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet) { // body } fn lorem( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: Consectetur, adipiscing: Adipiscing, elit: Elit, ); fn lorem( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: Consectetur, adipiscing: Adipiscing, elit: Elit, ) { // body } }
"Vertical":trait Lorem { fn lorem( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, ); fn lorem( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, ) { // body } fn lorem( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: Consectetur, adipiscing: Adipiscing, elit: Elit, ); fn lorem( ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: Consectetur, adipiscing: Adipiscing, elit: Elit, ) { // body } }
brace_styleBrace style for items
"SameLineWhere""AlwaysNextLine", "PreferSameLine", "SameLineWhere""SameLineWhere" (default):fn lorem() { // body } fn lorem(ipsum: usize) { // body } fn lorem<T>(ipsum: T) where T: Add + Sub + Mul + Div, { // body }
"AlwaysNextLine":fn lorem() { // body } fn lorem(ipsum: usize) { // body } fn lorem<T>(ipsum: T) where T: Add + Sub + Mul + Div, { // body }
"PreferSameLine":fn lorem() { // body } fn lorem(ipsum: usize) { // body } fn lorem<T>(ipsum: T) where T: Add + Sub + Mul + Div, { // body }
"SameLineWhere" (default):struct Lorem { ipsum: bool, } struct Dolor<T> where T: Eq, { sit: T, }
"AlwaysNextLine":struct Lorem { ipsum: bool, } struct Dolor<T> where T: Eq, { sit: T, }
"PreferSameLine":struct Lorem { ipsum: bool, } struct Dolor<T> where T: Eq, { sit: T, }
empty_item_single_linePut empty-body functions and impls on a single line
truetrue, falsetrue (default):fn lorem() {} impl Lorem {}
false:fn lorem() { } impl Lorem { }
See also brace_style, control_brace_style.
enum_discrim_align_thresholdThe maximum length of enum variant having discriminant, that gets vertically aligned with others. Variants without discriminants would be ignored for the purpose of alignment.
Note that this is not how much whitespace is inserted, but instead the longest variant name that doesn't get ignored when aligning.
0 (default):enum Bar { A = 0, Bb = 1, RandomLongVariantGoesHere = 10, Ccc = 71, } enum Bar { VeryLongVariantNameHereA = 0, VeryLongVariantNameHereBb = 1, VeryLongVariantNameHereCcc = 2, }
20:enum Foo { A = 0, Bb = 1, RandomLongVariantGoesHere = 10, Ccc = 2, } enum Bar { VeryLongVariantNameHereA = 0, VeryLongVariantNameHereBb = 1, VeryLongVariantNameHereCcc = 2, }
fn_single_linePut single-expression functions on a single line
falsetrue, falsefalse (default):fn lorem() -> usize { 42 } fn lorem() -> usize { let ipsum = 42; ipsum }
true:fn lorem() -> usize { 42 } fn lorem() -> usize { let ipsum = 42; ipsum }
See also control_brace_style.
where_single_lineForces the where clause to be laid out on a single line.
falsetrue, falsefalse (default):impl<T> Lorem for T where Option<T>: Ipsum, { // body }
true:impl<T> Lorem for T where Option<T>: Ipsum { // body }
See also brace_style, control_brace_style.
force_explicit_abiAlways print the abi for extern items
truetrue, falseNote: Non-“C” ABIs are always printed. If false then “C” is removed.
true (default):extern "C" { pub static lorem: c_int; }
false:extern { pub static lorem: c_int; }
format_stringsFormat string literals where necessary
falsetrue, falsefalse (default):fn main() { let lorem = "ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing"; }
true:fn main() { let lorem = "ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet \ consectetur adipiscing"; }
See also max_width.
format_macro_matchersFormat the metavariable matching patterns in macros.
falsetrue, falsefalse (default):macro_rules! foo { ($a: ident : $b: ty) => { $a(42): $b; }; ($a: ident $b: ident $c: ident) => { $a = $b + $c; }; }
true:macro_rules! foo { ($a:ident : $b:ty) => { $a(42): $b; }; ($a:ident $b:ident $c:ident) => { $a = $b + $c; }; }
See also format_macro_bodies.
format_macro_bodiesFormat the bodies of macros.
truetrue, falsetrue (default):macro_rules! foo { ($a: ident : $b: ty) => { $a(42): $b; }; ($a: ident $b: ident $c: ident) => { $a = $b + $c; }; }
false:macro_rules! foo { ($a: ident : $b: ty) => { $a(42): $b; }; ($a: ident $b: ident $c: ident) => { $a=$b+$c; }; }
See also format_macro_matchers.
hard_tabsUse tab characters for indentation, spaces for alignment
falsetrue, falsefalse (default):fn lorem() -> usize { 42 // spaces before 42 }
true:fn lorem() -> usize { 42 // tabs before 42 }
See also: tab_spaces.
imports_indentIndent style of imports
"Block""Block", "Visual""Block" (default):use foo::{ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz, };
"Visual":use foo::{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz};
See also: imports_layout.
imports_layoutItem layout inside a imports block
"Mixed" (default):use foo::{xxxxxxxxxxxxxxxxxx, yyyyyyyyyyyyyyyyyy, zzzzzzzzzzzzzzzzzz}; use foo::{ aaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbb, cccccccccccccccccc, dddddddddddddddddd, eeeeeeeeeeeeeeeeee, ffffffffffffffffff, };
"Horizontal":Note: This option forces all imports onto one line and may exceed max_width.
use foo::{xxx, yyy, zzz}; use foo::{aaa, bbb, ccc, ddd, eee, fff};
"HorizontalVertical":use foo::{xxxxxxxxxxxxxxxxxx, yyyyyyyyyyyyyyyyyy, zzzzzzzzzzzzzzzzzz}; use foo::{ aaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbb, cccccccccccccccccc, dddddddddddddddddd, eeeeeeeeeeeeeeeeee, ffffffffffffffffff, };
"Vertical":use foo::{ xxx, yyy, zzz, }; use foo::{ aaa, bbb, ccc, ddd, eee, fff, };
merge_importsMerge multiple imports into a single nested import.
falsetrue, falsefalse (default):use foo::{a, c, d}; use foo::{b, g}; use foo::{e, f};
true:use foo::{a, b, c, d, e, f, g};
match_block_trailing_commaPut a trailing comma after a block based match arm (non-block arms are not affected)
falsetrue, falsefalse (default):fn main() { match lorem { Lorem::Ipsum => { println!("ipsum"); } Lorem::Dolor => println!("dolor"), } }
true:fn main() { match lorem { Lorem::Ipsum => { println!("ipsum"); }, Lorem::Dolor => println!("dolor"), } }
See also: trailing_comma, match_arm_blocks.
max_widthMaximum width of each line
100See also error_on_line_overflow.
merge_derivesMerge multiple derives into a single one.
truetrue, falsetrue (default):#[derive(Eq, PartialEq, Debug, Copy, Clone)] pub enum Foo {}
false:#[derive(Eq, PartialEq)] #[derive(Debug)] #[derive(Copy, Clone)] pub enum Foo {}
force_multiline_blocksForce multiline closure and match arm bodies to be wrapped in a block
falsefalse, truefalse (default):fn main() { result.and_then(|maybe_value| match maybe_value { None => foo(), Some(value) => bar(), }); match lorem { None => |ipsum| { println!("Hello World"); }, Some(dolor) => foo(), } }
true:fn main() { result.and_then(|maybe_value| { match maybe_value { None => foo(), Some(value) => bar(), } }); match lorem { None => { |ipsum| { println!("Hello World"); } } Some(dolor) => foo(), } }
newline_styleUnix or Windows line endings
"Auto""Auto", "Native", "Unix", "Windows"Auto (default):The newline style is detected automatically on a per-file basis. Files with mixed line endings will be converted to the first detected line ending style.
NativeLine endings will be converted to \r\n on Windows and \n on all other platforms.
UnixLine endings will be converted to \n.
WindowsLine endings will be converted to \r\n.
normalize_commentsConvert /* */ comments to // comments where possible
falsetrue, falsefalse (default):// Lorem ipsum: fn dolor() -> usize {} /* sit amet: */ fn adipiscing() -> usize {}
true:// Lorem ipsum: fn dolor() -> usize {} // sit amet: fn adipiscing() -> usize {}
remove_nested_parensRemove nested parens.
true,true, falsetrue (default):fn main() { (foo()); }
false:fn main() { ((((foo())))); }
reorder_importsReorder import and extern crate statements alphabetically in groups (a group is separated by a newline).
truetrue, falsetrue (default):use dolor; use ipsum; use lorem; use sit;
false:use lorem; use ipsum; use dolor; use sit;
reorder_modulesReorder mod declarations alphabetically in group.
truetrue, falsetrue (default)mod a; mod b; mod dolor; mod ipsum; mod lorem; mod sit;
falsemod b; mod a; mod lorem; mod ipsum; mod dolor; mod sit;
Note mod with #[macro_export] will not be reordered since that could change the semantics of the original source code.
reorder_impl_itemsReorder impl items. type and const are put first, then macros and methods.
falsetrue, falsefalse (default)struct Dummy; impl Iterator for Dummy { fn next(&mut self) -> Option<Self::Item> { None } type Item = i32; }
truestruct Dummy; impl Iterator for Dummy { type Item = i32; fn next(&mut self) -> Option<Self::Item> { None } }
report_todoReport TODO items in comments.
"Never""Always", "Unnumbered", "Never"Warns about any comments containing TODO in them when set to "Always". If it contains a #X (with X being a number) in parentheses following the TODO, "Unnumbered" will ignore it.
See also report_fixme.
report_fixmeReport FIXME items in comments.
"Never""Always", "Unnumbered", "Never"Warns about any comments containing FIXME in them when set to "Always". If it contains a #X (with X being a number) in parentheses following the FIXME, "Unnumbered" will ignore it.
See also report_todo.
skip_childrenDon't reformat out of line modules
falsetrue, falsespace_after_colonLeave a space after the colon.
truetrue, falsetrue (default):fn lorem<T: Eq>(t: T) { let lorem: Dolor = Lorem { ipsum: dolor, sit: amet, }; }
false:fn lorem<T:Eq>(t:T) { let lorem:Dolor = Lorem { ipsum:dolor, sit:amet, }; }
See also: space_before_colon.
space_before_colonLeave a space before the colon.
falsetrue, falsefalse (default):fn lorem<T: Eq>(t: T) { let lorem: Dolor = Lorem { ipsum: dolor, sit: amet, }; }
true:fn lorem<T : Eq>(t : T) { let lorem : Dolor = Lorem { ipsum : dolor, sit : amet, }; }
See also: space_after_colon.
struct_field_align_thresholdThe maximum diff of width between struct fields to be aligned with each other.
0 (default):struct Foo { x: u32, yy: u32, zzz: u32, }
20:struct Foo { x: u32, yy: u32, zzz: u32, }
spaces_around_rangesPut spaces around the .., ..=, and ... range operators
falsetrue, falsefalse (default):fn main() { let lorem = 0..10; let ipsum = 0..=10; match lorem { 1..5 => foo(), _ => bar, } match lorem { 1..=5 => foo(), _ => bar, } match lorem { 1...5 => foo(), _ => bar, } }
true:fn main() { let lorem = 0 .. 10; let ipsum = 0 ..= 10; match lorem { 1 .. 5 => foo(), _ => bar, } match lorem { 1 ..= 5 => foo(), _ => bar, } match lorem { 1 ... 5 => foo(), _ => bar, } }
struct_lit_single_linePut small struct literals on a single line
truetrue, falsetrue (default):fn main() { let lorem = Lorem { foo: bar, baz: ofo }; }
false:fn main() { let lorem = Lorem { foo: bar, baz: ofo, }; }
See also: indent_style.
tab_spacesNumber of spaces per tab
44 (default):fn lorem() { let ipsum = dolor(); let sit = vec![ "amet consectetur adipiscing elit amet", "consectetur adipiscing elit amet consectetur.", ]; }
2:fn lorem() { let ipsum = dolor(); let sit = vec![ "amet consectetur adipiscing elit amet", "consectetur adipiscing elit amet consectetur.", ]; }
See also: hard_tabs.
trailing_commaHow to handle trailing commas for lists
"Vertical""Always", "Never", "Vertical""Vertical" (default):fn main() { let Lorem { ipsum, dolor, sit } = amet; let Lorem { ipsum, dolor, sit, amet, consectetur, adipiscing, } = elit; }
"Always":fn main() { let Lorem { ipsum, dolor, sit, } = amet; let Lorem { ipsum, dolor, sit, amet, consectetur, adipiscing, } = elit; }
"Never":fn main() { let Lorem { ipsum, dolor, sit } = amet; let Lorem { ipsum, dolor, sit, amet, consectetur, adipiscing } = elit; }
See also: match_block_trailing_comma.
trailing_semicolonAdd trailing semicolon after break, continue and return
truetrue, falsetrue (default):fn foo() -> usize { return 0; }
false:fn foo() -> usize { return 0 }
type_punctuation_densityDetermines if + or = are wrapped in spaces in the punctuation of types
"Wide""Compressed", "Wide""Wide" (default):fn lorem<Ipsum: Dolor + Sit = Amet>() { // body }
"Compressed":fn lorem<Ipsum: Dolor+Sit=Amet>() { // body }
use_field_init_shorthandUse field initialize shorthand if possible.
falsetrue, falsefalse (default):struct Foo { x: u32, y: u32, z: u32, } fn main() { let x = 1; let y = 2; let z = 3; let a = Foo { x: x, y: y, z: z }; }
true:struct Foo { x: u32, y: u32, z: u32, } fn main() { let x = 1; let y = 2; let z = 3; let a = Foo { x, y, z }; }
use_try_shorthandReplace uses of the try! macro by the ? shorthand
falsetrue, falsefalse (default):fn main() { let lorem = try!(ipsum.map(|dolor| dolor.sit())); }
true:fn main() { let lorem = ipsum.map(|dolor| dolor.sit())?; }
format_doc_commentsFormat doc comments.
falsetrue, falsefalse (default):/// Adds one to the number given. /// /// # Examples /// /// ```rust /// let five=5; /// /// assert_eq!( /// 6, /// add_one(5) /// ); /// # fn add_one(x: i32) -> i32 { /// # x + 1 /// # } /// ``` fn add_one(x: i32) -> i32 { x + 1 }
true/// Adds one to the number given. /// /// # Examples /// /// ```rust /// let five = 5; /// /// assert_eq!(6, add_one(5)); /// # fn add_one(x: i32) -> i32 { /// # x + 1 /// # } /// ``` fn add_one(x: i32) -> i32 { x + 1 }
wrap_commentsBreak comments to fit on the line
falsetrue, falsefalse (default):// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
true:// Lorem ipsum dolor sit amet, consectetur adipiscing elit, // sed do eiusmod tempor incididunt ut labore et dolore // magna aliqua. Ut enim ad minim veniam, quis nostrud // exercitation ullamco laboris nisi ut aliquip ex ea // commodo consequat.
match_arm_blocksWrap the body of arms in blocks when it does not fit on the same line with the pattern of arms
truetrue, falsetrue (default):fn main() { match lorem { true => { foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo(x) } false => println!("{}", sit), } }
false:fn main() { match lorem { true => foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo(x), false => println!("{}", sit), } }
See also: match_block_trailing_comma.
overflow_delimited_exprWhen structs, slices, arrays, and block/array-like macros are used as the last argument in an expression list, allow them to overflow (like blocks/closures) instead of being indented on a new line.
falsetrue, falsefalse (default):fn example() { foo(ctx, |param| { action(); foo(param) }); foo( ctx, Bar { x: value, y: value2, }, ); foo( ctx, &[ MAROON_TOMATOES, PURPLE_POTATOES, ORGANE_ORANGES, GREEN_PEARS, RED_APPLES, ], ); foo( ctx, vec![ MAROON_TOMATOES, PURPLE_POTATOES, ORGANE_ORANGES, GREEN_PEARS, RED_APPLES, ], ); }
true:fn example() { foo(ctx, |param| { action(); foo(param) }); foo(ctx, Bar { x: value, y: value2, }); foo(ctx, &[ MAROON_TOMATOES, PURPLE_POTATOES, ORGANE_ORANGES, GREEN_PEARS, RED_APPLES, ]); foo(ctx, vec![ MAROON_TOMATOES, PURPLE_POTATOES, ORGANE_ORANGES, GREEN_PEARS, RED_APPLES, ]); }
blank_lines_upper_boundMaximum number of blank lines which can be put between items. If more than this number of consecutive empty lines are found, they are trimmed down to match this integer.
1Original Code:
#![rustfmt::skip] fn foo() { println!("a"); } fn bar() { println!("b"); println!("c"); }
1 (default):fn foo() { println!("a"); } fn bar() { println!("b"); println!("c"); }
2:fn foo() { println!("a"); } fn bar() { println!("b"); println!("c"); }
See also: blank_lines_lower_bound
blank_lines_lower_boundMinimum number of blank lines which must be put between items. If two items have fewer blank lines between them, additional blank lines are inserted.
0Original Code (rustfmt will not change it with the default value of 0):
#![rustfmt::skip] fn foo() { println!("a"); } fn bar() { println!("b"); println!("c"); }
1fn foo() { println!("a"); } fn bar() { println!("b"); println!("c"); }
required_versionRequire a specific version of rustfmt. If you want to make sure that the specific version of rustfmt is used in your CI, use this option.
CARGO_PKG_VERSION"0.3.8")hide_parse_errorsDo not show parse errors if the parser failed to parse files.
falsetrue, falsecolorWhether to use colored output or not.
"Auto"unstable_featuresEnable unstable features on the unstable channel.
falsetrue, falselicense_template_pathCheck whether beginnings of files match a license template.
""A license template is a plain text file which is matched literally against the beginning of each source file, except for {}-delimited blocks, which are matched as regular expressions. The following license template therefore matches strings like // Copyright 2017 The Rust Project Developers., // Copyright 2018 The Rust Project Developers., etc.:
// Copyright {\d+} The Rust Project Developers.
\{, \} and \\ match literal braces / backslashes.
ignoreSkip formatting the specified files and directories.
If you want to ignore specific files, put the following to your config file:
ignore = [ "src/types.rs", "src/foo/bar.rs", ]
If you want to ignore every file under examples/, put the following to your config file:
ignore = [ "examples", ]
editionSpecifies which edition is used by the parser.
20152015, 2018Rustfmt is able to pick up the edition used by reading the Cargo.toml file if executed through the Cargo's formatting tool cargo fmt. Otherwise, the edition needs to be specified in your config file:
edition = "2018"
versionWhich version of the formatting rules to use. Version::One is backwards-compatible with Rustfmt 1.0. Other versions are only backwards compatible within a major version number.
OneOne, Twoversion = "Two"
normalize_doc_attributesConvert #![doc] and #[doc] attributes to //! and /// doc comments.
falsetrue, falsefalse (default):#![doc = "Example documentation"] #[doc = "Example item documentation"] pub enum Foo {}
true://! Example documentation /// Example item documentation pub enum Foo {}
inline_attribute_widthWrite an item and its attribute on the same line if their combined width is below a threshold
0 (default):#[cfg(feature = "alloc")] use core::slice;
50:#[cfg(feature = "alloc")] use core::slice;
emit_modeInternal option
make_backupInternal option, use --backup