Expose REPL Settings (#37927)

Closes #37829

This PR introduces and exposes `REPLSettings` to control the number of
lines and columns in the REPL. These settings are integrated into the
existing configuration system, allowing for customization and management
through the standard settings interface.

#### Changes
- Added `REPLSettings` struct with `max_number_of_lines` and
`max_number_of_columns` fields.
- Integrated `REPLSettings` with the settings system by implementing the
`Settings` trait.
- Ensured compatibility with the workspace and existing settings
infrastructure.

Release Notes:

- Add configuration "repl" to settings to configure max lines and
columns for repl.

---------

Co-authored-by: Marshall Bowers <git@maxdeviant.com>
Co-authored-by: Kirill Bulatov <kirill@zed.dev>
This commit is contained in:
Casper van Elteren
2025-09-13 23:17:44 +00:00
committed by GitHub
co-authored by Marshall Bowers Kirill Bulatov
parent 13113ab311
commit c50b561e1c
7 changed files with 89 additions and 5 deletions
+3 -5
View File
@@ -31,6 +31,7 @@ use theme::ThemeSettings;
use ui::{IntoElement, prelude::*};
use crate::outputs::OutputContent;
use crate::repl_settings::ReplSettings;
/// The `TerminalOutput` struct handles the parsing and rendering of text input,
/// simulating a basic terminal environment within REPL output.
@@ -53,9 +54,6 @@ pub struct TerminalOutput {
handler: alacritty_terminal::Term<VoidListener>,
}
const DEFAULT_NUM_LINES: usize = 32;
const DEFAULT_NUM_COLUMNS: usize = 128;
/// Returns the default text style for the terminal output.
pub fn text_style(window: &mut Window, cx: &mut App) -> TextStyle {
let settings = ThemeSettings::get_global(cx).clone();
@@ -99,8 +97,8 @@ pub fn terminal_size(window: &mut Window, cx: &mut App) -> terminal::TerminalBou
.unwrap()
.width;
let num_lines = DEFAULT_NUM_LINES;
let columns = DEFAULT_NUM_COLUMNS;
let num_lines = ReplSettings::get_global(cx).max_lines;
let columns = ReplSettings::get_global(cx).max_columns;
// Reversed math from terminal::TerminalSize to get pixel width according to terminal width
let width = columns as f32 * cell_width;
+3
View File
@@ -5,6 +5,7 @@ pub mod notebook;
mod outputs;
mod repl_editor;
mod repl_sessions_ui;
mod repl_settings;
mod repl_store;
mod session;
@@ -22,6 +23,7 @@ pub use crate::repl_editor::*;
pub use crate::repl_sessions_ui::{
ClearOutputs, Interrupt, ReplSessionsPage, Restart, Run, Sessions, Shutdown,
};
pub use crate::repl_settings::ReplSettings;
use crate::repl_store::ReplStore;
pub use crate::session::Session;
@@ -31,6 +33,7 @@ pub fn init(fs: Arc<dyn Fs>, cx: &mut App) {
set_dispatcher(zed_dispatcher(cx));
JupyterSettings::register(cx);
::editor::init_settings(cx);
ReplSettings::register(cx);
repl_sessions_ui::init(cx);
ReplStore::init(fs, cx);
}
+55
View File
@@ -0,0 +1,55 @@
use gpui::App;
use schemars::JsonSchema;
use serde_derive::{Deserialize, Serialize};
use settings::{Settings, SettingsKey, SettingsSources, SettingsUi};
/// Settings for configuring REPL display and behavior.
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)]
#[settings_key(key = "repl")]
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 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)
}
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
}
impl Default for ReplSettings {
fn default() -> Self {
ReplSettings {
max_lines: DEFAULT_NUM_LINES,
max_columns: DEFAULT_NUM_COLUMNS,
}
}
}