diff --git a/assets/settings/default.json b/assets/settings/default.json index 3c871937d0a10f2af143d61887f8a7e92df4accb..2a6f49c3736a49bba64d2ddb1174969c9e792807 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -1879,7 +1879,8 @@ }, // Jupyter settings "jupyter": { - "enabled": true + "enabled": true, + "kernel_selections": {} // Specify the language name as the key and the kernel name as the value. // "kernel_selections": { // "python": "conda-base" diff --git a/crates/repl/src/jupyter_settings.rs b/crates/repl/src/jupyter_settings.rs index c89736a03dc6d77dd89bb33c4990b25149189a41..8a468e9ec65feb8431222bd6b9a33c8bbd9efaf3 100644 --- a/crates/repl/src/jupyter_settings.rs +++ b/crates/repl/src/jupyter_settings.rs @@ -1,10 +1,8 @@ -use std::collections::HashMap; +use collections::HashMap; use editor::EditorSettings; use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::Settings; #[derive(Debug, Default)] pub struct JupyterSettings { @@ -20,45 +18,20 @@ impl JupyterSettings { } } -#[derive(Clone, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey)] -#[settings_key(key = "jupyter")] -pub struct JupyterSettingsContent { - /// Default kernels to select for each language. - /// - /// Default: `{}` - pub kernel_selections: Option>, -} - -impl Default for JupyterSettingsContent { - fn default() -> Self { - JupyterSettingsContent { - kernel_selections: Some(HashMap::new()), +impl Settings for JupyterSettings { + fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self { + let jupyter = content.editor.jupyter.clone().unwrap(); + Self { + kernel_selections: jupyter.kernel_selections.unwrap_or_default(), } } -} -impl Settings for JupyterSettings { - type FileContent = JupyterSettingsContent; - - fn load( - sources: SettingsSources, - _cx: &mut gpui::App, - ) -> anyhow::Result - where - Self: Sized, - { - let mut settings = JupyterSettings::default(); - - for value in sources.defaults_and_customizations() { - if let Some(source) = &value.kernel_selections { - for (k, v) in source { - settings.kernel_selections.insert(k.clone(), v.clone()); - } - } + fn refine(&mut self, content: &settings::SettingsContent, _cx: &mut App) { + let Some(jupyter) = content.editor.jupyter.as_ref() else { + return; + }; + if let Some(kernel_selections) = jupyter.kernel_selections.clone() { + self.kernel_selections.extend(kernel_selections) } - - Ok(settings) } - - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} } diff --git a/crates/repl/src/repl_settings.rs b/crates/repl/src/repl_settings.rs index 2fbf4b63731009a30691f04067bf96fbb8250880..1c9ceeecfc19bec40243193e9d4ea21a2e266e45 100644 --- a/crates/repl/src/repl_settings.rs +++ b/crates/repl/src/repl_settings.rs @@ -1,55 +1,38 @@ use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::Settings; +use util::MergeFrom; /// Settings for configuring REPL display and behavior. -#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(key = "repl")] +#[derive(Clone, Debug)] pub struct ReplSettings { /// Maximum number of lines to keep in REPL's scrollback buffer. /// Clamped with [4, 256] range. /// /// Default: 32 - #[serde(default = "default_max_lines")] pub max_lines: usize, /// Maximum number of columns to keep in REPL's scrollback buffer. /// Clamped with [20, 512] range. /// /// Default: 128 - #[serde(default = "default_max_columns")] pub max_columns: usize, } impl Settings for ReplSettings { - type FileContent = Self; + fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self { + let repl = content.repl.as_ref().unwrap(); - fn load(sources: SettingsSources, _cx: &mut App) -> anyhow::Result { - let mut settings: ReplSettings = sources.json_merge()?; - settings.max_columns = settings.max_columns.clamp(20, 512); - settings.max_lines = settings.max_lines.clamp(4, 256); - Ok(settings) + Self { + max_lines: repl.max_lines.unwrap(), + max_columns: repl.max_columns.unwrap(), + } } - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} -} - -const DEFAULT_NUM_LINES: usize = 32; -const DEFAULT_NUM_COLUMNS: usize = 128; - -fn default_max_lines() -> usize { - DEFAULT_NUM_LINES -} - -fn default_max_columns() -> usize { - DEFAULT_NUM_COLUMNS -} + fn refine(&mut self, content: &settings::SettingsContent, _cx: &mut App) { + let Some(repl) = content.repl.as_ref() else { + return; + }; -impl Default for ReplSettings { - fn default() -> Self { - ReplSettings { - max_lines: DEFAULT_NUM_LINES, - max_columns: DEFAULT_NUM_COLUMNS, - } + self.max_columns.merge_from(&repl.max_columns); + self.max_lines.merge_from(&repl.max_lines); } } diff --git a/crates/settings/src/settings_content.rs b/crates/settings/src/settings_content.rs index b8a341fa05c5ed8bc964371737687dc83d04f9dc..55ec782e83369a571b958bacb2a3c4d223ce8567 100644 --- a/crates/settings/src/settings_content.rs +++ b/crates/settings/src/settings_content.rs @@ -88,6 +88,8 @@ pub struct SettingsContent { /// The settings for the image viewer. pub image_viewer: Option, + pub repl: Option, + /// Whether or not to enable Helix mode. /// /// Default: false @@ -766,3 +768,18 @@ pub struct SshPortForwardOption { pub remote_host: Option, pub remote_port: u16, } + +/// Settings for configuring REPL display and behavior. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema)] +pub struct ReplSettingsContent { + /// Maximum number of lines to keep in REPL's scrollback buffer. + /// Clamped with [4, 256] range. + /// + /// Default: 32 + pub max_lines: Option, + /// Maximum number of columns to keep in REPL's scrollback buffer. + /// Clamped with [20, 512] range. + /// + /// Default: 128 + pub max_columns: Option, +} diff --git a/crates/settings/src/settings_content/editor.rs b/crates/settings/src/settings_content/editor.rs index 5220c029697e9714dc80f31fec23a4406e8d1855..e8631d356dd1c664615d0a0933b479ac8f88bbcd 100644 --- a/crates/settings/src/settings_content/editor.rs +++ b/crates/settings/src/settings_content/editor.rs @@ -1,5 +1,6 @@ use std::num; +use collections::HashMap; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -541,6 +542,11 @@ pub struct JupyterContent { /// /// Default: true pub enabled: Option, + + /// Default kernels to select for each language. + /// + /// Default: `{}` + pub kernel_selections: Option>, } /// Whether to allow drag and drop text selection in buffer. diff --git a/crates/vim/src/normal/search.rs b/crates/vim/src/normal/search.rs index a92ec7f6d3a05b26d31feca567e7a2e08f7f2b20..6ebf8e6c02e94906d973cc1ebcd07726b4ef1ac7 100644 --- a/crates/vim/src/normal/search.rs +++ b/crates/vim/src/normal/search.rs @@ -694,7 +694,7 @@ mod test { let mut cx = VimTestContext::new(cx, true).await; cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| s.search_wrap = Some(false)); + store.update_user_settings(cx, |s| s.editor.search_wrap = Some(false)); }); cx.set_state("ˇhi\nhigh\nhi\n", Mode::Normal); @@ -815,7 +815,7 @@ mod test { // check that searching with unable search wrap cx.update_global(|store: &mut SettingsStore, cx| { - store.update_user_settings::(cx, |s| s.search_wrap = Some(false)); + store.update_user_settings(cx, |s| s.editor.search_wrap = Some(false)); }); cx.set_state("aa\nbˇb\ncc\ncc\ncc\n", Mode::Normal); cx.simulate_keystrokes("/ c c enter");