@@ -2184,7 +2184,10 @@ fn global_search(cx: &mut Context) {
2184 let searcher = SearcherBuilder::new()
2184 let searcher = SearcherBuilder::new()
2185 .binary_detection(BinaryDetection::quit(b'\x00'))
2185 .binary_detection(BinaryDetection::quit(b'\x00'))
2186 .build();
2186 .build();
2187− WalkBuilder::new(search_root)
2188+ let mut walk_builder = WalkBuilder::new(search_root);
2188 .hidden(file_picker_config.hidden)
2191 .hidden(file_picker_config.hidden)
2189 .parents(file_picker_config.parents)
2192 .parents(file_picker_config.parents)
2190 .ignore(file_picker_config.ignore)
2193 .ignore(file_picker_config.ignore)
@@ -2195,73 +2198,77 @@ fn global_search(cx: &mut Context) {
2195 .max_depth(file_picker_config.max_depth)
2198 .max_depth(file_picker_config.max_depth)
2196 .filter_entry(move |entry| {
2199 .filter_entry(move |entry| {
2197 filter_picker_entry(entry, &absolute_root, dedup_symlinks)
2200 filter_picker_entry(entry, &absolute_root, dedup_symlinks)
2201− let mut searcher = searcher.clone();
2202− let matcher = matcher.clone();
2203− let injector = injector_.clone();
2204− let documents = &documents;
2205− Box::new(move |entry: Result<DirEntry, ignore::Error>| -> WalkState {
2206− let entry = match entry {
2207− Ok(entry) => entry,
2208− Err(_) => return WalkState::Continue,
2211− match entry.file_type() {
2212− Some(entry) if entry.is_file() => {}
2213− // skip everything else
2214− _ => return WalkState::Continue,
2217− let mut stop = false;
2218− let sink = sinks::UTF8(|line_num, _| {
2220− .push(FileResult::new(entry.path(), line_num as usize - 1))
2225− let doc = documents.iter().find(|&(doc_path, _)| {
2228− .map_or(false, |doc_path| doc_path == entry.path())
2231− let result = if let Some((_, doc)) = doc {
2232− // there is already a buffer for this file
2233− // search the buffer instead of the file because it's faster
2234− // and captures new edits without requiring a save
2235− if searcher.multi_line_with_matcher(&matcher) {
2236− // in this case a continous buffer is required
2237− // convert the rope to a string
2238− let text = doc.to_string();
2239− searcher.search_slice(&matcher, text.as_bytes(), sink)
2241− searcher.search_reader(
2243− RopeReader::new(doc.slice(..)),
2248− searcher.search_path(&matcher, entry.path(), sink)
2251− if let Err(err) = result {
2203+ walk_builder
2252− log::error!(
2204+ .add_custom_ignore_filename(helix_loader::config_dir().join("ignore"));
2253− "Global search error: {}, {}",
2205+ walk_builder.add_custom_ignore_filename(".helix/ignore");
2254− entry.path().display(),
2206+
2255− err
2207+ walk_builder.build_parallel().run(|| {
2256− );
2208+ let mut searcher = searcher.clone();
2257− }
2209+ let matcher = matcher.clone();
2258− if stop {
2210+ let injector = injector_.clone();
2259− WalkState::Quit
2211+ let documents = &documents;
2212+ Box::new(move |entry: Result<DirEntry, ignore::Error>| -> WalkState {
2213+ let entry = match entry {
2214+ Ok(entry) => entry,
2215+ Err(_) => return WalkState::Continue,
2218+ match entry.file_type() {
2219+ Some(entry) if entry.is_file() => {}
2220+ // skip everything else
2221+ _ => return WalkState::Continue,
2224+ let mut stop = false;
2225+ let sink = sinks::UTF8(|line_num, _| {
2227+ .push(FileResult::new(entry.path(), line_num as usize - 1))
2232+ let doc = documents.iter().find(|&(doc_path, _)| {
2235+ .map_or(false, |doc_path| doc_path == entry.path())
2238+ let result = if let Some((_, doc)) = doc {
2239+ // there is already a buffer for this file
2240+ // search the buffer instead of the file because it's faster
2241+ // and captures new edits without requiring a save
2242+ if searcher.multi_line_with_matcher(&matcher) {
2243+ // in this case a continous buffer is required
2244+ // convert the rope to a string
2245+ let text = doc.to_string();
2246+ searcher.search_slice(&matcher, text.as_bytes(), sink)
2260 } else {
2247 } else {
2261− WalkState::Continue
2248+ searcher.search_reader(
2250+ RopeReader::new(doc.slice(..)),
2255+ searcher.search_path(&matcher, entry.path(), sink)
2258+ if let Err(err) = result {
2260+ "Global search error: {}, {}",
2261+ entry.path().display(),
2268+ WalkState::Continue
2267 cx.jobs.callback(async move {
2274 cx.jobs.callback(async move {