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]]
name = "zellij"
version = "0.23.0"
version = "0.24.0"
dependencies = [
"anyhow",
"dialoguer",
@ -2896,7 +2896,7 @@ dependencies = [
[[package]]
name = "zellij-client"
version = "0.23.0"
version = "0.24.0"
dependencies = [
"insta",
"log",
@ -2909,7 +2909,7 @@ dependencies = [
[[package]]
name = "zellij-server"
version = "0.23.0"
version = "0.24.0"
dependencies = [
"ansi_term 0.12.1",
"async-trait",
@ -2935,7 +2935,7 @@ dependencies = [
[[package]]
name = "zellij-tile"
version = "0.23.0"
version = "0.24.0"
dependencies = [
"serde",
"serde_json",
@ -2945,14 +2945,14 @@ dependencies = [
[[package]]
name = "zellij-tile-utils"
version = "0.23.0"
version = "0.24.0"
dependencies = [
"ansi_term 0.12.1",
]
[[package]]
name = "zellij-utils"
version = "0.23.0"
version = "0.24.0"
dependencies = [
"anyhow",
"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) {
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::Less => {
self.columns.resize(x, EMPTY_TERMINAL_CHARACTER);
self.columns
.resize(insert_position, EMPTY_TERMINAL_CHARACTER);
self.columns.push_back(terminal_character);
}
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));
}
#[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]
fn fish_wide_characters_override_clock() {
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