mirror of
https://github.com/wez/wezterm.git
synced 2024-11-23 23:21:08 +03:00
Implement CSI REP
This commit is contained in:
parent
2c32eb9337
commit
fd2e5855a5
@ -1515,6 +1515,18 @@ impl TerminalState {
|
|||||||
Edit::ScrollDown(n) => self.scroll_down(n as usize),
|
Edit::ScrollDown(n) => self.scroll_down(n as usize),
|
||||||
Edit::ScrollUp(n) => self.scroll_up(n as usize),
|
Edit::ScrollUp(n) => self.scroll_up(n as usize),
|
||||||
Edit::EraseInDisplay(erase) => self.erase_in_display(erase),
|
Edit::EraseInDisplay(erase) => self.erase_in_display(erase),
|
||||||
|
Edit::Repeat(n) => {
|
||||||
|
let y = self.cursor.y;
|
||||||
|
let x = self.cursor.x;
|
||||||
|
let to_copy = x.saturating_sub(1);
|
||||||
|
let screen = self.screen_mut();
|
||||||
|
let line_idx = screen.phys_row(y);
|
||||||
|
let line = screen.line_mut(line_idx);
|
||||||
|
if let Some(cell) = line.cells().get(to_copy).cloned() {
|
||||||
|
line.fill_range(x..=x + n as usize, &cell);
|
||||||
|
self.set_cursor_pos(&Position::Relative(i64::from(n)), &Position::Relative(0))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,15 @@ fn test_vpa() {
|
|||||||
term.assert_cursor_pos(0, 1, None);
|
term.assert_cursor_pos(0, 1, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_rep() {
|
||||||
|
let mut term = TestTerm::new(3, 4, 0);
|
||||||
|
term.print("h");
|
||||||
|
term.cup(1, 0);
|
||||||
|
term.print("\x1b[2ba");
|
||||||
|
assert_visible_contents(&term, &["hhha", " ", " "]);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_ich() {
|
fn test_ich() {
|
||||||
let mut term = TestTerm::new(3, 4, 0);
|
let mut term = TestTerm::new(3, 4, 0);
|
||||||
|
@ -668,6 +668,9 @@ pub enum Edit {
|
|||||||
|
|
||||||
/// ED - ERASE IN PAGE (XTerm calls this Erase in Display)
|
/// ED - ERASE IN PAGE (XTerm calls this Erase in Display)
|
||||||
EraseInDisplay(EraseInDisplay),
|
EraseInDisplay(EraseInDisplay),
|
||||||
|
|
||||||
|
/// REP - Repeat the preceding character n times
|
||||||
|
Repeat(u32),
|
||||||
}
|
}
|
||||||
|
|
||||||
trait EncodeCSIParam {
|
trait EncodeCSIParam {
|
||||||
@ -707,6 +710,7 @@ impl Display for Edit {
|
|||||||
Edit::ScrollDown(n) => n.write_csi(f, "T")?,
|
Edit::ScrollDown(n) => n.write_csi(f, "T")?,
|
||||||
Edit::ScrollUp(n) => n.write_csi(f, "S")?,
|
Edit::ScrollUp(n) => n.write_csi(f, "S")?,
|
||||||
Edit::EraseInDisplay(n) => n.write_csi(f, "J")?,
|
Edit::EraseInDisplay(n) => n.write_csi(f, "J")?,
|
||||||
|
Edit::Repeat(n) => n.write_csi(f, "b")?,
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -1144,6 +1148,7 @@ impl<'a> CSIParser<'a> {
|
|||||||
('Z', &[]) => parse!(Cursor, BackwardTabulation, params),
|
('Z', &[]) => parse!(Cursor, BackwardTabulation, params),
|
||||||
|
|
||||||
('a', &[]) => parse!(Cursor, CharacterPositionForward, params),
|
('a', &[]) => parse!(Cursor, CharacterPositionForward, params),
|
||||||
|
('b', &[]) => parse!(Edit, Repeat, params),
|
||||||
('d', &[]) => parse!(Cursor, LinePositionAbsolute, params),
|
('d', &[]) => parse!(Cursor, LinePositionAbsolute, params),
|
||||||
('e', &[]) => parse!(Cursor, LinePositionForward, params),
|
('e', &[]) => parse!(Cursor, LinePositionForward, params),
|
||||||
('f', &[]) => parse!(Cursor, CharacterAndLinePosition, line, col, params),
|
('f', &[]) => parse!(Cursor, CharacterAndLinePosition, line, col, params),
|
||||||
|
Loading…
Reference in New Issue
Block a user