diff --git a/src/frontend/gui/search.rs b/src/frontend/gui/search.rs index e0f2a2267..8e7114e7a 100644 --- a/src/frontend/gui/search.rs +++ b/src/frontend/gui/search.rs @@ -155,8 +155,9 @@ impl Tab for SearchOverlay { // CTRL-r cycles through pattern match types let mut r = self.renderer.borrow_mut(); let pattern = match &r.pattern { - Pattern::CaseInSensitiveString(s) => Pattern::CaseSensitiveString(s.clone()), Pattern::CaseSensitiveString(s) => Pattern::CaseInSensitiveString(s.clone()), + Pattern::CaseInSensitiveString(s) => Pattern::Regex(s.clone()), + Pattern::Regex(s) => Pattern::CaseSensitiveString(s.clone()), }; r.pattern = pattern; r.update_search(); @@ -352,6 +353,7 @@ impl Renderable for SearchRenderable { let mode = &match self.pattern { Pattern::CaseSensitiveString(_) => "case-sensitive", Pattern::CaseInSensitiveString(_) => "ignore-case", + Pattern::Regex(_) => "regex", }; line.overlay_text_with_attribute( 0, diff --git a/src/localtab.rs b/src/localtab.rs index deeffc9be..76e391224 100644 --- a/src/localtab.rs +++ b/src/localtab.rs @@ -156,11 +156,21 @@ impl Tab for LocalTab { end_y, }); } - } /* - Pattern::Regex(r) => { - // TODO - } - */ + } + Pattern::Regex(r) => { + if let Ok(re) = regex::Regex::new(r) { + for m in re.find_iter(haystack) { + let (start_x, start_y) = haystack_idx_to_coord(m.start(), coords); + let (end_x, end_y) = haystack_idx_to_coord(m.end(), coords); + results.push(SearchResult { + start_x, + start_y, + end_x, + end_y, + }); + } + } + } } } @@ -186,9 +196,13 @@ impl Tab for LocalTab { } if !wrapped { - collect_matches(&mut results, &pattern, &haystack, &coords); - haystack.clear(); - coords.clear(); + if let Pattern::Regex(_) = &pattern { + haystack.push('\n'); + } else { + collect_matches(&mut results, &pattern, &haystack, &coords); + haystack.clear(); + coords.clear(); + } } } diff --git a/src/mux/tab.rs b/src/mux/tab.rs index 862bea1b0..986dbeb91 100644 --- a/src/mux/tab.rs +++ b/src/mux/tab.rs @@ -49,7 +49,7 @@ fn schedule_next_paste(paste: &Arc>) { pub enum Pattern { CaseSensitiveString(String), CaseInSensitiveString(String), - // Regex(regex::Regex), + Regex(String), } impl std::ops::Deref for Pattern { @@ -58,6 +58,7 @@ impl std::ops::Deref for Pattern { match self { Pattern::CaseSensitiveString(s) => s, Pattern::CaseInSensitiveString(s) => s, + Pattern::Regex(s) => s, } } } @@ -67,6 +68,7 @@ impl std::ops::DerefMut for Pattern { match self { Pattern::CaseSensitiveString(s) => s, Pattern::CaseInSensitiveString(s) => s, + Pattern::Regex(s) => s, } } }