diff --git a/src/editor/core/line.rs b/src/editor/core/line.rs index 78b3296..3c5328c 100644 --- a/src/editor/core/line.rs +++ b/src/editor/core/line.rs @@ -72,6 +72,23 @@ impl EditorLine { return Ok(()); } + pub fn find_all(&self, pat: &str) -> Option> { + let mut text = self.content(); + let mut pos_offset = 0; + let mut result_vec = vec![]; + while let Some(pos) = text.find(pat) { + result_vec.push(pos + pos_offset); + pos_offset += pos + pat.len(); + text = &text[(pos + pat.len())..]; + } + + if result_vec.is_empty() { + return None; + } else { + return Some(result_vec); + } + } + #[inline] fn update_label_width(&mut self, new_width: usize) { self.text_area.margin_left = new_width; @@ -102,3 +119,11 @@ impl EditorLine { self.text_area.len() } } + +#[test] +fn editorline_find_all_test() { + let mut line = EditorLine::new(0); + line.push_str("abc abc abc"); + + assert_eq!(line.find_all("abc"), Some(vec![0, 5, 10])); +} diff --git a/src/editor/core/mod.rs b/src/editor/core/mod.rs index 77474fc..107b159 100644 --- a/src/editor/core/mod.rs +++ b/src/editor/core/mod.rs @@ -608,18 +608,18 @@ impl Editor { } fn search(&self, target: &str) -> Option> { - let result_pos_list: Vec = self - .lines - .iter() - .enumerate() - .filter_map(|(i, l)| match l.content().find(target) { - Some(pos) => Some(EditorCursorPos { - row: i + 1, - col: pos + 1, - }), - None => None, - }) - .collect(); + let mut result_pos_list = Vec::::new(); + for (index, line) in self.lines.iter().enumerate() { + match line.find_all(target) { + Some(pos_list) => for pos in pos_list { + result_pos_list.push(EditorCursorPos { + row: index + 1, + col: pos + 1, + }) + } + None => {} + } + } if !result_pos_list.is_empty() { return Some(result_pos_list);