From 173074f2485232b94ab178000ec9656ceefbb3aa Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Tue, 16 Sep 2025 14:12:45 +0200 Subject: [PATCH] search: Re-issue project search if search query is stale on replacement (#38251) Closes https://github.com/zed-industries/zed/issues/34897 Release Notes: - Fixed project search replacement replacing stale search results --- crates/project/src/search.rs | 1 - crates/search/src/project_search.rs | 22 ++++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/crates/project/src/search.rs b/crates/project/src/search.rs index f2c6091e0cb00b8da1a752e3d25afe3389e8c818..953fa4f1aafdca87ccd1e8dbcfec145505660642 100644 --- a/crates/project/src/search.rs +++ b/crates/project/src/search.rs @@ -64,7 +64,6 @@ pub enum SearchQuery { include_ignored: bool, inner: SearchInputs, }, - Regex { regex: Regex, replacement: Option, diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index 3d9248e3c7e64893cc6a72d0e034d7a7597edf29..eaad5dad65b75c1fffcabb400eb6a2dea1fb1811 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -679,7 +679,18 @@ impl ProjectSearchView { self.included_opened_only = !self.included_opened_only; } + pub fn replacement(&self, cx: &App) -> String { + self.replacement_editor.read(cx).text(cx) + } + fn replace_next(&mut self, _: &ReplaceNext, window: &mut Window, cx: &mut Context) { + if let Some(last_search_query_text) = &self.entity.read(cx).last_search_query_text + && self.query_editor.read(cx).text(cx) != *last_search_query_text + { + // search query has changed, restart search and bail + self.search(cx); + return; + } if self.entity.read(cx).match_ranges.is_empty() { return; } @@ -699,14 +710,17 @@ impl ProjectSearchView { self.select_match(Direction::Next, window, cx) } } - pub fn replacement(&self, cx: &App) -> String { - self.replacement_editor.read(cx).text(cx) - } fn replace_all(&mut self, _: &ReplaceAll, window: &mut Window, cx: &mut Context) { + if let Some(last_search_query_text) = &self.entity.read(cx).last_search_query_text + && self.query_editor.read(cx).text(cx) != *last_search_query_text + { + // search query has changed, restart search and bail + self.search(cx); + return; + } if self.active_match_index.is_none() { return; } - let Some(query) = self.entity.read(cx).active_query.as_ref() else { return; };