diff --git a/crates/nu-command/src/filesystem/open.rs b/crates/nu-command/src/filesystem/open.rs index 5d53e2d612..a32743dbdc 100644 --- a/crates/nu-command/src/filesystem/open.rs +++ b/crates/nu-command/src/filesystem/open.rs @@ -124,6 +124,7 @@ impl Command for Open { RawStream::new( Box::new(BufferedReader { input: buf_reader }), ctrlc, + false, call_span, ), call_span, diff --git a/crates/nu-command/src/network/fetch.rs b/crates/nu-command/src/network/fetch.rs index 993077a56b..2d74968735 100644 --- a/crates/nu-command/src/network/fetch.rs +++ b/crates/nu-command/src/network/fetch.rs @@ -362,6 +362,7 @@ fn response_to_buffer( input: buffered_input, }), engine_state.ctrlc.clone(), + false, span, ), span, diff --git a/crates/nu-command/src/system/run_external.rs b/crates/nu-command/src/system/run_external.rs index c8d7afa47b..2b0e937cc2 100644 --- a/crates/nu-command/src/system/run_external.rs +++ b/crates/nu-command/src/system/run_external.rs @@ -243,7 +243,7 @@ impl ExternalCommand { let receiver = ChannelReceiver::new(rx); Ok(PipelineData::RawStream( - RawStream::new(Box::new(receiver), output_ctrlc, head), + RawStream::new(Box::new(receiver), output_ctrlc, true, head), head, None, )) diff --git a/crates/nu-command/src/viewers/table.rs b/crates/nu-command/src/viewers/table.rs index 38f181a7f5..4fdbb6ceff 100644 --- a/crates/nu-command/src/viewers/table.rs +++ b/crates/nu-command/src/viewers/table.rs @@ -72,6 +72,7 @@ impl Command for Table { .into_iter(), ), ctrlc, + false, head, ), head, @@ -188,6 +189,7 @@ impl Command for Table { stream, }), ctrlc, + false, head, ), head, diff --git a/crates/nu-engine/src/lib.rs b/crates/nu-engine/src/lib.rs index d559657c5e..6bee8e6c77 100644 --- a/crates/nu-engine/src/lib.rs +++ b/crates/nu-engine/src/lib.rs @@ -9,5 +9,7 @@ pub use call_ext::CallExt; pub use column::get_columns; pub use documentation::{generate_docs, get_brief_help, get_documentation, get_full_help}; pub use env::*; -pub use eval::{eval_block, eval_expression, eval_expression_with_input, eval_operator}; +pub use eval::{ + eval_block, eval_expression, eval_expression_with_input, eval_operator, eval_subexpression, +}; pub use glob_from::glob_from; diff --git a/crates/nu-protocol/src/pipeline_data.rs b/crates/nu-protocol/src/pipeline_data.rs index a128b2980c..456f3767e4 100644 --- a/crates/nu-protocol/src/pipeline_data.rs +++ b/crates/nu-protocol/src/pipeline_data.rs @@ -150,6 +150,8 @@ impl PipelineData { PipelineData::RawStream(s, ..) => { let mut items = vec![]; + let trim_end = s.trim_end; + for val in s { match val { Ok(val) => { @@ -170,6 +172,11 @@ impl PipelineData { } } } + + if trim_end { + output = output.trim_end().to_string(); + } + Ok(output) } } diff --git a/crates/nu-protocol/src/value/stream.rs b/crates/nu-protocol/src/value/stream.rs index 7478b7c221..ae82389aa5 100644 --- a/crates/nu-protocol/src/value/stream.rs +++ b/crates/nu-protocol/src/value/stream.rs @@ -12,6 +12,7 @@ pub struct RawStream { pub leftover: Vec, pub ctrlc: Option>, pub is_binary: bool, + pub trim_end: bool, pub span: Span, } @@ -19,6 +20,7 @@ impl RawStream { pub fn new( stream: Box, ShellError>> + Send + 'static>, ctrlc: Option>, + trim_end: bool, span: Span, ) -> Self { Self { @@ -26,6 +28,7 @@ impl RawStream { leftover: vec![], ctrlc, is_binary: false, + trim_end, span, } } @@ -43,10 +46,16 @@ impl RawStream { pub fn into_string(self) -> Result { let mut output = String::new(); + let trim_end = self.trim_end; + for item in self { output.push_str(&item?.as_string()?); } + if trim_end { + output = output.trim_end().to_string(); + } + Ok(output) } } diff --git a/src/main.rs b/src/main.rs index 8363b8e379..c9ef24e773 100644 --- a/src/main.rs +++ b/src/main.rs @@ -123,6 +123,7 @@ fn main() -> Result<()> { RawStream::new( Box::new(BufferedReader::new(buf_reader)), Some(ctrlc), + true, redirect_stdin.span, ), redirect_stdin.span, diff --git a/src/prompt_update.rs b/src/prompt_update.rs index 3bc212f6b7..6d8832755e 100644 --- a/src/prompt_update.rs +++ b/src/prompt_update.rs @@ -1,5 +1,5 @@ use nu_cli::NushellPrompt; -use nu_engine::eval_block; +use nu_engine::eval_subexpression; use nu_parser::parse; use nu_protocol::{ engine::{EngineState, Stack, StateWorkingSet}, @@ -59,7 +59,7 @@ fn get_prompt_string( .and_then(|v| match v { Value::Block { val: block_id, .. } => { let block = engine_state.get_block(block_id); - eval_block( + eval_subexpression( engine_state, stack, block, @@ -70,7 +70,7 @@ fn get_prompt_string( Value::String { val: source, .. } => { let mut working_set = StateWorkingSet::new(engine_state); let (block, _) = parse(&mut working_set, None, source.as_bytes(), true); - eval_block( + eval_subexpression( engine_state, stack, &block,