aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2021-12-22 17:57:59 +0100
committerGitHub <noreply@github.com>2021-12-22 17:57:59 +0100
commitec4649c7c9577c08bcd460f020c2749b03352167 (patch)
tree505be62a4e315d5dce524cd73e6b1a0dc97459af
parentdocs(changelog): post wide-char insertion fix (diff)
downloadsl0ppij-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
-rwxr-xr-xsrc/tests/fixtures/wide-chars-delete-middle1
-rwxr-xr-xsrc/tests/fixtures/wide-chars-delete-middle-after-multi1
-rw-r--r--zellij-server/src/panes/grid.rs8
-rw-r--r--zellij-server/src/panes/unit/grid_tests.rs24
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_multiple_widechars.snap7
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_char_in_middle_of_line_with_widechar.snap7
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]$ [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<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
+