diff --git a/assets/keymaps/default.json b/assets/keymaps/default.json index b40a076c49..7b059652fa 100644 --- a/assets/keymaps/default.json +++ b/assets/keymaps/default.json @@ -425,12 +425,5 @@ "cmd-v": "terminal::Paste", "cmd-k": "terminal::Clear" } - }, - { - "context": "ModalTerminal", - "bindings": { - "ctrl-cmd-space": "terminal::ShowCharacterPalette", - "shift-escape": "terminal::DeployModal" - } } ] \ No newline at end of file diff --git a/crates/settings/src/keymap_file.rs b/crates/settings/src/keymap_file.rs index c1d5db32bb..e588239210 100644 --- a/crates/settings/src/keymap_file.rs +++ b/crates/settings/src/keymap_file.rs @@ -10,6 +10,7 @@ use schemars::{ }; use serde::Deserialize; use serde_json::{value::RawValue, Value}; +use util::ResultExt; #[derive(Deserialize, Default, Clone, JsonSchema)] #[serde(transparent)] @@ -56,26 +57,27 @@ impl KeymapFileContent { for KeymapBlock { context, bindings } in self.0 { let bindings = bindings .into_iter() - .map(|(keystroke, action)| { + .filter_map(|(keystroke, action)| { let action = action.0.get(); // This is a workaround for a limitation in serde: serde-rs/json#497 // We want to deserialize the action data as a `RawValue` so that we can // deserialize the action itself dynamically directly from the JSON // string. But `RawValue` currently does not work inside of an untagged enum. - let action = if action.starts_with('[') { - let ActionWithData(name, data) = serde_json::from_str(action)?; + if action.starts_with('[') { + let ActionWithData(name, data) = serde_json::from_str(action).log_err()?; cx.deserialize_action(&name, Some(data.get())) } else { - let name = serde_json::from_str(action)?; + let name = serde_json::from_str(action).log_err()?; cx.deserialize_action(name, None) } .with_context(|| { format!( "invalid binding value for keystroke {keystroke}, context {context:?}" ) - })?; - Binding::load(&keystroke, action, context.as_deref()) + }) + .log_err() + .map(|action| Binding::load(&keystroke, action, context.as_deref())) }) .collect::>>()?; diff --git a/crates/settings/src/settings.rs b/crates/settings/src/settings.rs index 2b97cb0b10..360ff1ac08 100644 --- a/crates/settings/src/settings.rs +++ b/crates/settings/src/settings.rs @@ -20,6 +20,7 @@ pub use keymap_file::{keymap_file_json_schema, KeymapFileContent}; #[derive(Clone)] pub struct Settings { + pub nightly: FeatureFlags, pub projects_online_by_default: bool, pub buffer_font_family: FamilyId, pub default_buffer_font_size: f32, @@ -38,6 +39,11 @@ pub struct Settings { pub theme: Arc, } +#[derive(Copy, Clone, Debug, Default, Deserialize, JsonSchema)] +pub struct FeatureFlags { + pub modal_terminal: bool, +} + #[derive(Clone, Debug, Default, Deserialize, JsonSchema)] pub struct EditorSettings { pub tab_size: Option, @@ -139,6 +145,8 @@ pub enum WorkingDirectory { #[derive(Clone, Debug, Default, Deserialize, JsonSchema)] pub struct SettingsFileContent { + #[serde(default)] + pub nightly: Option, #[serde(default)] pub projects_online_by_default: Option, #[serde(default)] @@ -189,6 +197,7 @@ impl Settings { .unwrap(); Self { + nightly: FeatureFlags::default(), buffer_font_family: font_cache .load_family(&[defaults.buffer_font_family.as_ref().unwrap()]) .unwrap(), @@ -247,7 +256,7 @@ impl Settings { ); merge(&mut self.vim_mode, data.vim_mode); merge(&mut self.autosave, data.autosave); - + merge(&mut self.nightly, data.nightly); // Ensure terminal font is loaded, so we can request it in terminal_element layout if let Some(terminal_font) = &data.terminal.font_family { font_cache.load_family(&[terminal_font]).log_err(); @@ -308,6 +317,7 @@ impl Settings { #[cfg(any(test, feature = "test-support"))] pub fn test(cx: &gpui::AppContext) -> Settings { Settings { + nightly: FeatureFlags::default(), buffer_font_family: cx.font_cache().load_family(&["Monaco"]).unwrap(), buffer_font_size: 14., default_buffer_font_size: 14., diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index 25e952d591..c8e7396a6f 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -46,7 +46,10 @@ use crate::mappings::{ ///Initialize and register all of our action handlers pub fn init(cx: &mut MutableAppContext) { - cx.add_action(deploy_modal); + let settings = cx.global::(); + if settings.nightly.modal_terminal { + cx.add_action(deploy_modal); + } terminal_view::init(cx); connected_view::init(cx); diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index aa2f0b7ada..2f8bc73c9f 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -95,6 +95,12 @@ fn main() { .spawn(languages::init(languages.clone(), cx.background().clone())); let user_store = cx.add_model(|cx| UserStore::new(client.clone(), http.clone(), cx)); + let (settings_file, keymap_file) = cx.background().block(config_files).unwrap(); + + //Make sure to load settings before initialization, so we know what features to toggle + watch_settings_file(default_settings, settings_file, themes.clone(), cx); + watch_keymap_file(keymap_file, cx); + context_menu::init(cx); project::Project::init(&client); client::Channel::init(&client); @@ -114,10 +120,7 @@ fn main() { terminal::init(cx); let db = cx.background().block(db); - let (settings_file, keymap_file) = cx.background().block(config_files).unwrap(); - watch_settings_file(default_settings, settings_file, themes.clone(), cx); - watch_keymap_file(keymap_file, cx); cx.spawn(|cx| watch_themes(fs.clone(), themes.clone(), cx)) .detach();