diff --git a/crates/nu-command/src/commands.rs b/crates/nu-command/src/commands.rs index 05985b0f7..487395e78 100644 --- a/crates/nu-command/src/commands.rs +++ b/crates/nu-command/src/commands.rs @@ -115,6 +115,7 @@ pub(crate) mod split_by; pub(crate) mod str_; pub(crate) mod table; pub(crate) mod tags; +pub(crate) mod termsize; pub(crate) mod to; pub(crate) mod to_csv; pub(crate) mod to_html; @@ -265,6 +266,7 @@ pub(crate) use str_::{ }; pub(crate) use table::Table; pub(crate) use tags::Tags; +pub(crate) use termsize::TermSize; pub(crate) use to::To; pub(crate) use to_csv::ToCSV; pub(crate) use to_html::ToHTML; diff --git a/crates/nu-command/src/commands/default_context.rs b/crates/nu-command/src/commands/default_context.rs index de81993da..2531a1ec0 100644 --- a/crates/nu-command/src/commands/default_context.rs +++ b/crates/nu-command/src/commands/default_context.rs @@ -237,6 +237,7 @@ pub fn create_default_context(interactive: bool) -> Result &str { + "term size" + } + + fn signature(&self) -> Signature { + Signature::build("term size") + .switch("wide", "Report only the width of the terminal", Some('w')) + .switch("tall", "Report only the height of the terminal", Some('t')) + } + + fn usage(&self) -> &str { + "Returns the terminal size as W H" + } + + async fn run(&self, args: CommandArgs) -> Result { + let tag = args.call_info.name_tag.clone(); + let (TermSizeArgs { wide, tall }, _) = args.process().await?; + + let size = term_size::dimensions(); + match size { + Some((w, h)) => { + if wide && !tall { + Ok(OutputStream::one(UntaggedValue::int(w).into_value(tag))) + } else if !wide && tall { + Ok(OutputStream::one(UntaggedValue::int(h).into_value(tag))) + } else { + let mut indexmap = IndexMap::with_capacity(2); + indexmap.insert("width".to_string(), UntaggedValue::int(w).into_value(&tag)); + indexmap.insert("height".to_string(), UntaggedValue::int(h).into_value(&tag)); + let value = UntaggedValue::Row(Dictionary::from(indexmap)).into_value(&tag); + Ok(OutputStream::one(value)) + } + } + _ => Ok(OutputStream::one( + UntaggedValue::string("0 0".to_string()).into_value(tag), + )), + } + } + + fn examples(&self) -> Vec { + vec![ + Example { + description: "Return the width height of the terminal as W H", + example: "term size", + result: None, + }, + Example { + description: "Return the width of the terminal", + example: "term size -w", + result: None, + }, + Example { + description: "Return the height (t for tall) of the terminal", + example: "term size -t", + result: None, + }, + ] + } +}