From 0e1223eb91d8ca6ed0dd118d2c6b002dcd1d8687 Mon Sep 17 00:00:00 2001
From: gwenn <gtreguier@gmail.com>
Date: Mon, 27 Feb 2017 18:50:03 +0100
Subject: [PATCH] Fix repeated char search

---
 src/line_buffer.rs | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/line_buffer.rs b/src/line_buffer.rs
index bfd78b65..5016e9c1 100644
--- a/src/line_buffer.rs
+++ b/src/line_buffer.rs
@@ -419,7 +419,8 @@ impl LineBuffer {
                     .char_indices()
                     .rev()
                     .filter(|&(_, ch)| ch == c)
-                    .nth(n - 1)
+                    .take(n)
+                    .last()
                     .map(|(i, _)| i)
             }
             CharSearch::Forward(c) |
@@ -430,7 +431,8 @@ impl LineBuffer {
                         self.buf[shift..]
                             .char_indices()
                             .filter(|&(_, ch)| ch == c)
-                            .nth(n - 1)
+                            .take(n)
+                            .last()
                             .map(|(i, _)| i)
                     } else {
                         None
@@ -500,8 +502,12 @@ impl LineBuffer {
         if self.pos == self.buf.len() {
             return None;
         }
-        self.buf[self.pos..].grapheme_indices(true).filter(|&(_, ch)| ch.is_alphanumeric())
-                    .map(|(i, _)| i).next().map(|i| i + self.pos)
+        self.buf[self.pos..]
+            .grapheme_indices(true)
+            .filter(|&(_, ch)| ch.is_alphanumeric())
+            .map(|(i, _)| i)
+            .next()
+            .map(|i| i + self.pos)
     }
     /// Alter the next word.
     pub fn edit_word(&mut self, a: WordAction) -> bool {
@@ -916,6 +922,11 @@ mod test {
         let ok = s.move_to(CharSearch::Forward('ε'), 1);
         assert_eq!(true, ok);
         assert_eq!(8, s.pos);
+
+        let mut s = LineBuffer::init("αßγδε", 2);
+        let ok = s.move_to(CharSearch::Forward('ε'), 10);
+        assert_eq!(true, ok);
+        assert_eq!(8, s.pos);
     }
 
     #[test]
-- 
GitLab