repl

Conrad Irwin created

Change summary

assets/settings/default.json                   |  3 
crates/repl/src/jupyter_settings.rs            | 53 ++++---------------
crates/repl/src/repl_settings.rs               | 47 +++++------------
crates/settings/src/settings_content.rs        | 17 ++++++
crates/settings/src/settings_content/editor.rs |  6 ++
crates/vim/src/normal/search.rs                |  4 
6 files changed, 55 insertions(+), 75 deletions(-)

Detailed changes

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"

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<HashMap<String, String>>,
-}
-
-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<Self::FileContent>,
-        _cx: &mut gpui::App,
-    ) -> anyhow::Result<Self>
-    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) {}
 }

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<Self::FileContent>, _cx: &mut App) -> anyhow::Result<Self> {
-        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);
     }
 }

crates/settings/src/settings_content.rs 🔗

@@ -88,6 +88,8 @@ pub struct SettingsContent {
     /// The settings for the image viewer.
     pub image_viewer: Option<ImageViewerSettingsContent>,
 
+    pub repl: Option<ReplSettingsContent>,
+
     /// Whether or not to enable Helix mode.
     ///
     /// Default: false
@@ -766,3 +768,18 @@ pub struct SshPortForwardOption {
     pub remote_host: Option<String>,
     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<usize>,
+    /// Maximum number of columns to keep in REPL's scrollback buffer.
+    /// Clamped with [20, 512] range.
+    ///
+    /// Default: 128
+    pub max_columns: Option<usize>,
+}

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<bool>,
+
+    /// Default kernels to select for each language.
+    ///
+    /// Default: `{}`
+    pub kernel_selections: Option<HashMap<String, String>>,
 }
 
 /// Whether to allow drag and drop text selection in buffer.

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::<EditorSettings>(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::<EditorSettings>(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");