From a9713063814648facdf3743a505259cdb88e9789 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 9 Mar 2022 18:00:09 -0800 Subject: [PATCH] Reload the app settings whenever ~/.zed/settings.json changes --- crates/zed/src/language.rs | 7 +------ crates/zed/src/main.rs | 42 ++++++++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/crates/zed/src/language.rs b/crates/zed/src/language.rs index ca73b1ddab..0d69ebee69 100644 --- a/crates/zed/src/language.rs +++ b/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())); diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index f2635fa7fe..67a6b1a73e 100644 --- a/crates/zed/src/main.rs +++ b/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,