diff --git a/src/output.rs b/src/output.rs index b8918cbb4..14338cedd 100644 --- a/src/output.rs +++ b/src/output.rs @@ -456,6 +456,35 @@ pub fn stdoutput() -> &'static RefCell { } } +pub struct BufferedOuputter<'a>(&'a mut Outputter); + +impl<'a> BufferedOuputter<'a> { + pub fn new(outputter: &'a mut Outputter) -> Self { + outputter.begin_buffering(); + Self(outputter) + } +} + +impl<'a> Drop for BufferedOuputter<'a> { + fn drop(&mut self) { + self.0.end_buffering(); + } +} + +impl<'a> Write for BufferedOuputter<'a> { + fn write(&mut self, buf: &[u8]) -> Result { + self.0 + .write(buf) + .expect("Writing to in-memory buffer should never fail"); + Ok(buf.len()) + } + + fn flush(&mut self) -> Result<()> { + self.0.flush().unwrap(); + Ok(()) + } +} + /// Given a list of RgbColor, pick the "best" one, as determined by the color support. Returns /// RgbColor::NONE if empty. pub fn best_color(candidates: &[RgbColor], support: ColorSupport) -> RgbColor { diff --git a/src/reader.rs b/src/reader.rs index 2bbb6a25e..16384174f 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -704,11 +704,12 @@ fn read_i(parser: &Parser) -> i32 { parser.libdata_mut().exit_current_script = false; // OSC 133 "Command finished" - let _ = write!( - Outputter::stdoutput().borrow_mut(), + write!( + BufferedOuputter::new(&mut Outputter::stdoutput().borrow_mut()), "\x1b]133;D;{}\x07", parser.get_last_status() - ); + ) + .unwrap(); event::fire_generic(parser, L!("fish_postexec").to_owned(), vec![command]); // Allow any pending history items to be returned in the history array. data.history.resolve_pending();