diff --git a/clap_builder/src/builder/styled_str.rs b/clap_builder/src/builder/styled_str.rs index d856a3015162..ddf5a75d8e57 100644 --- a/clap_builder/src/builder/styled_str.rs +++ b/clap_builder/src/builder/styled_str.rs @@ -47,6 +47,19 @@ impl StyledStr { self.0 = self.0.trim().to_owned() } + pub(crate) fn trim_start_lines(&mut self) { + if let Some(pos) = self.0.find('\n') { + let (leading, help) = self.0.split_at(pos + 1); + if leading.trim().is_empty() { + self.0 = help.to_owned() + } + } + } + + pub(crate) fn trim_end(&mut self) { + self.0 = self.0.trim_end().to_owned() + } + #[cfg(feature = "help")] pub(crate) fn replace_newline_var(&mut self) { self.0 = self.0.replace("{n}", "\n"); diff --git a/clap_builder/src/output/help.rs b/clap_builder/src/output/help.rs index 410616eb1b80..a5073a9e4b63 100644 --- a/clap_builder/src/output/help.rs +++ b/clap_builder/src/output/help.rs @@ -30,8 +30,10 @@ pub(crate) fn write_help(writer: &mut StyledStr, cmd: &Command, usage: &Usage<'_ } } - // Remove any extra lines caused by book keeping - writer.trim(); + // Remove any lines from unused sections + writer.trim_start_lines(); + // Remove any whitespace caused by book keeping + writer.trim_end(); // Ensure there is still a trailing newline writer.push_str("\n"); } diff --git a/tests/builder/help.rs b/tests/builder/help.rs index 23c05b96cb55..0d6509bdc9b5 100644 --- a/tests/builder/help.rs +++ b/tests/builder/help.rs @@ -1342,7 +1342,7 @@ fn dont_strip_padding_issue_5083() { Command::new("two"), Command::new("three"), ]); - static EXPECTED: &str = "one + static EXPECTED: &str = " one two three help Print this message or the help of the given subcommand(s)