From f69ea009a3f539d320fa0e7780730bcd35bdf772 Mon Sep 17 00:00:00 2001 From: Joe Wilm Date: Mon, 10 Oct 2016 08:29:51 -0700 Subject: Implement blank character insertion This is used by things like Bash's reverse-i-search and things get *very* messed up without it. --- src/term.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/term.rs') diff --git a/src/term.rs b/src/term.rs index 92604b7a..7a80c6fb 100644 --- a/src/term.rs +++ b/src/term.rs @@ -500,8 +500,30 @@ impl ansi::Handler for Term { } #[inline] - fn insert_blank(&mut self, num: usize) { - err_println!("[unimplemented] insert_blank: {}", num); + fn insert_blank(&mut self, count: Column) { + // Ensure inserting within terminal bounds + let count = ::std::cmp::min(count, self.size_info.cols() - self.cursor.col); + + let source = self.cursor.col; + let destination = self.cursor.col + count; + let num_cells = (self.size_info.cols() - destination).0; + + let line = self.cursor.line; // borrowck + let line = &mut self.grid[line]; + + unsafe { + let src = line[source..].as_ptr(); + let dst = line[destination..].as_mut_ptr(); + + ptr::copy(src, dst, num_cells); + } + + // Cells were just moved out towards the end of the line; fill in + // between source and dest with blanks. + let template = self.template_cell.clone(); + for c in &mut line[source..destination] { + c.reset(&template); + } } #[inline] -- cgit