From ec4649c7c9577c08bcd460f020c2749b03352167 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Wed, 22 Dec 2021 17:57:59 +0100 Subject: [PATCH] fix(compatibility): handle deleting chars in lines with widechars (#965) * fix(compatibility): handle deleting chars in lines with widechars * style(fmt): make rustfmt happy --- src/tests/fixtures/wide-chars-delete-middle | 1 + .../wide-chars-delete-middle-after-multi | 1 + zellij-server/src/panes/grid.rs | 8 +++---- zellij-server/src/panes/unit/grid_tests.rs | 24 +++++++++++++++++++ ...iddle_of_line_with_multiple_widechars.snap | 7 ++++++ ..._char_in_middle_of_line_with_widechar.snap | 7 ++++++ 6 files changed, 44 insertions(+), 4 deletions(-) create mode 100755 src/tests/fixtures/wide-chars-delete-middle create mode 100755 src/tests/fixtures/wide-chars-delete-middle-after-multi create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_multiple_widechars.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_widechar.snap diff --git a/src/tests/fixtures/wide-chars-delete-middle b/src/tests/fixtures/wide-chars-delete-middle new file mode 100755 index 00000000..f2e3fb7e --- /dev/null +++ b/src/tests/fixtures/wide-chars-delete-middle @@ -0,0 +1 @@ +[?2004h[aram@green zellij]$ [aram@green zellij]$ 🏠🏠 abc5~dabceabcfabc abc[1@x \ No newline at end of file diff --git a/src/tests/fixtures/wide-chars-delete-middle-after-multi b/src/tests/fixtures/wide-chars-delete-middle-after-multi new file mode 100755 index 00000000..2e96ecad --- /dev/null +++ b/src/tests/fixtures/wide-chars-delete-middle-after-multi @@ -0,0 +1 @@ +[?2004h[aram@green zellij]$ [aram@green zellij]$ 🏠🏠🏠🏠🏠🏠a🏠🏠 \ No newline at end of file diff --git a/zellij-server/src/panes/grid.rs b/zellij-server/src/panes/grid.rs index 4bda27e0..77e2bb39 100644 --- a/zellij-server/src/panes/grid.rs +++ b/zellij-server/src/panes/grid.rs @@ -2249,8 +2249,7 @@ impl Row { } } pub fn insert_character_at(&mut self, terminal_character: TerminalCharacter, x: usize) { - let width_offset = self.excess_width_until(x); - let insert_position = x.saturating_sub(width_offset); + let insert_position = self.absolute_character_index(x); match self.columns.len().cmp(&insert_position) { Ordering::Equal => self.columns.push_back(terminal_character), Ordering::Less => { @@ -2368,8 +2367,9 @@ impl Row { self.columns.is_empty() } pub fn delete_and_return_character(&mut self, x: usize) -> Option { - if x < self.columns.len() { - Some(self.columns.remove(x).unwrap()) // TODO: just return the remove part? + let erase_position = self.absolute_character_index(x); + if erase_position < self.columns.len() { + Some(self.columns.remove(erase_position).unwrap()) // TODO: just return the remove part? } else { None } diff --git a/zellij-server/src/panes/unit/grid_tests.rs b/zellij-server/src/panes/unit/grid_tests.rs index 3fd0f958..c8570021 100644 --- a/zellij-server/src/panes/unit/grid_tests.rs +++ b/zellij-server/src/panes/unit/grid_tests.rs @@ -432,6 +432,30 @@ fn insert_character_in_line_with_wide_character() { assert_snapshot!(format!("{:?}", grid)); } +#[test] +fn delete_char_in_middle_of_line_with_widechar() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(21, 104, Palette::default()); + let fixture_name = "wide-chars-delete-middle"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +fn delete_char_in_middle_of_line_with_multiple_widechars() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(21, 104, Palette::default()); + let fixture_name = "wide-chars-delete-middle-after-multi"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + #[test] fn fish_wide_characters_override_clock() { let mut vte_parser = vte::Parser::new(); diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_multiple_widechars.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_multiple_widechars.snap new file mode 100644 index 00000000..75c8a772 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_multiple_widechars.snap @@ -0,0 +1,7 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): [aram@green zellij]$ 🏠🏠🏠 + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_widechar.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_widechar.snap new file mode 100644 index 00000000..6a442b69 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_widechar.snap @@ -0,0 +1,7 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): [aram@green zellij]$ 🏠 def abc +