diff options
Diffstat (limited to 'src/commands/search_glob.rs')
-rw-r--r-- | src/commands/search_glob.rs | 56 |
1 files changed, 18 insertions, 38 deletions
diff --git a/src/commands/search_glob.rs b/src/commands/search_glob.rs index 30962c1..c833b8e 100644 --- a/src/commands/search_glob.rs +++ b/src/commands/search_glob.rs @@ -1,49 +1,29 @@ -use globset::{GlobBuilder, GlobMatcher}; - -use crate::context::AppContext; +use crate::context::{AppContext, MatchContext}; use crate::error::JoshutoResult; -use crate::tab::JoshutoTab; -use crate::util::search::SearchPattern; use super::cursor_move; +use super::search; -pub fn search_glob_fwd(curr_tab: &JoshutoTab, glob: &GlobMatcher) -> Option<usize> { - let curr_list = curr_tab.curr_list_ref()?; +pub fn search_glob(context: &mut AppContext, pattern: &str) -> JoshutoResult { + let case_sensitivity = context + .config_ref() + .search_options_ref() + .glob_case_sensitivity; - let offset = curr_list.get_index()? + 1; - let contents_len = curr_list.len(); - for i in 0..contents_len { - let file_name = curr_list.contents[(offset + i) % contents_len].file_name(); - if glob.is_match(file_name) { - return Some((offset + i) % contents_len); - } - } - None -} -pub fn search_glob_rev(curr_tab: &JoshutoTab, glob: &GlobMatcher) -> Option<usize> { - let curr_list = curr_tab.curr_list_ref()?; + let search_context = MatchContext::new_glob(pattern, case_sensitivity)?; - let offset = curr_list.get_index()?; - let contents_len = curr_list.len(); - for i in (0..contents_len).rev() { - let file_name = curr_list.contents[(offset + i) % contents_len].file_name(); - if glob.is_match(file_name) { - return Some((offset + i) % contents_len); - } - } - None -} + let curr_tab = &context.tab_context_ref().curr_tab_ref(); + let index = curr_tab.curr_list_ref().and_then(|c| c.get_index()); -pub fn search_glob(context: &mut AppContext, pattern: &str) -> JoshutoResult { - let glob = GlobBuilder::new(pattern) - .case_insensitive(true) - .build()? - .compile_matcher(); + let offset = match index { + Some(index) => index + 1, + None => return Ok(()), + }; - let index = search_glob_fwd(context.tab_context_ref().curr_tab_ref(), &glob); - if let Some(index) = index { - cursor_move::cursor_move(context, index); + if let Some(new_index) = search::search_next_impl(curr_tab, &search_context, offset) { + cursor_move::cursor_move(context, new_index); } - context.set_search_context(SearchPattern::Glob(glob)); + + context.set_search_context(search_context); Ok(()) } |