Reload the app settings whenever ~/.zed/settings.json changes

Max Brunsfeld created

Change summary

crates/zed/src/language.rs |  7 -----
crates/zed/src/main.rs     | 42 +++++++++++++++++++++++++++++++--------
2 files changed, 34 insertions(+), 15 deletions(-)

Detailed changes

crates/zed/src/language.rs 🔗

@@ -533,12 +533,7 @@ impl LspAdapter for JsonLspAdapter {
 }
 
 pub fn build_language_registry(login_shell_env_loaded: Task<()>) -> LanguageRegistry {
-    let mut languages = LanguageRegistry::new(login_shell_env_loaded);
-    languages.set_language_server_download_dir(
-        dirs::home_dir()
-            .expect("failed to determine home directory")
-            .join(".zed"),
-    );
+    let languages = LanguageRegistry::new(login_shell_env_loaded);
     languages.add(Arc::new(c()));
     languages.add(Arc::new(json()));
     languages.add(Arc::new(rust()));

crates/zed/src/main.rs 🔗

@@ -12,7 +12,11 @@ use smol::process::Command;
 use std::{env, fs, path::PathBuf, sync::Arc};
 use theme::{ThemeRegistry, DEFAULT_THEME_NAME};
 use util::ResultExt;
-use workspace::{self, settings, AppState, OpenNew, OpenParams, OpenPaths, Settings};
+use workspace::{
+    self,
+    settings::{self, SettingsFile},
+    AppState, OpenNew, OpenParams, OpenPaths, Settings,
+};
 use zed::{
     self, assets::Assets, build_window_options, build_workspace, fs::RealFs, language, menus,
 };
@@ -23,9 +27,13 @@ fn main() {
     let app = gpui::App::new(Assets).unwrap();
     load_embedded_fonts(&app);
 
+    let zed_dir = dirs::home_dir()
+        .expect("failed to determine home directory")
+        .join(".zed");
+
     let themes = ThemeRegistry::new(Assets, app.font_cache());
     let theme = themes.get(DEFAULT_THEME_NAME).unwrap();
-    let settings = Settings::new("Zed Mono", &app.font_cache(), theme)
+    let default_settings = Settings::new("Zed Mono", &app.font_cache(), theme)
         .unwrap()
         .with_overrides(
             language::PLAIN_TEXT.name(),
@@ -41,7 +49,6 @@ fn main() {
                 ..Default::default()
             },
         );
-    let (settings_tx, settings) = postage::watch::channel_with(settings);
 
     let login_shell_env_loaded = if stdout_is_a_pty() {
         Task::ready(())
@@ -51,10 +58,27 @@ fn main() {
         })
     };
 
-    let languages = Arc::new(language::build_language_registry(login_shell_env_loaded));
-    languages.set_theme(&settings.borrow().theme.editor.syntax);
-
     app.run(move |cx| {
+        let fs = Arc::new(RealFs);
+        let user_settings_file = cx.background().block(SettingsFile::new(
+            fs.clone(),
+            cx.background(),
+            zed_dir.join("settings.json"),
+        ));
+
+        let (settings_tx, settings) = Settings::from_files(
+            default_settings,
+            vec![user_settings_file],
+            cx.background().clone(),
+            themes.clone(),
+            cx.font_cache().clone(),
+        );
+
+        let mut languages = language::build_language_registry(login_shell_env_loaded);
+        languages.set_language_server_download_dir(zed_dir);
+        languages.set_theme(&settings.borrow().theme.editor.syntax);
+        let languages = Arc::new(languages);
+
         let http = http::client();
         let client = client::Client::new(http.clone());
         let user_store = cx.add_model(|cx| UserStore::new(client.clone(), http.clone(), cx));
@@ -85,15 +109,15 @@ fn main() {
         .detach_and_log_err(cx);
 
         let app_state = Arc::new(AppState {
-            languages: languages.clone(),
-            settings_tx: Arc::new(Mutex::new(settings_tx)),
+            languages,
+            settings_tx,
             settings,
             themes,
             channel_list: cx
                 .add_model(|cx| ChannelList::new(user_store.clone(), client.clone(), cx)),
             client,
             user_store,
-            fs: Arc::new(RealFs),
+            fs,
             path_openers: Arc::from(path_openers),
             build_window_options: &build_window_options,
             build_workspace: &build_workspace,