fix(compatibility): handle inserting characters after wide character (#964)

* fix(compatibility): handle inserting characters in the middle of a line after a wide character

* style(fmt): make rustfmt happy
This commit is contained in:
Aram Drevekenin 2021-12-22 14:34:28 +01:00 committed by GitHub
parent be54e2b2e0
commit 52977a761f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 32 additions and 9 deletions

12
Cargo.lock generated
View file

@ -2879,7 +2879,7 @@ dependencies = [
[[package]] [[package]]
name = "zellij" name = "zellij"
version = "0.23.0" version = "0.24.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"dialoguer", "dialoguer",
@ -2896,7 +2896,7 @@ dependencies = [
[[package]] [[package]]
name = "zellij-client" name = "zellij-client"
version = "0.23.0" version = "0.24.0"
dependencies = [ dependencies = [
"insta", "insta",
"log", "log",
@ -2909,7 +2909,7 @@ dependencies = [
[[package]] [[package]]
name = "zellij-server" name = "zellij-server"
version = "0.23.0" version = "0.24.0"
dependencies = [ dependencies = [
"ansi_term 0.12.1", "ansi_term 0.12.1",
"async-trait", "async-trait",
@ -2935,7 +2935,7 @@ dependencies = [
[[package]] [[package]]
name = "zellij-tile" name = "zellij-tile"
version = "0.23.0" version = "0.24.0"
dependencies = [ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
@ -2945,14 +2945,14 @@ dependencies = [
[[package]] [[package]]
name = "zellij-tile-utils" name = "zellij-tile-utils"
version = "0.23.0" version = "0.24.0"
dependencies = [ dependencies = [
"ansi_term 0.12.1", "ansi_term 0.12.1",
] ]
[[package]] [[package]]
name = "zellij-utils" name = "zellij-utils"
version = "0.23.0" version = "0.24.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-std", "async-std",

View file

@ -0,0 +1 @@
[?2004h[aram@green zellij]$ [aram@green zellij]$ 🏠🏠 abcdabceabcfabc abc[1@x

View file

@ -2249,14 +2249,17 @@ impl Row {
} }
} }
pub fn insert_character_at(&mut self, terminal_character: TerminalCharacter, x: usize) { pub fn insert_character_at(&mut self, terminal_character: TerminalCharacter, x: usize) {
match self.columns.len().cmp(&x) { let width_offset = self.excess_width_until(x);
let insert_position = x.saturating_sub(width_offset);
match self.columns.len().cmp(&insert_position) {
Ordering::Equal => self.columns.push_back(terminal_character), Ordering::Equal => self.columns.push_back(terminal_character),
Ordering::Less => { Ordering::Less => {
self.columns.resize(x, EMPTY_TERMINAL_CHARACTER); self.columns
.resize(insert_position, EMPTY_TERMINAL_CHARACTER);
self.columns.push_back(terminal_character); self.columns.push_back(terminal_character);
} }
Ordering::Greater => { Ordering::Greater => {
self.columns.insert(x, terminal_character); self.columns.insert(insert_position, terminal_character);
} }
} }
} }

View file

@ -420,6 +420,18 @@ fn wide_characters_line_wrap() {
assert_snapshot!(format!("{:?}", grid)); assert_snapshot!(format!("{:?}", grid));
} }
#[test]
fn insert_character_in_line_with_wide_character() {
let mut vte_parser = vte::Parser::new();
let mut grid = Grid::new(21, 104, Palette::default());
let fixture_name = "wide_characters_middle_line_insert";
let content = read_fixture(fixture_name);
for byte in content {
vte_parser.advance(&mut grid, byte);
}
assert_snapshot!(format!("{:?}", grid));
}
#[test] #[test]
fn fish_wide_characters_override_clock() { fn fish_wide_characters_override_clock() {
let mut vte_parser = vte::Parser::new(); let mut vte_parser = vte::Parser::new();

View file

@ -0,0 +1,7 @@
---
source: zellij-server/src/panes/./unit/grid_tests.rs
expression: "format!(\"{:?}\", grid)"
---
00 (C): [aram@green zellij]$ 🏠 xdef abc