mirror of
https://github.com/wez/wezterm.git
synced 2024-12-24 22:01:47 +03:00
Add basic support for ICH which is used by bash CTRL-R
This commit is contained in:
parent
1c4500082f
commit
197819db6d
@ -59,6 +59,7 @@ pub enum CSIAction {
|
||||
SoftReset,
|
||||
EraseCharacter(i64),
|
||||
DeleteCharacter(i64),
|
||||
InsertCharacter(i64),
|
||||
}
|
||||
|
||||
/// Constrol Sequence Initiator (CSI) Parser.
|
||||
@ -430,6 +431,11 @@ impl<'a> Iterator for CSIParser<'a> {
|
||||
#[cfg_attr(feature = "cargo-clippy", allow(match_same_arms))]
|
||||
match (self.byte, self.intermediates, params) {
|
||||
(_, _, None) => None,
|
||||
|
||||
// ICH: Insert Character
|
||||
('@', &[], Some(&[])) => Some(CSIAction::InsertCharacter(1)),
|
||||
('@', &[], Some(&[n])) => Some(CSIAction::InsertCharacter(n)),
|
||||
|
||||
// CUU - Cursor Up n times
|
||||
('A', &[], Some(&[])) => Some(CSIAction::SetCursorXY {
|
||||
x: Position::Relative(0),
|
||||
|
@ -100,9 +100,17 @@ impl Screen {
|
||||
self.lines.iter().map(|l| l.clone()).collect()
|
||||
}
|
||||
|
||||
pub fn insert_cell(&mut self, x: usize, y: VisibleRowIndex) {
|
||||
let line_idx = self.phys_row(y);
|
||||
let line = self.line_mut(line_idx);
|
||||
line.invalidate_implicit_links();
|
||||
line.cells.insert(x, Cell::default());
|
||||
}
|
||||
|
||||
pub fn erase_cell(&mut self, x: usize, y: VisibleRowIndex) {
|
||||
let line_idx = self.phys_row(y);
|
||||
let line = self.line_mut(line_idx);
|
||||
line.invalidate_implicit_links();
|
||||
line.cells.remove(x);
|
||||
line.cells.push(Cell::default());
|
||||
}
|
||||
|
@ -1034,6 +1034,20 @@ impl TerminalState {
|
||||
}
|
||||
self.clear_selection_if_intersects(x..limit, y as ScrollbackOrVisibleRowIndex);
|
||||
}
|
||||
CSIAction::InsertCharacter(n) => {
|
||||
let y = self.cursor.y;
|
||||
let x = self.cursor.x;
|
||||
// TODO: this limiting behavior may not be correct. There's also a
|
||||
// SEM sequence that impacts the scope of ICH and ECH to consider.
|
||||
let limit = (x + n as usize).min(self.screen().physical_cols);
|
||||
{
|
||||
let screen = self.screen_mut();
|
||||
for x in x..limit as usize {
|
||||
screen.insert_cell(x, y);
|
||||
}
|
||||
}
|
||||
self.clear_selection_if_intersects(x..limit, y as ScrollbackOrVisibleRowIndex);
|
||||
}
|
||||
CSIAction::EraseCharacter(n) => {
|
||||
let y = self.cursor.y;
|
||||
let x = self.cursor.x;
|
||||
|
@ -19,6 +19,20 @@ fn test_vpa() {
|
||||
term.assert_cursor_pos(0, 1, None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ich() {
|
||||
let mut term = TestTerm::new(3, 4, 0);
|
||||
term.print("hey!wat?");
|
||||
term.cup(1, 0);
|
||||
term.print("\x1b[2@");
|
||||
assert_visible_contents(&term, &["h ey!", "wat?", " "]);
|
||||
// check how we handle overflowing the width
|
||||
term.print("\x1b[12@");
|
||||
assert_visible_contents(&term, &["h ey!", "wat?", " "]);
|
||||
term.print("\x1b[-12@");
|
||||
assert_visible_contents(&term, &["h ey!", "wat?", " "]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ech() {
|
||||
let mut term = TestTerm::new(3, 4, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user