diff --git a/assets/settings/default.json b/assets/settings/default.json index 9d834389d1..53948023ed 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -58,6 +58,8 @@ "hover_popover_enabled": true, // Whether to confirm before quitting Zed. "confirm_quit": false, + // Whether to restore last closed project when fresh Zed instance is opened. + "restore_on_startup": "last_workspace", // Whether the cursor blinks in the editor. "cursor_blink": true, // Whether to pop the completions menu while typing in an editor without diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 577346ea56..b72ca6af18 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -81,7 +81,9 @@ use ui::{ }; use util::ResultExt; use uuid::Uuid; -pub use workspace_settings::{AutosaveSetting, TabBarSettings, WorkspaceSettings}; +pub use workspace_settings::{ + AutosaveSetting, RestoreOnStartupBehaviour, TabBarSettings, WorkspaceSettings, +}; use crate::notifications::NotificationId; use crate::persistence::{ diff --git a/crates/workspace/src/workspace_settings.rs b/crates/workspace/src/workspace_settings.rs index f7317f639c..dbc9c52bcd 100644 --- a/crates/workspace/src/workspace_settings.rs +++ b/crates/workspace/src/workspace_settings.rs @@ -10,6 +10,17 @@ pub struct WorkspaceSettings { pub confirm_quit: bool, pub show_call_status_icon: bool, pub autosave: AutosaveSetting, + pub restore_on_startup: RestoreOnStartupBehaviour, +} + +#[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum RestoreOnStartupBehaviour { + /// Always start with an empty editor + None, + /// Restore the workspace that was closed last. + #[default] + LastWorkspace, } #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] @@ -32,6 +43,10 @@ pub struct WorkspaceSettingsContent { /// /// Default: off pub autosave: Option, + /// Controls previous session restoration in freshly launched Zed instance. + /// Values: none, last_workspace + /// Default: last_workspace + pub restore_on_startup: Option, } #[derive(Deserialize)] diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index e041e904ef..7a6f767d60 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -62,7 +62,7 @@ use util::{ }; use uuid::Uuid; use welcome::{show_welcome_view, BaseKeymap, FIRST_OPEN}; -use workspace::{AppState, WorkspaceStore}; +use workspace::{AppState, WorkspaceSettings, WorkspaceStore}; use zed::{ app_menus, build_window_options, ensure_only_instance, handle_cli_connection, handle_keymap_file_changes, initialize_workspace, open_paths_with_positions, IsOnlyInstance, @@ -504,7 +504,15 @@ async fn installation_id() -> Result<(String, bool)> { async fn restore_or_create_workspace(app_state: Arc, cx: AsyncAppContext) { maybe!(async { - if let Some(location) = workspace::last_opened_workspace_paths().await { + let restore_behaviour = + cx.update(|cx| WorkspaceSettings::get(None, cx).restore_on_startup)?; + let location = match restore_behaviour { + workspace::RestoreOnStartupBehaviour::LastWorkspace => { + workspace::last_opened_workspace_paths().await + } + _ => None, + }; + if let Some(location) = location { cx.update(|cx| { workspace::open_paths( location.paths().as_ref(),