diff options
| author | Aram Drevekenin <aram@poor.dev> | 2021-12-22 17:57:59 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-22 17:57:59 +0100 |
| commit | ec4649c7c9577c08bcd460f020c2749b03352167 (patch) | |
| tree | 505be62a4e315d5dce524cd73e6b1a0dc97459af | |
| parent | docs(changelog): post wide-char insertion fix (diff) | |
| download | sl0ppij-ec4649c7c9577c08bcd460f020c2749b03352167.tar.gz sl0ppij-ec4649c7c9577c08bcd460f020c2749b03352167.tar.xz sl0ppij-ec4649c7c9577c08bcd460f020c2749b03352167.zip | |
fix(compatibility): handle deleting chars in lines with widechars (#965)
* fix(compatibility): handle deleting chars in lines with widechars
* style(fmt): make rustfmt happy
6 files changed, 44 insertions, 4 deletions
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]$
[K[aram@green zellij]$ [7m🏠[27m🏠 abc5~[K[Kdabceabcfabc abc[1@x[1P
\ 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]$
[K[aram@green zellij]$ [7m🏠[27m🏠[7m🏠[27m🏠[7m🏠[27m🏠a🏠[1P🏠
\ 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<TerminalCharacter> { - 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 @@ -433,6 +433,30 @@ fn insert_character_in_line_with_wide_character() { } #[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(); let mut grid = Grid::new(21, 104, Palette::default()); 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 + |
