Allow offset values in --terminal-width

Allows the `width` argument to `--terminal-width` to be an offset
instead of an absolute number. Examples:

    --terminal-width=80   # Set output width to 80 characters
    --terminal-width=-2   # Set output width to actual_width - 2

closes #376
This commit is contained in:
sharkdp 2018-10-31 21:34:34 +01:00 committed by David Peter
parent 78f26d0caf
commit dda27b253b
2 changed files with 23 additions and 3 deletions

View File

@ -196,7 +196,23 @@ impl App {
term_width: self
.matches
.value_of("terminal-width")
.and_then(|w| w.parse().ok())
.and_then(|w| {
if w.starts_with("+") || w.starts_with("-") {
// Treat argument as a delta to the current terminal width
w.parse().ok().map(|delta: i16| {
let old_width: u16 = Term::stdout().size().1;
let new_width: i32 = old_width as i32 + delta as i32;
if new_width <= 0 {
old_width as usize
} else {
new_width as usize
}
})
} else {
w.parse().ok()
}
})
.unwrap_or(Term::stdout().size().1 as usize),
loop_through: !(self.interactive_output
|| self.matches.value_of("color") == Some("always")

View File

@ -287,8 +287,12 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
.long("terminal-width")
.takes_value(true)
.value_name("width")
.hidden(true)
.help("Set the width of the terminal"),
.hidden_short_help(true)
.help(
"Explicitly set the width of the terminal instead of determining it \
automatically. If prefixed with '+' or '-', the value will be treated \
as an offset to the actual terminal width.",
),
)
.arg(
Arg::with_name("no-config")