diff options
-rw-r--r-- | src/ansi.rs | 4 | ||||
-rw-r--r-- | src/term.rs | 26 |
2 files changed, 26 insertions, 4 deletions
diff --git a/src/ansi.rs b/src/ansi.rs index 48f79d2b..45cc66f9 100644 --- a/src/ansi.rs +++ b/src/ansi.rs @@ -107,7 +107,7 @@ pub trait Handler { fn goto_col(&mut self, Column) {} /// Insert blank characters in current line starting from cursor - fn insert_blank(&mut self, usize) {} + fn insert_blank(&mut self, Column) {} /// Move cursor up `rows` fn move_up(&mut self, Line) {} @@ -470,7 +470,7 @@ impl<'a, H: Handler + TermInfo + 'a> vte::Perform for Performer<'a, H> { } match action { - '@' => handler.insert_blank(arg_or_default!(idx: 0, default: 1) as usize), + '@' => handler.insert_blank(Column(arg_or_default!(idx: 0, default: 1) as usize)), 'A' => { handler.move_up(Line(arg_or_default!(idx: 0, default: 1) as usize)); }, 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] |