summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2021-05-26 18:05:43 +0200
committerGitHub <noreply@github.com>2021-05-26 18:05:43 +0200
commit44d67de187640b0064716050f082be2f330d8df5 (patch)
tree7ffebf7aa616a4ae05a579fd601bad62b8915ace
parentf55805d653d86e4ac5c1386a980d929b09cb18e5 (diff)
fix(compatibility): support wide characters (#535)
* fix(compatibility): support wide characters * style(fmt): rustfmt * style(fmt): make clippy happy
-rwxr-xr-xsrc/tests/fixtures/bash_delete_wide_characters3
-rw-r--r--src/tests/fixtures/delete_wide_character_under_cursor1
-rw-r--r--src/tests/fixtures/delete_wide_characters_before_cursor1
-rw-r--r--src/tests/fixtures/delete_wide_characters_before_cursor_when_cursor_is_on_wide_character1
-rwxr-xr-xsrc/tests/fixtures/fish_wide_characters_override_clock2
-rw-r--r--src/tests/fixtures/replace_wide_character_under_cursor1
-rwxr-xr-xsrc/tests/fixtures/wide_characters2
-rw-r--r--src/tests/fixtures/wide_characters_full31
-rw-r--r--src/tests/fixtures/wide_characters_line_end30
-rw-r--r--src/tests/fixtures/wide_characters_line_middle30
-rwxr-xr-xsrc/tests/fixtures/wide_characters_line_wrap3
-rw-r--r--zellij-server/src/panes/grid.rs181
-rw-r--r--zellij-server/src/panes/plugin_pane.rs3
-rw-r--r--zellij-server/src/panes/terminal_character.rs14
-rw-r--r--zellij-server/src/panes/terminal_pane.rs3
-rw-r--r--zellij-server/src/panes/unit/grid_tests.rs159
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__bash_delete_wide_characters.snap9
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_wide_character_under_cursor.snap8
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_wide_characters_before_cursor.snap7
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__delete_wide_characters_before_cursor_when_cursor_is_on_wide_character.snap7
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__fish_wide_characters_override_clock.snap8
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__replace_wide_character_under_cursor.snap8
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__unwrap_wide_characters_on_size_change.snap27
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vttest8_1.snap2
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vttest8_2.snap2
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vttest8_3.snap48
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__vttest8_4.snap48
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__wide_characters.snap8
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__wide_characters_line_wrap.snap10
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__wrap_wide_characters.snap27
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__wrap_wide_characters_at_the_end_of_the_line.snap27
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__wrap_wide_characters_in_the_middle_of_the_line.snap27
-rw-r--r--zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__wrap_wide_characters_on_size_change.snap27
-rw-r--r--zellij-server/src/tab.rs11
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 @@
+⏎(B ⏎ Welcome to fish, the friendly interactive shell
+[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on wide-char(B ⨯ 15:35:20(B   b15:35:20(B  b(B15:35:20(B  ash(B15:35:20(B  ash(B15:35:20(B  sh(B15:35:20(B  h(B15:35:20(B  bash(B15:35:20(B  15:35:20(B  
+(B[?2004l]0;bash /home/aram/code/zellij(B [?2004h[aram@green zellij]$ HHHHHHH \ 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
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 \ 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 \ 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 @@
+⏎(B ⏎ Welcome to fish, the friendly interactive shell
+[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on main(B ⨯ 15:53:10(B   H15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B15:53:10(B  H(B \ 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
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 @@
+⏎(B ⏎ Welcome to fish, the friendly interactive shell
+[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on main(B ⨯ 15:19:10(B   H15:19:10(B  H(B15:19:10(B  H(B15:19:10(B  H(B15:19:10(B  H(B15:19:10(B  H(B15:19:10(B  H(B15:19:10(B  H(B15:19:10(B   \ 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 @@
+⏎(B ⏎ Welcome to fish, the friendly interactive shell
+[?2004h]0;fish /home/aram/code/zellij(B⋊>(B ~/c/zellij(B on main(B ⨯ 15:50:11(B   b15:50:11(B  b(B15:50:11(B  ash(B15:50:11(B  ash(B15:50:11(B  sh(B15:50:11(B  h(B15:50:11(B  bash(B15:50:11(B  15:50:11(B  
+(B[?2004l]0;bash /home/aram/code/zellij(B [?2004h[aram@green zellij]$ HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH HHHHH \ 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