diff --git a/helix-core/src/shellwords.rs b/helix-core/src/shellwords.rs index 9475f5e50cea..0883eb9172ae 100644 --- a/helix-core/src/shellwords.rs +++ b/helix-core/src/shellwords.rs @@ -129,8 +129,9 @@ impl<'a> From<&'a str> for Shellwords<'a> { DquoteEscaped => Dquoted, }; - if i >= input.len() - 1 && end == 0 { - end = i + 1; + let c_len = c.len_utf8(); + if i == input.len() - c_len && end == 0 { + end = i + c_len; } if end > 0 { @@ -333,4 +334,17 @@ mod test { assert_eq!(Shellwords::from(":o a").parts(), &[":o", "a"]); assert_eq!(Shellwords::from(":o a\\ ").parts(), &[":o", "a\\"]); } + + #[test] + fn test_multibyte_at_end() { + assert_eq!(Shellwords::from("π’€€").parts(), &["π’€€"]); + assert_eq!( + Shellwords::from(":sh echo π’€€").parts(), + &[":sh", "echo", "π’€€"] + ); + assert_eq!( + Shellwords::from(":sh echo π’€€ hello worldπ’€€").parts(), + &[":sh", "echo", "π’€€", "hello", "worldπ’€€"] + ); + } }