From 2bfb3f70248f3b8209917b7e0ff9a0b47459f608 Mon Sep 17 00:00:00 2001 From: Jasper Bryant-Greene Date: Fri, 29 Sep 2017 14:05:19 +0200 Subject: [PATCH] implement ANSI CSI REP (Repeat) --- src/ansi.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/ansi.rs b/src/ansi.rs index 9e682cd3..0e12736d 100644 --- a/src/ansi.rs +++ b/src/ansi.rs @@ -85,7 +85,9 @@ pub struct Processor { } /// Internal state for VTE processor -struct ProcessorState; +struct ProcessorState { + preceding_char: Option +} /// Helper type that implements `vte::Perform`. /// @@ -116,7 +118,7 @@ impl<'a, H: Handler + TermInfo + 'a, W: io::Write> Performer<'a, H, W> { impl Default for Processor { fn default() -> Processor { Processor { - state: ProcessorState, + state: ProcessorState { preceding_char: None }, parser: vte::Parser::new(), } } @@ -652,6 +654,7 @@ impl<'a, H, W> vte::Perform for Performer<'a, H, W> #[inline] fn print(&mut self, c: char) { self.handler.input(c); + self._state.preceding_char = Some(c); } #[inline] @@ -841,6 +844,16 @@ impl<'a, H, W> vte::Perform for Performer<'a, H, W> 'A' => { handler.move_up(Line(arg_or_default!(idx: 0, default: 1) as usize)); }, + 'b' => { + if let Some(c) = self._state.preceding_char { + for _ in 0..arg_or_default!(idx: 0, default: 1) { + handler.input(c); + } + } + else { + warn!("tried to repeat with no preceding char"); + } + }, 'B' | 'e' => handler.move_down(Line(arg_or_default!(idx: 0, default: 1) as usize)), 'c' => handler.identify_terminal(writer), 'C' | 'a' => handler.move_forward(Column(arg_or_default!(idx: 0, default: 1) as usize)),