diff --git a/src/buffer/mod.rs b/src/buffer/mod.rs index 72d2979..64df487 100644 --- a/src/buffer/mod.rs +++ b/src/buffer/mod.rs @@ -69,6 +69,10 @@ impl Buffer { self.text.len_chars() } + pub fn is_grapheme(&self, char_idx: usize) -> bool { + self.text.is_grapheme_boundary(char_idx) + } + pub fn nth_next_grapheme(&self, char_idx: usize, n: usize) -> usize { let mut char_idx = char_idx; for _ in 0..n { @@ -389,7 +393,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 9); + assert!(buf.char_count() == 9); assert!(buf.line_count() == 1); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -411,7 +415,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 11); + assert!(buf.char_count() == 12); assert!(buf.line_count() == 3); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -436,26 +440,26 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 17); - assert!(buf.line_count() == 3); - assert!(Some("A") == iter.next()); - assert!(Some("g") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("n") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("H") == iter.next()); - assert!(Some("e") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("世") == iter.next()); - assert!(Some("界") == iter.next()); - assert!(Some("\r\n") == iter.next()); - assert!(Some("!") == iter.next()); - assert!(None == iter.next()); + assert_eq!(buf.char_count(), 18); + assert_eq!(buf.line_count(), 3); + assert_eq!(Some("A"), iter.next()); + assert_eq!(Some("g"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("i"), iter.next()); + assert_eq!(Some("n"), iter.next()); + assert_eq!(Some(" "), iter.next()); + assert_eq!(Some("H"), iter.next()); + assert_eq!(Some("e"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("o"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some(" "), iter.next()); + assert_eq!(Some("世"), iter.next()); + assert_eq!(Some("界"), iter.next()); + assert_eq!(Some("\r\n"), iter.next()); + assert_eq!(Some("!"), iter.next()); + assert_eq!(None, iter.next()); } #[test] @@ -467,26 +471,26 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 17); - assert!(buf.line_count() == 3); - assert!(Some("H") == iter.next()); - assert!(Some("e") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("g") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("n") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("世") == iter.next()); - assert!(Some("界") == iter.next()); - assert!(Some("\r\n") == iter.next()); - assert!(Some("!") == iter.next()); - assert!(None == iter.next()); + assert_eq!(buf.char_count(), 18); + assert_eq!(buf.line_count(), 3); + assert_eq!(Some("H"), iter.next()); + assert_eq!(Some("e"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("o"), iter.next()); + assert_eq!(Some(" "), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("g"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("i"), iter.next()); + assert_eq!(Some("n"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some(" "), iter.next()); + assert_eq!(Some("世"), iter.next()); + assert_eq!(Some("界"), iter.next()); + assert_eq!(Some("\r\n"), iter.next()); + assert_eq!(Some("!"), iter.next()); + assert_eq!(None, iter.next()); } #[test] @@ -498,25 +502,25 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 16); - assert!(buf.line_count() == 3); - assert!(Some("H") == iter.next()); - assert!(Some("e") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("g") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("n") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("世") == iter.next()); - assert!(Some("界") == iter.next()); - assert!(Some("\r\n") == iter.next()); - assert!(Some("!") == iter.next()); - assert!(None == iter.next()); + assert_eq!(buf.char_count(), 17); + assert_eq!(buf.line_count(), 3); + assert_eq!(Some("H"), iter.next()); + assert_eq!(Some("e"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("o"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("g"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("i"), iter.next()); + assert_eq!(Some("n"), iter.next()); + assert_eq!(Some(" "), iter.next()); + assert_eq!(Some("世"), iter.next()); + assert_eq!(Some("界"), iter.next()); + assert_eq!(Some("\r\n"), iter.next()); + assert_eq!(Some("!"), iter.next()); + assert_eq!(None, iter.next()); } #[test] @@ -524,29 +528,29 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hello\n 世界\r\n!", 0); - buf.insert_text("again", 11); + buf.insert_text("again", 12); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 16); - assert!(buf.line_count() == 3); - assert!(Some("H") == iter.next()); - assert!(Some("e") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("世") == iter.next()); - assert!(Some("界") == iter.next()); - assert!(Some("\r\n") == iter.next()); - assert!(Some("!") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("g") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("n") == iter.next()); - assert!(None == iter.next()); + assert_eq!(buf.char_count(), 17); + assert_eq!(buf.line_count(), 3); + assert_eq!(Some("H"), iter.next()); + assert_eq!(Some("e"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("o"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some(" "), iter.next()); + assert_eq!(Some("世"), iter.next()); + assert_eq!(Some("界"), iter.next()); + assert_eq!(Some("\r\n"), iter.next()); + assert_eq!(Some("!"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("g"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("i"), iter.next()); + assert_eq!(Some("n"), iter.next()); + assert_eq!(None, iter.next()); } #[test] @@ -558,26 +562,26 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 16); - assert!(buf.line_count() == 3); - assert!(Some("H") == iter.next()); - assert!(Some("e") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("g") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("n") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("世") == iter.next()); - assert!(Some("界") == iter.next()); - assert!(Some("\r\n") == iter.next()); - assert!(Some("!") == iter.next()); + assert_eq!(buf.char_count(), 17); + assert_eq!(buf.line_count(), 3); + assert_eq!(Some("H"), iter.next()); + assert_eq!(Some("e"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("g"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("i"), iter.next()); + assert_eq!(Some("n"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("o"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some(" "), iter.next()); + assert_eq!(Some("世"), iter.next()); + assert_eq!(Some("界"), iter.next()); + assert_eq!(Some("\r\n"), iter.next()); + assert_eq!(Some("!"), iter.next()); - assert!(None == iter.next()); + assert_eq!(None, iter.next()); } #[test] @@ -589,26 +593,26 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 16); - assert!(buf.line_count() == 3); - assert!(Some("H") == iter.next()); - assert!(Some("e") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("世") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("g") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("n") == iter.next()); - assert!(Some("界") == iter.next()); - assert!(Some("\r\n") == iter.next()); - assert!(Some("!") == iter.next()); + assert_eq!(buf.char_count(), 17); + assert_eq!(buf.line_count(), 3); + assert_eq!(Some("H"), iter.next()); + assert_eq!(Some("e"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("o"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some(" "), iter.next()); + assert_eq!(Some("世"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("g"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("i"), iter.next()); + assert_eq!(Some("n"), iter.next()); + assert_eq!(Some("界"), iter.next()); + assert_eq!(Some("\r\n"), iter.next()); + assert_eq!(Some("!"), iter.next()); - assert!(None == iter.next()); + assert_eq!(None, iter.next()); } #[test] @@ -620,30 +624,30 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 20); - assert!(buf.line_count() == 7); - assert!(Some("H") == iter.next()); - assert!(Some("e") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("g") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some("a") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("n") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("l") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("世") == iter.next()); - assert!(Some("界") == iter.next()); - assert!(Some("\r\n") == iter.next()); - assert!(Some("!") == iter.next()); + assert_eq!(buf.char_count(), 21); + assert_eq!(buf.line_count(), 7); + assert_eq!(Some("H"), iter.next()); + assert_eq!(Some("e"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("g"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some("a"), iter.next()); + assert_eq!(Some("i"), iter.next()); + assert_eq!(Some("n"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("l"), iter.next()); + assert_eq!(Some("o"), iter.next()); + assert_eq!(Some("\n"), iter.next()); + assert_eq!(Some(" "), iter.next()); + assert_eq!(Some("世"), iter.next()); + assert_eq!(Some("界"), iter.next()); + assert_eq!(Some("\r\n"), iter.next()); + assert_eq!(Some("!"), iter.next()); - assert!(None == iter.next()); + assert_eq!(None, iter.next()); } #[test] @@ -651,14 +655,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); buf.text.remove(0, 3); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 26); + assert!(buf.char_count() == 26); assert!(buf.line_count() == 5); assert!(Some("t") == iter.next()); assert!(Some("h") == iter.next()); @@ -694,14 +698,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); buf.text.remove(0, 12); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 17); + assert!(buf.char_count() == 17); assert!(buf.line_count() == 4); assert!(Some("p") == iter.next()); assert!(Some("l") == iter.next()); @@ -728,14 +732,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); buf.text.remove(5, 17); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 17); + assert!(buf.char_count() == 17); assert!(buf.line_count() == 4); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -762,14 +766,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); buf.text.remove(23, 29); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 23); + assert!(buf.char_count() == 23); assert!(buf.line_count() == 6); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -802,14 +806,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); buf.text.remove(17, 29); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 17); + assert!(buf.char_count() == 17); assert!(buf.line_count() == 4); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -836,14 +840,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hello\nworld!", 0); - assert!(buf.grapheme_count() == 12); + assert!(buf.char_count() == 12); assert!(buf.line_count() == 2); buf.text.remove(3, 12); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 3); + assert!(buf.char_count() == 3); assert!(buf.line_count() == 1); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -856,14 +860,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\nworld!", 0); - assert!(buf.grapheme_count() == 15); + assert!(buf.char_count() == 15); assert!(buf.line_count() == 3); buf.text.remove(5, 15); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 5); + assert!(buf.char_count() == 5); assert!(buf.line_count() == 2); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -878,14 +882,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hello\nworld!", 0); - assert!(buf.grapheme_count() == 12); + assert!(buf.char_count() == 12); assert!(buf.line_count() == 2); buf.text.remove(3, 11); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 4); + assert!(buf.char_count() == 4); assert!(buf.line_count() == 1); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -899,14 +903,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hello\nworld!", 0); - assert!(buf.grapheme_count() == 12); + assert!(buf.char_count() == 12); assert!(buf.line_count() == 2); buf.text.remove(8, 12); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 8); + assert!(buf.char_count() == 8); assert!(buf.line_count() == 2); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -924,14 +928,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("12\n34\n56\n78", 0); - assert!(buf.grapheme_count() == 11); + assert!(buf.char_count() == 11); assert!(buf.line_count() == 4); buf.text.remove(4, 11); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 4); + assert!(buf.char_count() == 4); assert!(buf.line_count() == 2); assert!(Some("1") == iter.next()); assert!(Some("2") == iter.next()); @@ -945,14 +949,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("1234567890", 0); - assert!(buf.grapheme_count() == 10); + assert!(buf.char_count() == 10); assert!(buf.line_count() == 1); buf.text.remove(9, 10); let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 9); + assert!(buf.char_count() == 9); assert!(buf.line_count() == 1); assert!(Some("1") == iter.next()); assert!(Some("2") == iter.next()); @@ -976,7 +980,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); assert!(Some("t") == iter.next()); assert!(Some("h") == iter.next()); @@ -1020,7 +1024,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -1064,7 +1068,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -1108,7 +1112,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -1152,7 +1156,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.grapheme_count() == 29); + assert!(buf.char_count() == 29); assert!(buf.line_count() == 6); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -1191,14 +1195,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert_eq!(buf.grapheme_count(), 29); + assert_eq!(buf.char_count(), 29); assert_eq!(buf.line_count(), 6); buf.remove_lines(0, 3); let mut iter = buf.grapheme_iter(); - assert_eq!(buf.grapheme_count(), 13); + assert_eq!(buf.char_count(), 13); assert_eq!(buf.line_count(), 3); assert_eq!(Some("o"), iter.next()); assert_eq!(Some("f"), iter.next()); @@ -1221,14 +1225,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert_eq!(buf.grapheme_count(), 29); + assert_eq!(buf.char_count(), 29); assert_eq!(buf.line_count(), 6); buf.remove_lines(1, 4); let mut iter = buf.grapheme_iter(); - assert_eq!(buf.grapheme_count(), 13); + assert_eq!(buf.char_count(), 13); assert_eq!(buf.line_count(), 3); assert_eq!(Some("H"), iter.next()); assert_eq!(Some("i"), iter.next()); @@ -1251,7 +1255,7 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert_eq!(buf.grapheme_count(), 29); + assert_eq!(buf.char_count(), 29); assert_eq!(buf.line_count(), 6); // "Hi\nthere\npeople\nof\nthe\nworld!" @@ -1260,7 +1264,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert_eq!(buf.grapheme_count(), 15); + assert_eq!(buf.char_count(), 15); assert_eq!(buf.line_count(), 3); assert_eq!(Some("H"), iter.next()); assert_eq!(Some("i"), iter.next()); @@ -1285,14 +1289,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\n", 0); - assert_eq!(buf.grapheme_count(), 23); + assert_eq!(buf.char_count(), 23); assert_eq!(buf.line_count(), 6); buf.remove_lines(3, 6); let mut iter = buf.grapheme_iter(); - assert_eq!(buf.grapheme_count(), 15); + assert_eq!(buf.char_count(), 15); assert_eq!(buf.line_count(), 3); assert_eq!(Some("H"), iter.next()); assert_eq!(Some("i"), iter.next()); @@ -1317,14 +1321,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert_eq!(buf.grapheme_count(), 29); + assert_eq!(buf.char_count(), 29); assert_eq!(buf.line_count(), 6); buf.remove_lines(0, 6); let mut iter = buf.grapheme_iter(); - assert_eq!(buf.grapheme_count(), 0); + assert_eq!(buf.char_count(), 0); assert_eq!(buf.line_count(), 1); assert_eq!(None, iter.next()); } @@ -1334,14 +1338,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\n", 0); - assert_eq!(buf.grapheme_count(), 23); + assert_eq!(buf.char_count(), 23); assert_eq!(buf.line_count(), 6); buf.remove_lines(0, 6); let mut iter = buf.grapheme_iter(); - assert_eq!(buf.grapheme_count(), 0); + assert_eq!(buf.char_count(), 0); assert_eq!(buf.line_count(), 1); assert_eq!(None, iter.next()); } diff --git a/src/editor/mod.rs b/src/editor/mod.rs index 12f8dfd..100f25d 100644 --- a/src/editor/mod.rs +++ b/src/editor/mod.rs @@ -589,6 +589,10 @@ impl Editor { ); } + if !self.buffer.is_grapheme(temp_index) { + temp_index = self.buffer.nth_prev_grapheme(temp_index, 1); + } + c.range.0 = temp_index; c.range.1 = temp_index; } @@ -618,6 +622,10 @@ impl Editor { ); } + if !self.buffer.is_grapheme(temp_index) { + temp_index = self.buffer.nth_prev_grapheme(temp_index, 1); + } + c.range.0 = temp_index; c.range.1 = temp_index; } diff --git a/src/term_ui/formatter.rs b/src/term_ui/formatter.rs index cc4272e..5dd7895 100644 --- a/src/term_ui/formatter.rs +++ b/src/term_ui/formatter.rs @@ -81,7 +81,7 @@ impl LineFormatter for ConsoleLineFormatter { return dim; } - fn index_to_v2d<'a, T>(&'a self, g_iter: T, index: usize) -> (usize, usize) + fn index_to_v2d<'a, T>(&'a self, g_iter: T, char_idx: usize) -> (usize, usize) where T: Iterator, { @@ -89,12 +89,12 @@ impl LineFormatter for ConsoleLineFormatter { let mut i = 0; let mut last_width = 0; - for (_, _pos, width) in self.iter(g_iter) { + for (g, _pos, width) in self.iter(g_iter) { pos = _pos; last_width = width; - i += 1; + i += g.chars().count(); - if i > index { + if i > char_idx { return pos; } } @@ -112,17 +112,19 @@ impl LineFormatter for ConsoleLineFormatter { T: Iterator, { // TODO: handle rounding modes + let mut prev_i = 0; let mut i = 0; - for (_, pos, _) in self.iter(g_iter) { + for (g, pos, _) in self.iter(g_iter) { if pos.0 > v2d.0 { - i -= 1; + i = prev_i; break; } else if pos.0 == v2d.0 && pos.1 >= v2d.1 { break; } - i += 1; + prev_i = i; + i += g.chars().count(); } return i;