project search: Persist search history across session (#9932)
Partially implements #9717, persistence between restarts is currently missing, but I would like to get feedback on the implementation first. Previously the search history was not saved across different project searches. As the `SearchHistory` is now maintained inside of the project, it can be persisted across different project searches. I also removed the behavior that a new query replaces the previous search query, if it contains the text of the previous query. I believe this was only intended to make buffer search work, therefore I disabled this behavior but only for the project search. Currently when you navigated through the queries the tab title changed even if the search was not started, which doesn't make sense to me. Current behavior: https://github.com/zed-industries/zed/assets/53836821/1c365702-e93c-4cab-a1eb-0af3fef95476 With this PR the tab header will actually keep the search name until you start another search again. --- Showcase: https://github.com/zed-industries/zed/assets/53836821/c0d6e496-915f-44bc-be16-12d7c3cda2d7 Release Notes: - Added support for persisting project search history across a session - Fixed tab header of project search changing when cycling through search history, even when there is no search submitted
This commit is contained in:
parent
c15b9d4e1c
commit
1dbd520cc9
8 changed files with 566 additions and 216 deletions
|
@ -9,6 +9,7 @@ pub mod terminals;
|
|||
|
||||
#[cfg(test)]
|
||||
mod project_tests;
|
||||
pub mod search_history;
|
||||
|
||||
use anyhow::{anyhow, bail, Context as _, Result};
|
||||
use async_trait::async_trait;
|
||||
|
@ -63,6 +64,7 @@ use postage::watch;
|
|||
use prettier_support::{DefaultPrettier, PrettierInstance};
|
||||
use project_settings::{LspSettings, ProjectSettings};
|
||||
use rand::prelude::*;
|
||||
use search_history::SearchHistory;
|
||||
use worktree::LocalSnapshot;
|
||||
|
||||
use rpc::{ErrorCode, ErrorExt as _};
|
||||
|
@ -123,6 +125,8 @@ const SERVER_REINSTALL_DEBOUNCE_TIMEOUT: Duration = Duration::from_secs(1);
|
|||
const SERVER_LAUNCHING_BEFORE_SHUTDOWN_TIMEOUT: Duration = Duration::from_secs(5);
|
||||
pub const SERVER_PROGRESS_DEBOUNCE_TIMEOUT: Duration = Duration::from_millis(100);
|
||||
|
||||
const MAX_PROJECT_SEARCH_HISTORY_SIZE: usize = 500;
|
||||
|
||||
pub trait Item {
|
||||
fn try_open(
|
||||
project: &Model<Project>,
|
||||
|
@ -205,6 +209,7 @@ pub struct Project {
|
|||
prettier_instances: HashMap<PathBuf, PrettierInstance>,
|
||||
tasks: Model<Inventory>,
|
||||
hosted_project_id: Option<ProjectId>,
|
||||
search_history: SearchHistory,
|
||||
}
|
||||
|
||||
pub enum LanguageServerToQuery {
|
||||
|
@ -670,6 +675,7 @@ impl Project {
|
|||
prettier_instances: HashMap::default(),
|
||||
tasks,
|
||||
hosted_project_id: None,
|
||||
search_history: Self::new_search_history(),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -805,6 +811,7 @@ impl Project {
|
|||
prettier_instances: HashMap::default(),
|
||||
tasks,
|
||||
hosted_project_id: None,
|
||||
search_history: Self::new_search_history(),
|
||||
};
|
||||
this.set_role(role, cx);
|
||||
for worktree in worktrees {
|
||||
|
@ -861,6 +868,13 @@ impl Project {
|
|||
.await
|
||||
}
|
||||
|
||||
fn new_search_history() -> SearchHistory {
|
||||
SearchHistory::new(
|
||||
Some(MAX_PROJECT_SEARCH_HISTORY_SIZE),
|
||||
search_history::QueryInsertionBehavior::AlwaysInsert,
|
||||
)
|
||||
}
|
||||
|
||||
fn release(&mut self, cx: &mut AppContext) {
|
||||
match &self.client_state {
|
||||
ProjectClientState::Local => {}
|
||||
|
@ -1127,6 +1141,14 @@ impl Project {
|
|||
&self.tasks
|
||||
}
|
||||
|
||||
pub fn search_history(&self) -> &SearchHistory {
|
||||
&self.search_history
|
||||
}
|
||||
|
||||
pub fn search_history_mut(&mut self) -> &mut SearchHistory {
|
||||
&mut self.search_history
|
||||
}
|
||||
|
||||
pub fn collaborators(&self) -> &HashMap<proto::PeerId, Collaborator> {
|
||||
&self.collaborators
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue