3 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.
5 A possible content of `rustfmt.toml` or `.rustfmt.toml` might look like this:
9 reorder_imported_names = true
12 Each configuration option is either stable or unstable.
13 Stable options can be used directly, while unstable options are opt-in.
15 To enable unstable options, set `unstable_features = true` in `rustfmt.toml` or pass `--unstable-options` to rustfmt,
16 and ensure that the environment variable `CFG_RELEASE_CHANNEL` is set to `nightly`.
18 # Configuration Options
20 Below you find a detailed visual guide on all the supported configuration options of rustfmt:
25 Indent on expressions or items.
27 - **Default value**: `"Block"`
28 - **Possible values**: `"Block"`, `"Visual"`
33 #### `"Block"` (default):
50 let lorem = vec!["ipsum",
61 #### `"Block"` (default):
82 See also: [`control_brace_style`](#control_brace_style).
84 ### Function arguments
86 #### `"Block"` (default):
91 fn lorem(ipsum: usize) {}
111 fn lorem(ipsum: usize) {}
113 fn lorem(ipsum: usize,
126 #### `"Block"` (default):
156 #### `"Block"` (default):
164 Adipiscing: Eq = usize,
165 Consectetur: Eq = usize,
172 adipiscing: Adipiscing,
173 consectetur: Consectetur,
183 fn lorem<Ipsum: Eq = usize,
187 Adipiscing: Eq = usize,
188 Consectetur: Eq = usize,
194 adipiscing: Adipiscing,
195 consectetur: Consectetur,
204 #### `"Block"` (default):
216 let lorem = Lorem { ipsum: dolor,
220 See also: [`struct_lit_single_line`](#struct_lit_single_line), [`indent_style`](#indent_style).
224 #### `"Block"` (default):
227 fn lorem<Ipsum, Dolor, Sit, Amet>() -> T
241 fn lorem<Ipsum, Dolor, Sit, Amet>() -> T
252 ## `same_line_attributes`
254 Try to put attributes on the same line as fields and variants
256 - **Default value**: `true`
257 - **Possible values**: `true`, `false`
260 #### `true` (default):
264 #[serde(rename = "Ipsum")] ipsum: usize,
265 #[serde(rename = "Dolor")] dolor: usize,
266 #[serde(rename = "Amet")] amet: usize,
270 #[serde(skip_serializing)] Ipsum,
271 #[serde(skip_serializing)] Dolor,
272 #[serde(skip_serializing)] Amet,
280 #[serde(rename = "Ipsum")]
282 #[serde(rename = "Dolor")]
284 #[serde(rename = "Amet")]
289 #[serde(skip_serializing)]
291 #[serde(skip_serializing)]
293 #[serde(skip_serializing)]
298 ## `use_small_heuristics`
300 Whether to use different formatting for items and expressions if they satisfy a heuristic notion of 'small'.
302 - **Default value**: `true`
303 - **Possible values**: `true`, `false`
306 #### `true` (default):
312 Sit { amet: Consectetur, adipiscing: Elit },
326 let lorem = Lorem { ipsum: dolor, sit: amet };
328 let lorem = if ipsum { dolor } else { sit };
345 lorem("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing");
352 let lorem = if ipsum {
362 Where to put a binary operator when a binary expression goes multiline.
364 - **Default value**: `"Front"`
365 - **Possible values**: `"Front"`, `"Back"`
368 #### `"Front"` (default):
379 let range = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
380 ..bbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
394 let range = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..
395 bbbbbbbbbbbbbbbbbbbbbbbbbbbbb;
398 ## `combine_control_expr`
400 Combine control expressions with function calls.
402 - **Default value**: `true`
403 - **Possible values**: `true`, `false`
406 #### `true` (default):
418 foo!(if let Some(..) = x {
431 foo!(while let Some(..) = x {
465 if let Some(..) = x {
482 while let Some(..) = x {
508 Maximum length of comments. No effect unless`wrap_comments = true`.
510 - **Default value**: `80`
511 - **Possible values**: any positive integer
514 **Note:** A value of `0` results in [`wrap_comments`](#wrap_comments) being applied regardless of a line's width.
516 #### Comments shorter than `comment_width`:
518 // Lorem ipsum dolor sit amet, consectetur adipiscing elit.
521 #### Comments longer than `comment_width`:
523 // Lorem ipsum dolor sit amet,
524 // consectetur adipiscing elit.
527 See also [`wrap_comments`](#wrap_comments).
529 ## `condense_wildcard_suffixes`
531 Replace strings of _ wildcards by a single .. in tuple patterns
533 - **Default value**: `false`
534 - **Possible values**: `true`, `false`
537 #### `false` (default):
540 let (lorem, ipsum, _, _) = (1, 2, 3, 4);
546 let (lorem, ipsum, ..) = (1, 2, 3, 4);
549 ## `control_brace_style`
551 Brace style for control flow constructs
553 - **Default value**: `"AlwaysSameLine"`
554 - **Possible values**: `"AlwaysNextLine"`, `"AlwaysSameLine"`, `"ClosingNextLine"`
557 #### `"AlwaysSameLine"` (default):
567 #### `"AlwaysNextLine"`:
580 #### `"ClosingNextLine"`:
591 ## `disable_all_formatting`
593 Don't reformat anything
595 - **Default value**: `false`
596 - **Possible values**: `true`, `false`
599 ## `error_on_line_overflow`
601 Error if unable to get all lines within `max_width`
603 - **Default value**: `true`
604 - **Possible values**: `true`, `false`
607 See also [`max_width`](#max_width).
609 ## `error_on_line_overflow_comments`
611 Error if unable to get all comment lines within `comment_width`.
613 - **Default value**: `true`
614 - **Possible values**: `true`, `false`
617 See also [`comment_width`](#comment_width).
621 Argument density in functions
623 - **Default value**: `"Tall"`
624 - **Possible values**: `"Compressed"`, `"Tall"`, `"Vertical"`
627 #### `"Tall"` (default):
631 fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet);
633 fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet) {
642 consectetur: Consectetur,
643 adipiscing: Adipiscing,
652 consectetur: Consectetur,
653 adipiscing: Adipiscing,
665 fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet);
667 fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet) {
672 ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: Consectetur,
673 adipiscing: Adipiscing, elit: Elit,
677 ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: Consectetur,
678 adipiscing: Adipiscing, elit: Elit,
689 fn lorem(ipsum: Ipsum,
694 fn lorem(ipsum: Ipsum,
701 fn lorem(ipsum: Ipsum,
705 consectetur: Consectetur,
706 adipiscing: Adipiscing,
709 fn lorem(ipsum: Ipsum,
713 consectetur: Consectetur,
714 adipiscing: Adipiscing,
724 Brace style for items
726 - **Default value**: `"SameLineWhere"`
727 - **Possible values**: `"AlwaysNextLine"`, `"PreferSameLine"`, `"SameLineWhere"`
732 #### `"SameLineWhere"` (default):
739 fn lorem(ipsum: usize) {
743 fn lorem<T>(ipsum: T)
745 T: Add + Sub + Mul + Div,
751 #### `"AlwaysNextLine"`:
759 fn lorem(ipsum: usize)
764 fn lorem<T>(ipsum: T)
766 T: Add + Sub + Mul + Div,
772 #### `"PreferSameLine"`:
779 fn lorem(ipsum: usize) {
783 fn lorem<T>(ipsum: T)
785 T: Add + Sub + Mul + Div, {
790 ### Structs and enums
792 #### `"SameLineWhere"` (default):
806 #### `"AlwaysNextLine"`:
821 #### `"PreferSameLine"`:
835 ## `empty_item_single_line`
837 Put empty-body functions and impls on a single line
839 - **Default value**: `true`
840 - **Possible values**: `true`, `false`
843 #### `true` (default):
861 See also [`brace_style`](#brace_style), [`control_brace_style`](#control_brace_style).
866 Put single-expression functions on a single line
868 - **Default value**: `false`
869 - **Possible values**: `true`, `false`
872 #### `false` (default):
875 fn lorem() -> usize {
879 fn lorem() -> usize {
888 fn lorem() -> usize { 42 }
890 fn lorem() -> usize {
896 See also [`control_brace_style`](#control_brace_style).
899 ## `where_single_line`
901 To force single line where layout
903 - **Default value**: `false`
904 - **Possible values**: `true`, `false`
907 #### `false` (default):
922 where Option<T>: Ipsum {
927 See also [`brace_style`](#brace_style), [`control_brace_style`](#control_brace_style).
930 ## `force_explicit_abi`
932 Always print the abi for extern items
934 - **Default value**: `true`
935 - **Possible values**: `true`, `false`
938 **Note:** Non-"C" ABIs are always printed. If `false` then "C" is removed.
940 #### `true` (default):
944 pub static lorem: c_int;
952 pub static lorem: c_int;
958 Format string literals where necessary
960 - **Default value**: `false`
961 - **Possible values**: `true`, `false`
964 #### `false` (default):
967 let lorem = "ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit";
974 "ipsum dolor sit amet consectetur \
975 adipiscing elit lorem ipsum dolor sit";
978 See also [`max_width`](#max_width).
982 Use tab characters for indentation, spaces for alignment
984 - **Default value**: `false`
985 - **Possible values**: `true`, `false`
988 #### `false` (default):
991 fn lorem() -> usize {
992 42 // spaces before 42
999 fn lorem() -> usize {
1000 42 // tabs before 42
1004 See also: [`tab_spaces`](#tab_spaces).
1009 Indent style of imports
1011 - **Default Value**: `"Visual"`
1012 - **Possible values**: `"Block"`, `"Visual"`
1015 #### `"Visual"` (default):
1033 See also: [`imports_layout`](#imports_layout).
1037 Item layout inside a imports block
1039 - **Default value**: "Mixed"
1040 - **Possible values**: "Horizontal", "HorizontalVertical", "Mixed", "Vertical"
1043 #### `"Mixed"` (default):
1046 use foo::{xxx, yyy, zzz};
1048 use foo::{aaa, bbb, ccc,
1052 #### `"Horizontal"`:
1054 **Note**: This option forces to put everything on one line and may exceeds `max_width`.
1057 use foo::{xxx, yyy, zzz};
1059 use foo::{aaa, bbb, ccc, ddd, eee, fff};
1062 #### `"HorizontalVertical"`:
1065 use foo::{xxx, yyy, zzz};
1091 ## `match_block_trailing_comma`
1093 Put a trailing comma after a block based match arm (non-block arms are not affected)
1095 - **Default value**: `false`
1096 - **Possible values**: `true`, `false`
1099 #### `false` (default):
1106 Lorem::Dolor => println!("dolor"),
1117 Lorem::Dolor => println!("dolor"),
1121 See also: [`trailing_comma`](#trailing_comma), [`match_arm_blocks`](#match_arm_blocks).
1125 Maximum width of each line
1127 - **Default value**: `100`
1128 - **Possible values**: any positive integer
1131 See also [`error_on_line_overflow`](#error_on_line_overflow).
1135 Merge multiple derives into a single one.
1137 - **Default value**: `true`
1138 - **Possible values**: `true`, `false`
1141 #### `true` (default):
1144 #[derive(Eq, PartialEq, Debug, Copy, Clone)]
1151 #[derive(Eq, PartialEq)]
1153 #[derive(Copy, Clone)]
1157 ## `force_multiline_blocks`
1159 Force multiline closure and match arm bodies to be wrapped in a block
1161 - **Default value**: `false`
1162 - **Possible values**: `false`, `true`
1165 #### `false` (default):
1168 result.and_then(|maybe_value| match maybe_value {
1175 println!("Hello World");
1185 result.and_then(|maybe_value| {
1195 println!("Hello World");
1205 Unix or Windows line endings
1207 - **Default value**: `"Unix"`
1208 - **Possible values**: `"Native"`, `"Unix"`, `"Windows"`
1211 ## `normalize_comments`
1213 Convert /* */ comments to // comments where possible
1215 - **Default value**: `false`
1216 - **Possible values**: `true`, `false`
1219 #### `false` (default):
1223 fn dolor() -> usize {}
1226 fn adipiscing() -> usize {}
1233 fn dolor() -> usize {}
1236 fn adipiscing() -> usize {}
1239 ## `reorder_imported_names`
1241 Reorder lists of names in import statements alphabetically
1243 - **Default value**: `false`
1244 - **Possible values**: `true`, `false`
1247 #### `false` (default):
1250 use super::{lorem, ipsum, dolor, sit};
1256 use super::{dolor, ipsum, lorem, sit};
1259 See also [`reorder_imports`](#reorder_imports).
1261 ## `reorder_imports`
1263 Reorder import statements alphabetically
1265 - **Default value**: `false`
1266 - **Possible values**: `true`, `false`
1269 #### `false` (default):
1287 See also [`reorder_imported_names`](#reorder_imported_names), [`reorder_imports_in_group`](#reorder_imports_in_group).
1289 ## `reorder_imports_in_group`
1291 Reorder import statements in group
1293 - **Default value**: `false`
1294 - **Possible values**: `true`, `false`
1297 **Note:** This option takes effect only when [`reorder_imports`](#reorder_imports) is set to `true`.
1299 #### `false` (default):
1323 See also [`reorder_imports`](#reorder_imports).
1325 ## `reorder_extern_crates`
1327 Reorder `extern crate` statements alphabetically
1329 - **Default value**: `true`
1330 - **Possible values**: `true`, `false`
1333 #### `true` (default):
1351 See also [`reorder_extern_crates_in_group`](#reorder_extern_crates_in_group).
1353 ## `reorder_extern_crates_in_group`
1355 Reorder `extern crate` statements in group
1357 - **Default value**: `true`
1358 - **Possible values**: `true`, `false`
1361 **Note:** This option takes effect only when [`reorder_imports`](#reorder_imports) is set to `true`.
1363 #### `true` (default):
1387 See also [`reorder_extern_crates`](#reorder_extern_crates).
1391 Report `TODO` items in comments.
1393 - **Default value**: `"Never"`
1394 - **Possible values**: `"Always"`, `"Unnumbered"`, `"Never"`
1397 Warns about any comments containing `TODO` in them when set to `"Always"`. If
1398 it contains a `#X` (with `X` being a number) in parentheses following the
1399 `TODO`, `"Unnumbered"` will ignore it.
1401 See also [`report_fixme`](#report_fixme).
1405 Report `FIXME` items in comments.
1407 - **Default value**: `"Never"`
1408 - **Possible values**: `"Always"`, `"Unnumbered"`, `"Never"`
1411 Warns about any comments containing `FIXME` in them when set to `"Always"`. If
1412 it contains a `#X` (with `X` being a number) in parentheses following the
1413 `FIXME`, `"Unnumbered"` will ignore it.
1415 See also [`report_todo`](#report_todo).
1420 Don't reformat out of line modules
1422 - **Default value**: `false`
1423 - **Possible values**: `true`, `false`
1426 ## `space_after_colon`
1428 Leave a space after the colon.
1430 - **Default value**: `true`
1431 - **Possible values**: `true`, `false`
1434 #### `true` (default):
1437 fn lorem<T: Eq>(t: T) {
1438 let lorem: Dolor = Lorem {
1448 fn lorem<T:Eq>(t:T) {
1449 let lorem:Dolor = Lorem {
1456 See also: [`space_before_colon`](#space_before_colon).
1458 ## `space_before_colon`
1460 Leave a space before the colon.
1462 - **Default value**: `false`
1463 - **Possible values**: `true`, `false`
1466 #### `false` (default):
1469 fn lorem<T: Eq>(t: T) {
1470 let lorem: Dolor = Lorem {
1480 fn lorem<T : Eq>(t : T) {
1481 let lorem : Dolor = Lorem {
1488 See also: [`space_after_colon`](#space_after_colon).
1490 ## `struct_field_align_threshold`
1492 The maximum diff of width between struct fields to be aligned with each other.
1494 - **Default value** : 0
1495 - **Possible values**: any positive integer
1518 ## `spaces_around_ranges`
1520 Put spaces around the .. and ... range operators
1522 - **Default value**: `false`
1523 - **Possible values**: `true`, `false`
1526 #### `false` (default):
1535 let lorem = 0 .. 10;
1538 ## `spaces_within_parens_and_brackets`
1540 Put spaces within non-empty generic arguments, parentheses, and square brackets
1542 - **Default value**: `false`
1543 - **Possible values**: `true`, `false`
1546 #### `false` (default):
1549 // generic arguments
1550 fn lorem<T: Eq>(t: T) {
1554 // non-empty parentheses
1555 fn lorem<T: Eq>(t: T) {
1556 let lorem = (ipsum, dolor);
1559 // non-empty square brackets
1560 let lorem: [usize; 2] = [ipsum, dolor];
1566 // generic arguments
1567 fn lorem< T: Eq >(t: T) {
1571 // non-empty parentheses
1572 fn lorem<T: Eq>( t: T ) {
1573 let lorem = ( ipsum, dolor );
1576 // non-empty square brackets
1577 let lorem: [ usize; 2 ] = [ ipsum, dolor ];
1580 ## `struct_lit_single_line`
1582 Put small struct literals on a single line
1584 - **Default value**: `true`
1585 - **Possible values**: `true`, `false`
1588 #### `true` (default):
1591 let lorem = Lorem { ipsum: dolor, sit: amet };
1603 See also: [`indent_style`](#indent_style).
1608 Number of spaces per tab
1610 - **Default value**: `4`
1611 - **Possible values**: any positive integer
1618 let ipsum = dolor();
1620 "amet consectetur adipiscing elit."
1629 let ipsum = dolor();
1631 "amet consectetur adipiscing elit."
1636 See also: [`hard_tabs`](#hard_tabs).
1641 How to handle trailing commas for lists
1643 - **Default value**: `"Vertical"`
1644 - **Possible values**: `"Always"`, `"Never"`, `"Vertical"`
1647 #### `"Vertical"` (default):
1650 let Lorem { ipsum, dolor, sit } = amet;
1664 let Lorem { ipsum, dolor, sit, } = amet;
1678 let Lorem { ipsum, dolor, sit } = amet;
1689 See also: [`match_block_trailing_comma`](#match_block_trailing_comma).
1691 ## `trailing_semicolon`
1693 Add trailing semicolon after break, continue and return
1695 - **Default value**: `true`
1696 - **Possible values**: `true`, `false`
1699 #### `true` (default):
1713 ## `type_punctuation_density`
1715 Determines if `+` or `=` are wrapped in spaces in the punctuation of types
1717 - **Default value**: `"Wide"`
1718 - **Possible values**: `"Compressed"`, `"Wide"`
1721 #### `"Wide"` (default):
1724 fn lorem<Ipsum: Dolor + Sit = Amet>() {
1729 #### `"Compressed"`:
1732 fn lorem<Ipsum: Dolor+Sit=Amet>() {
1737 ## `use_try_shorthand`
1739 Replace uses of the try! macro by the ? shorthand
1741 - **Default value**: `false`
1742 - **Possible values**: `true`, `false`
1745 #### `false` (default):
1748 let lorem = try!(ipsum.map(|dolor|dolor.sit()));
1754 let lorem = ipsum.map(|dolor| dolor.sit())?;
1760 Break comments to fit on the line
1762 - **Default value**: `false`
1763 - **Possible values**: `true`, `false`
1766 #### `false` (default):
1769 // 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.
1775 // Lorem ipsum dolor sit amet, consectetur adipiscing elit,
1776 // sed do eiusmod tempor incididunt ut labore et dolore
1777 // magna aliqua. Ut enim ad minim veniam, quis nostrud
1778 // exercitation ullamco laboris nisi ut aliquip ex ea
1779 // commodo consequat.
1782 ## `match_arm_blocks`
1784 Wrap the body of arms in blocks when it does not fit on the same line with the pattern of arms
1786 - **Default value**: `true`
1787 - **Possible values**: `true`, `false`
1790 #### `true` (default):
1795 foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo(x)
1797 false => println!("{}", sit),
1806 foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo(x),
1807 false => println!("{}", sit),
1811 See also: [`match_block_trailing_comma`](#match_block_trailing_comma).
1815 What Write Mode to use when none is supplied: Replace, Overwrite, Display, Diff, Coverage
1817 - **Default value**: `"Overwrite"`
1818 - **Possible values**: `"Checkstyle"`, `"Coverage"`, `"Diff"`, `"Display"`, `"Overwrite"`, `"Plain"`, `"Replace"`