Introduce a new, language-overridable `Autosave` setting

Antonio Scandurra created

Change summary

crates/settings/src/settings.rs | 17 +++++++++++++++++
crates/zed/src/zed.rs           |  1 -
2 files changed, 17 insertions(+), 1 deletion(-)

Detailed changes

crates/settings/src/settings.rs 🔗

@@ -39,6 +39,7 @@ pub struct LanguageSettings {
     pub preferred_line_length: Option<u32>,
     pub format_on_save: Option<bool>,
     pub enable_language_server: Option<bool>,
+    pub autosave: Option<Autosave>,
 }
 
 #[derive(Copy, Clone, Debug, Deserialize, PartialEq, Eq, JsonSchema)]
@@ -49,6 +50,15 @@ pub enum SoftWrap {
     PreferredLineLength,
 }
 
+#[derive(Copy, Clone, Debug, Deserialize, PartialEq, Eq, JsonSchema)]
+#[serde(rename_all = "snake_case")]
+pub enum Autosave {
+    Off,
+    AfterDelay { milliseconds: usize },
+    OnFocusChange,
+    OnWindowChange,
+}
+
 #[derive(Clone, Debug, Default, Deserialize, JsonSchema)]
 pub struct SettingsFileContent {
     #[serde(default)]
@@ -128,6 +138,11 @@ impl Settings {
             .unwrap_or(true)
     }
 
+    pub fn autosave(&self, language: Option<&str>) -> Autosave {
+        self.language_setting(language, |settings| settings.autosave)
+            .unwrap_or(Autosave::Off)
+    }
+
     pub fn enable_language_server(&self, language: Option<&str>) -> bool {
         self.language_setting(language, |settings| settings.enable_language_server)
             .unwrap_or(true)
@@ -212,6 +227,7 @@ impl Settings {
             &mut self.language_settings.preferred_line_length,
             data.editor.preferred_line_length,
         );
+        merge_option(&mut self.language_settings.autosave, data.editor.autosave);
 
         for (language_name, settings) in data.language_overrides.clone().into_iter() {
             let target = self
@@ -230,6 +246,7 @@ impl Settings {
                 &mut target.preferred_line_length,
                 settings.preferred_line_length,
             );
+            merge_option(&mut target.autosave, settings.autosave);
         }
     }
 }

crates/zed/src/zed.rs 🔗

@@ -97,7 +97,6 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut gpui::MutableAppContext) {
     cx.add_action({
         let app_state = app_state.clone();
         move |_: &mut Workspace, _: &OpenSettings, cx: &mut ViewContext<Workspace>| {
-            println!("open settings");
             open_config_file(&SETTINGS_PATH, app_state.clone(), cx);
         }
     });