X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=Configurations.md;h=dc91a3d255a7b8899322f40e82534f806b07d500;hb=7a711b357e6aa9095a973e3609a566dbfaf7dd2c;hp=79a20c4531abbae05353934751a4f28b43ccfaec;hpb=fb5513564e957578dd544000174b80801e210237;p=rust.git diff --git a/Configurations.md b/Configurations.md index 79a20c4531a..dc91a3d255a 100644 --- a/Configurations.md +++ b/Configurations.md @@ -1,6 +1,6 @@ # Configuring Rustfmt -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. +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](https://docs.rs/dirs/1.0.4/dirs/fn.config_dir.html) (e.g. `.config/rustfmt/`) are checked as well. A possible content of `rustfmt.toml` or `.rustfmt.toml` might look like this: @@ -24,7 +24,7 @@ Indent on expressions or items. - **Default value**: `"Block"` - **Possible values**: `"Block"`, `"Visual"` -- **Stable**: No +- **Stable**: No (tracking issue: #3346) ### Array @@ -236,7 +236,7 @@ fn main() { ```rust fn main() { let lorem = Lorem { ipsum: dolor, - sit: amet, }; + sit: amet }; } ``` @@ -275,9 +275,9 @@ fn lorem() -> T Whether to use different formatting for items and expressions if they satisfy a heuristic notion of 'small'. -- **Default value**: `Default` -- **Possible values**: `Default`, `Off` -- **Stable**: Yess +- **Default value**: `"Default"` +- **Possible values**: `"Default"`, `"Off"`, `"Max"` +- **Stable**: Yes #### `Default` (default): @@ -337,13 +337,31 @@ fn main() { } ``` +#### `Max`: + +```rust +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_separator` Where to put a binary operator when a binary expression goes multiline. - **Default value**: `"Front"` - **Possible values**: `"Front"`, `"Back"` -- **Stable**: No +- **Stable**: No (tracking issue: #3368) #### `"Front"` (default): @@ -383,7 +401,7 @@ Combine control expressions with function calls. - **Default value**: `true` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3369) #### `true` (default): @@ -491,7 +509,7 @@ Maximum length of comments. No effect unless`wrap_comments = true`. - **Default value**: `80` - **Possible values**: any positive integer -- **Stable**: No +- **Stable**: No (tracking issue: #3349) **Note:** A value of `0` results in [`wrap_comments`](#wrap_comments) being applied regardless of a line's width. @@ -514,7 +532,7 @@ Replace strings of _ wildcards by a single .. in tuple patterns - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3384) #### `false` (default): @@ -539,7 +557,7 @@ Brace style for control flow constructs - **Default value**: `"AlwaysSameLine"` - **Possible values**: `"AlwaysNextLine"`, `"AlwaysSameLine"`, `"ClosingNextLine"` -- **Stable**: No +- **Stable**: No (tracking issue: #3377) #### `"AlwaysSameLine"` (default): @@ -587,7 +605,7 @@ Don't reformat anything - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3388) ## `error_on_line_overflow` @@ -598,7 +616,7 @@ using a shorter name. - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3391) See also [`max_width`](#max_width). @@ -609,7 +627,7 @@ trailing whitespaces. - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3392) ## `fn_args_density` @@ -617,7 +635,7 @@ Argument density in functions - **Default value**: `"Tall"` - **Possible values**: `"Compressed"`, `"Tall"`, `"Vertical"` -- **Stable**: No +- **Stable**: No (tracking issue: #3375) #### `"Tall"` (default): @@ -728,7 +746,7 @@ Brace style for items - **Default value**: `"SameLineWhere"` - **Possible values**: `"AlwaysNextLine"`, `"PreferSameLine"`, `"SameLineWhere"` -- **Stable**: No +- **Stable**: No (tracking issue: #3376) ### Functions @@ -844,7 +862,7 @@ Put empty-body functions and impls on a single line - **Default value**: `true` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3356) #### `true` (default): @@ -867,13 +885,60 @@ impl Lorem { See also [`brace_style`](#brace_style), [`control_brace_style`](#control_brace_style). +## `enum_discrim_align_threshold` + +The 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. + +- **Default value** : 0 +- **Possible values**: any positive integer +- **Stable**: No (tracking issue: #3372) + +#### `0` (default): + +```rust +enum Bar { + A = 0, + Bb = 1, + RandomLongVariantGoesHere = 10, + Ccc = 71, +} + +enum Bar { + VeryLongVariantNameHereA = 0, + VeryLongVariantNameHereBb = 1, + VeryLongVariantNameHereCcc = 2, +} +``` + +#### `20`: + +```rust +enum Foo { + A = 0, + Bb = 1, + RandomLongVariantGoesHere = 10, + Ccc = 2, +} + +enum Bar { + VeryLongVariantNameHereA = 0, + VeryLongVariantNameHereBb = 1, + VeryLongVariantNameHereCcc = 2, +} +``` + + ## `fn_single_line` Put single-expression functions on a single line - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3358) #### `false` (default): @@ -908,7 +973,7 @@ Forces the `where` clause to be laid out on a single line. - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3359) #### `false` (default): @@ -966,14 +1031,13 @@ Format string literals where necessary - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3353) #### `false` (default): ```rust fn main() { - let lorem = - "ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing"; + let lorem = "ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing"; } ``` @@ -988,6 +1052,76 @@ fn main() { See also [`max_width`](#max_width). +## `format_macro_matchers` + +Format the metavariable matching patterns in macros. + +- **Default value**: `false` +- **Possible values**: `true`, `false` +- **Stable**: No (tracking issue: #3354) + +#### `false` (default): + +```rust +macro_rules! foo { + ($a: ident : $b: ty) => { + $a(42): $b; + }; + ($a: ident $b: ident $c: ident) => { + $a = $b + $c; + }; +} +``` + +#### `true`: + +```rust +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_bodies). + + +## `format_macro_bodies` + +Format the bodies of macros. + +- **Default value**: `true` +- **Possible values**: `true`, `false` +- **Stable**: No (tracking issue: #3355) + +#### `true` (default): + +```rust +macro_rules! foo { + ($a: ident : $b: ty) => { + $a(42): $b; + }; + ($a: ident $b: ident $c: ident) => { + $a = $b + $c; + }; +} +``` + +#### `false`: + +```rust +macro_rules! foo { + ($a: ident : $b: ty) => { $a(42): $b; }; + ($a: ident $b: ident $c: ident) => { $a=$b+$c; }; +} +``` + +See also [`format_macro_matchers`](#format_macro_matchers). + + ## `hard_tabs` Use tab characters for indentation, spaces for alignment @@ -1019,18 +1153,11 @@ See also: [`tab_spaces`](#tab_spaces). Indent style of imports -- **Default Value**: `"Visual"` +- **Default Value**: `"Block"` - **Possible values**: `"Block"`, `"Visual"` -- **Stable**: No - -#### `"Visual"` (default): +- **Stable**: No (tracking issue: #3360) -```rust -use foo::{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, - zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz}; -``` - -#### `"Block"`: +#### `"Block"` (default): ```rust use foo::{ @@ -1039,6 +1166,13 @@ use foo::{ }; ``` +#### `"Visual"`: + +```rust +use foo::{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, + zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz}; +``` + See also: [`imports_layout`](#imports_layout). ## `imports_layout` @@ -1047,7 +1181,7 @@ Item layout inside a imports block - **Default value**: "Mixed" - **Possible values**: "Horizontal", "HorizontalVertical", "Mixed", "Vertical" -- **Stable**: No +- **Stable**: No (tracking issue: #3361) #### `"Mixed"` (default): @@ -1110,7 +1244,7 @@ Merge multiple imports into a single nested import. - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3362) #### `false` (default): @@ -1133,7 +1267,7 @@ Put a trailing comma after a block based match arm (non-block arms are not affec - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3380) #### `false` (default): @@ -1203,7 +1337,7 @@ Force multiline closure and match arm bodies to be wrapped in a block - **Default value**: `false` - **Possible values**: `false`, `true` -- **Stable**: No +- **Stable**: No (tracking issue: #3374) #### `false` (default): @@ -1215,7 +1349,7 @@ fn main() { }); match lorem { - None => if ipsum { + None => |ipsum| { println!("Hello World"); }, Some(dolor) => foo(), @@ -1236,7 +1370,7 @@ fn main() { match lorem { None => { - if ipsum { + |ipsum| { println!("Hello World"); } } @@ -1250,17 +1384,36 @@ fn main() { Unix or Windows line endings -- **Default value**: `"Unix"` -- **Possible values**: `"Native"`, `"Unix"`, `"Windows"` +- **Default value**: `"Auto"` +- **Possible values**: `"Auto"`, `"Native"`, `"Unix"`, `"Windows"` - **Stable**: Yes +#### `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. + +#### `Native` + +Line endings will be converted to `\r\n` on Windows and `\n` on all +other platforms. + +#### `Unix` + +Line endings will be converted to `\n`. + +#### `Windows` + +Line endings will be converted to `\r\n`. + ## `normalize_comments` Convert /* */ comments to // comments where possible - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3350) #### `false` (default): @@ -1366,7 +1519,7 @@ mod dolor; mod sit; ``` -**Note** `mod` with `#[macro_export]` will not be reordered since that could change the semantic +**Note** `mod` with `#[macro_export]` will not be reordered since that could change the semantics of the original source code. ## `reorder_impl_items` @@ -1375,7 +1528,7 @@ Reorder impl items. `type` and `const` are put first, then macros and methods. - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3363) #### `false` (default) @@ -1411,7 +1564,7 @@ Report `TODO` items in comments. - **Default value**: `"Never"` - **Possible values**: `"Always"`, `"Unnumbered"`, `"Never"` -- **Stable**: No +- **Stable**: No (tracking issue: #3393) 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 @@ -1425,7 +1578,7 @@ Report `FIXME` items in comments. - **Default value**: `"Never"` - **Possible values**: `"Always"`, `"Unnumbered"`, `"Never"` -- **Stable**: No +- **Stable**: No (tracking issue: #3394) 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 @@ -1440,7 +1593,7 @@ Don't reformat out of line modules - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3389) ## `space_after_colon` @@ -1448,7 +1601,7 @@ Leave a space after the colon. - **Default value**: `true` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3366) #### `true` (default): @@ -1480,7 +1633,7 @@ Leave a space before the colon. - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3365) #### `false` (default): @@ -1511,8 +1664,8 @@ See also: [`space_after_colon`](#space_after_colon). The maximum diff of width between struct fields to be aligned with each other. - **Default value** : 0 -- **Possible values**: any positive integer -- **Stable**: No +- **Possible values**: any non-negative integer +- **Stable**: No (tracking issue: #3371) #### `0` (default): @@ -1540,7 +1693,7 @@ Put spaces around the .., ..=, and ... range operators - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3367) #### `false` (default): @@ -1596,7 +1749,7 @@ Put small struct literals on a single line - **Default value**: `true` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3357) #### `true` (default): @@ -1661,7 +1814,7 @@ How to handle trailing commas for lists - **Default value**: `"Vertical"` - **Possible values**: `"Always"`, `"Never"`, `"Vertical"` -- **Stable**: No +- **Stable**: No (tracking issue: #3379) #### `"Vertical"` (default): @@ -1719,7 +1872,7 @@ Add trailing semicolon after break, continue and return - **Default value**: `true` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3378) #### `true` (default): ```rust @@ -1741,7 +1894,7 @@ Determines if `+` or `=` are wrapped in spaces in the punctuation of types - **Default value**: `"Wide"` - **Possible values**: `"Compressed"`, `"Wide"` -- **Stable**: No +- **Stable**: No (tracking issue: #3364) #### `"Wide"` (default): @@ -1825,6 +1978,56 @@ fn main() { } ``` +## `format_code_in_doc_comments` + +Format code snippet included in doc comments. + +- **Default value**: `false` +- **Possible values**: `true`, `false` +- **Stable**: No (tracking issue: #3348) + +#### `false` (default): + +```rust +/// 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` + +```rust +/// 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_comments` @@ -1832,7 +2035,7 @@ Break comments to fit on the line - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3347) #### `false` (default): @@ -1856,7 +2059,7 @@ Wrap the body of arms in blocks when it does not fit on the same line with the p - **Default value**: `true` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3373) #### `true` (default): @@ -1885,6 +2088,88 @@ fn main() { See also: [`match_block_trailing_comma`](#match_block_trailing_comma). +## `overflow_delimited_expr` + +When 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. + +- **Default value**: `false` +- **Possible values**: `true`, `false` +- **Stable**: No (tracking issue: #3370) + +#### `false` (default): + +```rust +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`: + +```rust +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_bound` @@ -1892,8 +2177,8 @@ Maximum number of blank lines which can be put between items. If more than this lines are found, they are trimmed down to match this integer. - **Default value**: `1` -- **Possible values**: *unsigned integer* -- **Stable**: No +- **Possible values**: any non-negative integer +- **Stable**: No (tracking issue: #3381) ### Example Original Code: @@ -1928,7 +2213,7 @@ fn bar() { } ``` -#### `2` (default): +#### `2`: ```rust fn foo() { println!("a"); @@ -1952,7 +2237,7 @@ them, additional blank lines are inserted. - **Default value**: `0` - **Possible values**: *unsigned integer* -- **Stable**: No +- **Stable**: No (tracking issue: #3382) ### Example Original Code (rustfmt will not change it with the default value of `0`): @@ -1992,7 +2277,7 @@ specific version of rustfmt is used in your CI, use this option. - **Default value**: `CARGO_PKG_VERSION` - **Possible values**: any published version (e.g. `"0.3.8"`) -- **Stable**: No +- **Stable**: No (tracking issue: #3386) ## `hide_parse_errors` @@ -2000,7 +2285,7 @@ Do not show parse errors if the parser failed to parse files. - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3390) ## `color` @@ -2008,23 +2293,23 @@ Whether to use colored output or not. - **Default value**: `"Auto"` - **Possible values**: "Auto", "Always", "Never" -- **Stable**: No +- **Stable**: No (tracking issue: #3385) ## `unstable_features` -Enable unstable features on stable channel. +Enable unstable features on the unstable channel. - **Default value**: `false` - **Possible values**: `true`, `false` -- **Stable**: No +- **Stable**: No (tracking issue: #3387) ## `license_template_path` Check whether beginnings of files match a license template. -- **Default value**: `""`` +- **Default value**: `""` - **Possible values**: path to a license template file -- **Stable**: No +- **Stable**: No (tracking issue: #3352) 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 @@ -2042,9 +2327,9 @@ Copyright 2018 The Rust Project Developers.`, etc.: Skip formatting the specified files and directories. -- **Default value**: format every files +- **Default value**: format every file - **Possible values**: See an example below -- **Stable**: No +- **Stable**: No (tracking issue: #3395) ### Example @@ -2060,11 +2345,90 @@ ignore = [ If you want to ignore every file under `examples/`, put the following to your config file: ```toml -ignore [ +ignore = [ "examples", ] ``` +## `edition` + +Specifies which edition is used by the parser. + +- **Default value**: `2015` +- **Possible values**: `2015`, `2018` +- **Stable**: Yes + +Rustfmt 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: + +```toml +edition = "2018" +``` + +## `version` + +Which 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. + +- **Default value**: `One` +- **Possible values**: `One`, `Two` +- **Stable**: No (tracking issue: #3383) + +### Example + +```toml +version = "Two" +``` + +## `normalize_doc_attributes` + +Convert `#![doc]` and `#[doc]` attributes to `//!` and `///` doc comments. + +- **Default value**: `false` +- **Possible values**: `true`, `false` +- **Stable**: No (tracking issue: #3351) + +#### `false` (default): + +```rust +#![doc = "Example documentation"] + +#[doc = "Example item documentation"] +pub enum Foo {} +``` + +#### `true`: + +```rust +//! Example documentation + +/// Example item documentation +pub enum Foo {} +``` + +## `inline_attribute_width` + +Write an item and its attribute on the same line if their combined width is below a threshold + +- **Default value**: 0 +- **Possible values**: any positive integer +- **Stable**: No (tracking issue: #3343) + +### Example + +#### `0` (default): +```rust +#[cfg(feature = "alloc")] +use core::slice; +``` + +#### `50`: +```rust +#[cfg(feature = "alloc")] use core::slice; +``` + ## `emit_mode` Internal option