diff options
author | Aram Drevekenin <aram@poor.dev> | 2021-05-26 18:05:43 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-26 18:05:43 +0200 |
commit | 44d67de187640b0064716050f082be2f330d8df5 (patch) | |
tree | 7ffebf7aa616a4ae05a579fd601bad62b8915ace | |
parent | f55805d653d86e4ac5c1386a980d929b09cb18e5 (diff) |
fix(compatibility): support wide characters (#535)
* fix(compatibility): support wide characters
* style(fmt): rustfmt
* style(fmt): make clippy happy
34 files changed, 659 insertions, 117 deletions
diff --git a/src/tests/fixtures/bash_delete_wide_characters b/src/tests/fixtures/bash_delete_wide_characters new file mode 100755 index 000000000..193761916 --- /dev/null +++ b/src/tests/fixtures/bash_delete_wide_characters @@ -0,0 +1,3 @@ +[2m⏎(B[m
⏎
[KWelcome to fish, the friendly interactive shell
+[?2004h]0;fish /home/aram/code/zellij[30m(B[m[97m[46m⋊>(B[m [33m~/c/zellij(B[m on [32mwide-char(B[m ⨯ [K[43C[38;2;85;85;85m15:35:20(B[m
[72C
[29C
[29Cb[J[66C[38;2;85;85;85m15:35:20(B[m
[96C
[30C[91mb[66C[30m(B[m[38;2;85;85;85m15:35:20(B[m
[96C
[30C[38;2;85;85;85mash[63C[30m(B[m[38;2;85;85;85m15:35:20(B[m
[96C
[30C[91ma[38;2;85;85;85msh[63C[30m(B[m[38;2;85;85;85m15:35:20(B[m
[96C
[31C[91ms[38;2;85;85;85mh[63C[30m(B[m[38;2;85;85;85m15:35:20(B[m
[96C
[32C[91mh[63C[30m(B[m[38;2;85;85;85m15:35:20(B[m
[96C
[33C[1mbash[63C(B[m[38;2;85;85;85m15:35:20(B[m
[96C
[33C[63C[38;2;85;85;85m15:35:20(B[m
[96C
[33C
+[30m(B[m[?2004l]0;bash /home/aram/code/zellij[30m(B[m
[?2004h[aram@green zellij]$ HHHHHHH[K
\ No newline at end of file diff --git a/src/tests/fixtures/delete_wide_character_under_cursor b/src/tests/fixtures/delete_wide_character_under_cursor new file mode 100644 index 000000000..13f3e84dc --- /dev/null +++ b/src/tests/fixtures/delete_wide_character_under_cursor @@ -0,0 +1 @@ +12H4[3D[1P
diff --git a/src/tests/fixtures/delete_wide_characters_before_cursor b/src/tests/fixtures/delete_wide_characters_before_cursor new file mode 100644 index 000000000..dfdad4b94 --- /dev/null +++ b/src/tests/fixtures/delete_wide_characters_before_cursor @@ -0,0 +1 @@ +Hi there HiHi[1K
\ No newline at end of file diff --git a/src/tests/fixtures/delete_wide_characters_before_cursor_when_cursor_is_on_wide_character b/src/tests/fixtures/delete_wide_characters_before_cursor_when_cursor_is_on_wide_character new file mode 100644 index 000000000..4d0c1ffed --- /dev/null +++ b/src/tests/fixtures/delete_wide_characters_before_cursor_when_cursor_is_on_wide_character @@ -0,0 +1 @@ +Hi there HiHi[1K
\ No newline at end of file diff --git a/src/tests/fixtures/fish_wide_characters_override_clock b/src/tests/fixtures/fish_wide_characters_override_clock new file mode 100755 index 000000000..bad6143a4 --- /dev/null +++ b/src/tests/fixtures/fish_wide_characters_override_clock @@ -0,0 +1,2 @@ +[2m⏎(B[m
⏎
[KWelcome to fish, the friendly interactive shell
+[?2004h]0;fish /home/aram/code/zellij[30m(B[m[97m[46m⋊>(B[m [33m~/c/zellij(B[m on [32mmain(B[m ⨯ [K[48C[38;2;85;85;85m15:53:10(B[m
[72C
[24C
[24CH[J[70C[38;2;85;85;85m15:53:10(B[m
[96C
[26C[91mH[70C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[26C[91mH[68C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[28C[91mH[66C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[30C[91mH[64C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[32C[91mH[62C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[34C[91mH[60C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[36C[91mH[58C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[38C[91mH[56C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[40C[91mH[54C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[42C[91mH[52C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[44C[91mH[50C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[46C[91mH[48C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[48C[91mH[46C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[50C[91mH[44C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[52C[91mH[42C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[54C[91mH[40C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[56C[91mH[38C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[58C[91mH[36C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[60C[91mH[34C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[62C[91mH[32C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[64C[91mH[30C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[66C[91mH[28C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[68C[91mH[26C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[70C[91mH[24C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[72C[91mH[22C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[74C[91mH[20C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[76C[91mH[18C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[78C[91mH[16C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[80C[91mH[14C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[82C[91mH[12C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[84C[91mH[10C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[86C[91mH[8C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[88C[91mH[6C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[90C[91mH[4C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[92C[91mH[C[C[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[94C[91mH[30m(B[m[38;2;85;85;85m15:53:10(B[m
[96C
[96C[91mH[30m(B[m[K
\ No newline at end of file diff --git a/src/tests/fixtures/replace_wide_character_under_cursor b/src/tests/fixtures/replace_wide_character_under_cursor new file mode 100644 index 000000000..1759e0848 --- /dev/null +++ b/src/tests/fixtures/replace_wide_character_under_cursor @@ -0,0 +1 @@ +12H4[3D[1X
diff --git a/src/tests/fixtures/wide_characters b/src/tests/fixtures/wide_characters new file mode 100755 index 000000000..ece8e61b6 --- /dev/null +++ b/src/tests/fixtures/wide_characters @@ -0,0 +1,2 @@ +[2m⏎(B[m
⏎
[KWelcome to fish, the friendly interactive shell
+[?2004h]0;fish /home/aram/code/zellij[30m(B[m[97m[46m⋊>(B[m [33m~/c/zellij(B[m on [32mmain(B[m ⨯ [K[48C[38;2;85;85;85m15:19:10(B[m
[72C
[24C
[24CH[J[70C[38;2;85;85;85m15:19:10(B[m
[96C
[26C[91mH[70C[30m(B[m[38;2;85;85;85m15:19:10(B[m
[96C
[26C[91mH[68C[30m(B[m[38;2;85;85;85m15:19:10(B[m
[96C
[28C[91mH[66C[30m(B[m[38;2;85;85;85m15:19:10(B[m
[96C
[30C[91mH[64C[30m(B[m[38;2;85;85;85m15:19:10(B[m
[96C
[32C[91mH[62C[30m(B[m[38;2;85;85;85m15:19:10(B[m
[96C
[34C[91mH[60C[30m(B[m[38;2;85;85;85m15:19:10(B[m
[96C
[36C[91mH[58C[30m(B[m[38;2;85;85;85m15:19:10(B[m
[96C
[38C
\ No newline at end of file diff --git a/src/tests/fixtures/wide_characters_full b/src/tests/fixtures/wide_characters_full new file mode 100644 index 000000000..a83b5eb24 --- /dev/null +++ b/src/tests/fixtures/wide_characters_full @@ -0,0 +1,31 @@ +
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH +
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +
llllllllllllllllllllllllllllllllllllllllllllll +
llllllllllllllllllllllllllllllllllllllllllllll +
oooooooooooooooooooooooooooooooooooooooooooooo +
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH +
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +
llllllllllllllllllllllllllllllllllllllllllllll +
llllllllllllllllllllllllllllllllllllllllllllll +
oooooooooooooooooooooooooooooooooooooooooooooo +
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH +
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +
llllllllllllllllllllllllllllllllllllllllllllll +
llllllllllllllllllllllllllllllllllllllllllllll +
oooooooooooooooooooooooooooooooooooooooooooooo +
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH +
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +
llllllllllllllllllllllllllllllllllllllllllllll +
llllllllllllllllllllllllllllllllllllllllllllll +
oooooooooooooooooooooooooooooooooooooooooooooo +
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH +
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +
llllllllllllllllllllllllllllllllllllllllllllll +
llllllllllllllllllllllllllllllllllllllllllllll +
oooooooooooooooooooooooooooooooooooooooooooooo +
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH +
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee +
llllllllllllllllllllllllllllllllllllllllllllll +
llllllllllllllllllllllllllllllllllllllllllllll +
oooooooooooooooooooooooooooooooooooooooooooooo +
diff --git a/src/tests/fixtures/wide_characters_line_end b/src/tests/fixtures/wide_characters_line_end new file mode 100644 index 000000000..a0c771453 --- /dev/null +++ b/src/tests/fixtures/wide_characters_line_end @@ -0,0 +1,30 @@ +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaH +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaH +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaH +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaH +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaH +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaH +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao diff --git a/src/tests/fixtures/wide_characters_line_middle b/src/tests/fixtures/wide_characters_line_middle new file mode 100644 index 000000000..85629ebe6 --- /dev/null +++ b/src/tests/fixtures/wide_characters_line_middle @@ -0,0 +1,30 @@ +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalaaaa +
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaaa diff --git a/src/tests/fixtures/wide_characters_line_wrap b/src/tests/fixtures/wide_characters_line_wrap new file mode 100755 index 000000000..2888600b8 --- /dev/null +++ b/src/tests/fixtures/wide_characters_line_wrap @@ -0,0 +1,3 @@ +[2m⏎(B[m
⏎
[KWelcome to fish, the friendly interactive shell
+[?2004h]0;fish /home/aram/code/zellij[30m(B[m[97m[46m⋊>(B[m [33m~/c/zellij(B[m on [32mmain(B[m ⨯ [K[48C[38;2;85;85;85m15:50:11(B[m
[72C
[24C
[24Cb[J[71C[38;2;85;85;85m15:50:11(B[m
[96C
[25C[91mb[71C[30m(B[m[38;2;85;85;85m15:50:11(B[m
[96C
[25C[38;2;85;85;85mash[68C[30m(B[m[38;2;85;85;85m15:50:11(B[m
[96C
[25C[91ma[38;2;85;85;85msh[68C[30m(B[m[38;2;85;85;85m15:50:11(B[m
[96C
[26C[91ms[38;2;85;85;85mh[68C[30m(B[m[38;2;85;85;85m15:50:11(B[m
[96C
[27C[91mh[68C[30m(B[m[38;2;85;85;85m15:50:11(B[m
[96C
[28C[1mbash[68C(B[m[38;2;85;85;85m15:50:11(B[m
[96C
[28C[68C[38;2;85;85;85m15:50:11(B[m
[96C
[28C
+[30m(B[m[?2004l]0;bash /home/aram/code/zellij[30m(B[m
[?2004h[aram@green zellij]$ HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH [KHHHHH
\ No newline at end of file diff --git a/zellij-server/src/panes/grid.rs b/zellij-server/src/panes/grid.rs index ac347db0e..14bdbcd16 100644 --- a/zellij-server/src/panes/grid.rs +++ b/zellij-server/src/panes/grid.rs @@ -1,3 +1,5 @@ +use unicode_width::UnicodeWidthChar; + use std::{ cmp::Ordering, collections::{BTreeSet, VecDeque}, @@ -251,9 +253,6 @@ impl Grid { colors, } } - pub fn contains_widechar(&self) -> bool { - self.viewport.iter().any(|c| c.contains_widechar()) - } pub fn advance_to_next_tabstop(&mut self, styles: CharacterStyles) { let mut next_tabstop = None; for tabstop in self.horizontal_tabstops.iter() { @@ -421,12 +420,12 @@ impl Grid { canonical_line_parts.push(Row::new().canonical()); } while !canonical_line.columns.is_empty() { - let next_wrap = if canonical_line.len() > new_columns { - canonical_line.columns.drain(..new_columns) + let next_wrap = if canonical_line.width() > new_columns { + canonical_line.drain_until(new_columns) } else { - canonical_line.columns.drain(..) + canonical_line.columns.drain(..).collect() }; - let row = Row::from_columns(next_wrap.collect()); + let row = Row::from_columns(next_wrap); // if there are no more parts, this row is canonical as long as it originally // was canonical (it might not have been for example if it's the first row in // the viewport, and the actual canonical row is above it in the scrollback) @@ -522,9 +521,13 @@ impl Grid { .viewport .iter() .map(|r| { + let excess_width = r.excess_width(); let mut line: Vec<TerminalCharacter> = r.columns.iter().copied().collect(); // pad line - line.resize(self.width, EMPTY_TERMINAL_CHARACTER); + line.resize( + self.width.saturating_sub(excess_width), + EMPTY_TERMINAL_CHARACTER, + ); line }) .collect(); @@ -657,7 +660,11 @@ impl Grid { } } } - pub fn add_character_at_cursor_position(&mut self, terminal_character: TerminalCharacter) { + pub fn add_character_at_cursor_position( + &mut self, + terminal_character: TerminalCharacter, + max_width: usize, + ) { match self.viewport.get_mut(self.cursor.y) { Some(row) => { if self.insert_mode { @@ -665,6 +672,7 @@ impl Grid { } else { row.add_character_at(terminal_character, self.cursor.x); } + row.tr |