use std::path::PathBuf; use collections::HashMap;use schemars::JsonSchema;use serde::{Deserialize, Serialize};use settings_macros::{MergeFrom, with_fallible_options}; use crate::{FontFamilyName, FontFeaturesContent, FontSize, FontWeightContent}; #[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct ProjectTerminalSettingsContent { /// What shell to use when opening a terminal. /// /// Default: system pub shell: Option<Shell>, /// What working directory to use when launching the terminal /// /// Default: current_project_directory pub working_directory: Option<WorkingDirectory>, /// Any key-value pairs added to this list will be added to the terminal's /// environment. Use `:` to separate multiple values. /// /// Default: {} pub env: Option<HashMap<String, String>>, /// Activates the python virtual environment, if one is found, in the /// terminal's working directory (as resolved by the working_directory /// setting). Set this to "off" to disable this behavior. /// /// Default: on pub detect_venv: Option<VenvSettings>, /// Regexes used to identify paths for hyperlink navigation. /// /// Default: [ /// // Python-style diagnostics /// "File \"(?<path>[^\"]+)\", line (?<line>[0-9]+)", /// // Common path syntax with optional line, column, description, trailing punctuation, or /// // surrounding symbols or quotes /// [ /// "(?x)", /// "# optionally starts with 0-2 opening prefix symbols", /// "[({\\[<]{0,2}", /// "# which may be followed by an opening quote", /// "(?<quote>[\"'`])?", /// "# `path` is the shortest sequence of any non-space character", /// "(?<link>(?<path>[^ ]+?", /// " # which may end with a line and optionally a column,", /// " (?<line_column>:+[0-9]+(:[0-9]+)?|:?\\([0-9]+([,:][0-9]+)?\\))?", /// "))", /// "# which must be followed by a matching quote", /// "(?(<quote>)\\k<quote>)", /// "# and optionally a single closing symbol", /// "[)}\\]>]?", /// "# if line/column matched, may be followed by a description", /// "(?(<line_column>):[^ 0-9][^ ]*)?", /// "# which may be followed by trailing punctuation", /// "[.,:)}\\]>]*", /// "# and always includes trailing whitespace or end of line", /// "([ ]+|$)" /// ] /// ] pub path_hyperlink_regexes: Option<Vec<PathHyperlinkRegex>>, /// Timeout for hover and Cmd-click path hyperlink discovery in milliseconds. /// /// Default: 1 pub path_hyperlink_timeout_ms: Option<u64>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct TerminalSettingsContent { #[serde(flatten)] pub project: ProjectTerminalSettingsContent, /// Sets the terminal's font size. /// /// If this option is not included, /// the terminal will default to matching the buffer's font size. pub font_size: Option<FontSize>, /// Sets the terminal's font family. /// /// If this option is not included, /// the terminal will default to matching the buffer's font family. pub font_family: Option<FontFamilyName>, /// Sets the terminal's font fallbacks. /// /// If this option is not included, /// the terminal will default to matching the buffer's font fallbacks. #[schemars(extend("uniqueItems" = true))] pub font_fallbacks: Option<Vec<FontFamilyName>>, /// Sets the terminal's line height. /// /// Default: comfortable pub line_height: Option<TerminalLineHeight>, pub font_features: Option<FontFeaturesContent>, /// Sets the terminal's font weight in CSS weight units 0-900. pub font_weight: Option<FontWeightContent>, /// Default cursor shape for the terminal. /// Can be "bar", "block", "underline", or "hollow". /// /// Default: "block" pub cursor_shape: Option<CursorShapeContent>, /// Sets the cursor blinking behavior in the terminal. /// /// Default: terminal_controlled pub blinking: Option<TerminalBlink>, /// Sets whether Alternate Scroll mode (code: ?1007) is active by default. /// Alternate Scroll mode converts mouse scroll events into up / down key /// presses when in the alternate screen (e.g. when running applications /// like vim or less). The terminal can still set and unset this mode. /// /// Default: on pub alternate_scroll: Option<AlternateScroll>, /// Sets whether the option key behaves as the meta key. /// /// Default: false pub option_as_meta: Option<bool>, /// Whether or not selecting text in the terminal will automatically /// copy to the system clipboard. /// /// Default: false pub copy_on_select: Option<bool>, /// Whether to keep the text selection after copying it to the clipboard. /// /// Default: true pub keep_selection_on_copy: Option<bool>, /// Whether cmd-click (ctrl-click on Linux and Windows) opens hyperlinks even /// when the terminal application has enabled mouse reporting (e.g. vim with /// mouse=a, htop). When false, these clicks are forwarded to the application /// instead, and hyperlinks can still be opened with shift-cmd-click /// (shift-ctrl-click). /// /// Default: true pub open_links_in_mouse_mode: Option<bool>, /// Whether to show the terminal button in the status bar. /// /// Default: true pub button: Option<bool>, pub dock: Option<TerminalDockPosition>, /// Whether the terminal panel should use flexible (proportional) sizing. /// /// Default: true pub flexible: Option<bool>, /// Default width when the terminal is docked to the left or right. /// /// Default: 640 #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")] pub default_width: Option<f32>, /// Default height when the terminal is docked to the bottom. /// /// Default: 320 #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")] pub default_height: Option<f32>, /// The maximum number of lines to keep in the scrollback history. /// Maximum allowed value is 100_000, all values above that will be treated as 100_000. /// 0 disables the scrolling. /// Existing terminals will not pick up this change until they are recreated. /// See <a href="https://github.com/alacritty/alacritty/blob/cb3a79dbf6472740daca8440d5166c1d4af5029e/extra/man/alacritty.5.scd?plain=1#L207-L213">Alacritty documentation</a> for more information. /// /// Default: 10_000 pub max_scroll_history_lines: Option<usize>, /// The multiplier for scrolling with the mouse wheel. /// /// Default: 1.0 pub scroll_multiplier: Option<f32>, /// Toolbar related settings pub toolbar: Option<TerminalToolbarContent>, /// Scrollbar-related settings pub scrollbar: Option<ScrollbarSettingsContent>, /// The minimum APCA perceptual contrast between foreground and background colors. /// /// APCA (Accessible Perceptual Contrast Algorithm) is more accurate than WCAG 2.x, /// especially for dark mode. Values range from 0 to 106. /// /// Based on APCA Readability Criterion (ARC) Bronze Simple Mode: /// https://readtech.org/ARC/tests/bronze-simple-mode/ /// - 0: No contrast adjustment /// - 45: Minimum for large fluent text (36px+) /// - 60: Minimum for other content text /// - 75: Minimum for body text /// - 90: Preferred for body text /// /// Default: 45 #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")] pub minimum_contrast: Option<f32>, /// Whether to show a badge on the terminal panel icon with the count of open terminals. /// /// Default: false pub show_count_badge: Option<bool>, /// What to do when the `BEL` character (`\a`) is printed to terminal. /// /// Default: "system" pub bell: Option<TerminalBell>,} /// Shell configuration to open the terminal with.#[derive( Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::EnumDiscriminants,)]#[strum_discriminants(derive(strum::VariantArray, strum::VariantNames, strum::FromRepr))]#[serde(rename_all = "snake_case")]pub enum Shell { /// Use the system's default terminal configuration in /etc/passwd #[default] System, /// Use a specific program with no arguments. Program(String), /// Use a specific program with arguments. WithArguments { /// The program to run. program: String, /// The arguments to pass to the program. args: Vec<String>, /// An optional string to override the title of the terminal tab title_override: Option<String>, },} #[derive( Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::EnumDiscriminants,)]#[strum_discriminants(derive(strum::VariantArray, strum::VariantNames, strum::FromRepr))]#[serde(rename_all = "snake_case")]pub enum WorkingDirectory { /// Use the current file's directory, falling back to the project directory, /// then the first project in the workspace. CurrentFileDirectory, /// Use the current file's project directory. Fallback to the /// first project directory strategy if unsuccessful. CurrentProjectDirectory, /// Use the first project in this workspace's directory. Fallback to using /// this platform's home directory. FirstProjectDirectory, /// Always use this platform's home directory (if it can be found). AlwaysHome, /// Always use a specific directory. This value will be shell expanded. /// If this path is not a valid directory the terminal will default to /// this platform's home directory (if it can be found). Always { directory: String },} #[with_fallible_options]#[derive( Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, Default,)]pub struct ScrollbarSettingsContent { /// When to show the scrollbar in the terminal. /// /// Default: inherits editor scrollbar settings pub show: Option<ShowScrollbar>,} #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom, Default)]#[serde(rename_all = "snake_case")]pub enum TerminalLineHeight { /// Use a line height that's comfortable for reading, 1.618 #[default] Comfortable, /// Use a standard line height, 1.3. This option is useful for TUIs, /// particularly if they use box characters Standard, /// Use a custom line height. Custom(#[serde(serialize_with = "crate::serialize_f32_with_two_decimal_places")] f32),} impl TerminalLineHeight { pub fn value(&self) -> f32 { match self { TerminalLineHeight::Comfortable => 1.618, TerminalLineHeight::Standard => 1.3, TerminalLineHeight::Custom(line_height) => f32::max(*line_height, 1.), } }} /// When to show the scrollbar.////// Default: auto#[derive( Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, strum::VariantArray, strum::VariantNames,)]#[serde(rename_all = "snake_case")]pub enum ShowScrollbar { /// Show the scrollbar if there's important information or /// follow the system's configured behavior. #[default] Auto, /// Match the system's configured behavior. System, /// Always show the scrollbar. Always, /// Never show the scrollbar. Never,} #[derive( Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::VariantArray, strum::VariantNames,)]#[serde(rename_all = "snake_case")]// todo() -> combine with CursorShapepub enum CursorShapeContent { /// Cursor is a block like `█`. #[default] Block, /// Cursor is an underscore like `_`. Underline, /// Cursor is a vertical bar like `⎸`. Bar, /// Cursor is a hollow box like `▯`. Hollow,} #[derive( Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::VariantArray, strum::VariantNames,)]#[serde(rename_all = "snake_case")]pub enum TerminalBlink { /// Never blink the cursor, ignoring the terminal mode. Off, /// Default the cursor blink to off, but allow the terminal to /// set blinking. TerminalControlled, /// Always blink the cursor, ignoring the terminal mode. On,} #[derive( Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::VariantArray, strum::VariantNames,)]#[serde(rename_all = "snake_case")]pub enum AlternateScroll { On, Off,} // Toolbar related settings#[with_fallible_options]#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)]pub struct TerminalToolbarContent { /// Whether to display the terminal title in breadcrumbs inside the terminal pane. /// Only shown if the terminal title is not empty. /// /// The shell running in the terminal needs to be configured to emit the title. /// Example: `echo -e "\e]2;New Title\007";` /// /// Default: true pub breadcrumbs: Option<bool>,} #[derive( Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom, strum::VariantArray, strum::VariantNames,)]#[serde(rename_all = "snake_case")]pub enum TerminalBell { /// Play an OS-specific alert sound. #[default] System, /// Do not play any sound. Off,} #[derive( Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom,)]#[serde(rename_all = "snake_case")]pub enum CondaManager { /// Automatically detect the conda manager #[default] Auto, /// Use conda Conda, /// Use mamba Mamba, /// Use micromamba Micromamba,} #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]#[serde(rename_all = "snake_case")]pub enum VenvSettings { #[default] Off, On { /// Default directories to search for virtual environments, relative /// to the current working directory. We recommend overriding this /// in your project's settings, rather than globally. activate_script: Option<ActivateScript>, venv_name: Option<String>, directories: Option<Vec<PathBuf>>, /// Preferred Conda manager to use when activating Conda environments. /// /// Default: auto conda_manager: Option<CondaManager>, },}#[with_fallible_options]pub struct VenvSettingsContent<'a> { pub activate_script: ActivateScript, pub venv_name: &'a str, pub directories: &'a [PathBuf], pub conda_manager: CondaManager,} impl VenvSettings { pub fn as_option(&self) -> Option<VenvSettingsContent<'_>> { match self { VenvSettings::Off => None, VenvSettings::On { activate_script, venv_name, directories, conda_manager, } => Some(VenvSettingsContent { activate_script: activate_script.unwrap_or(ActivateScript::Default), venv_name: venv_name.as_deref().unwrap_or(""), directories: directories.as_deref().unwrap_or(&[]), conda_manager: conda_manager.unwrap_or(CondaManager::Auto), }), } }} #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]#[serde(untagged)]pub enum PathHyperlinkRegex { SingleLine(String), MultiLine(Vec<String>),} #[derive(Lines 1–500 of 555. Load more
use std::path::PathBuf; use collections::HashMap; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings_macros::{MergeFrom, with_fallible_options}; use crate::{FontFamilyName, FontFeaturesContent, FontSize, FontWeightContent}; #[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct ProjectTerminalSettingsContent { /// What shell to use when opening a terminal. /// /// Default: system pub shell: Option<Shell>, /// What working directory to use when launching the terminal /// /// Default: current_project_directory pub working_directory: Option<WorkingDirectory>, /// Any key-value pairs added to this list will be added to the terminal's /// environment. Use `:` to separate multiple values. /// /// Default: {} pub env: Option<HashMap<String, String>>, /// Activates the python virtual environment, if one is found, in the /// terminal's working directory (as resolved by the working_directory /// setting). Set this to "off" to disable this behavior. /// /// Default: on pub detect_venv: Option<VenvSettings>, /// Regexes used to identify paths for hyperlink navigation. /// /// Default: [ /// // Python-style diagnostics /// "File \"(?<path>[^\"]+)\", line (?<line>[0-9]+)", /// // Common path syntax with optional line, column, description, trailing punctuation, or /// // surrounding symbols or quotes /// [ /// "(?x)", /// "# optionally starts with 0-2 opening prefix symbols", /// "[({\\[<]{0,2}", /// "# which may be followed by an opening quote", /// "(?<quote>[\"'`])?", /// "# `path` is the shortest sequence of any non-space character", /// "(?<link>(?<path>[^ ]+?", /// " # which may end with a line and optionally a column,", /// " (?<line_column>:+[0-9]+(:[0-9]+)?|:?\\([0-9]+([,:][0-9]+)?\\))?", /// "))", /// "# which must be followed by a matching quote", /// "(?(<quote>)\\k<quote>)", /// "# and optionally a single closing symbol", /// "[)}\\]>]?", /// "# if line/column matched, may be followed by a description", /// "(?(<line_column>):[^ 0-9][^ ]*)?", /// "# which may be followed by trailing punctuation", /// "[.,:)}\\]>]*", /// "# and always includes trailing whitespace or end of line", /// "([ ]+|$)" /// ] /// ] pub path_hyperlink_regexes: Option<Vec<PathHyperlinkRegex>>, /// Timeout for hover and Cmd-click path hyperlink discovery in milliseconds. /// /// Default: 1 pub path_hyperlink_timeout_ms: Option<u64>, } #[with_fallible_options] #[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct TerminalSettingsContent { #[serde(flatten)] pub project: ProjectTerminalSettingsContent, /// Sets the terminal's font size. /// /// If this option is not included, /// the terminal will default to matching the buffer's font size. pub font_size: Option<FontSize>, /// Sets the terminal's font family. /// /// If this option is not included, /// the terminal will default to matching the buffer's font family. pub font_family: Option<FontFamilyName>, /// Sets the terminal's font fallbacks. /// /// If this option is not included, /// the terminal will default to matching the buffer's font fallbacks. #[schemars(extend("uniqueItems" = true))] pub font_fallbacks: Option<Vec<FontFamilyName>>, /// Sets the terminal's line height. /// /// Default: comfortable pub line_height: Option<TerminalLineHeight>, pub font_features: Option<FontFeaturesContent>, /// Sets the terminal's font weight in CSS weight units 0-900. pub font_weight: Option<FontWeightContent>, /// Default cursor shape for the terminal. /// Can be "bar", "block", "underline", or "hollow". /// /// Default: "block" pub cursor_shape: Option<CursorShapeContent>, /// Sets the cursor blinking behavior in the terminal. /// /// Default: terminal_controlled pub blinking: Option<TerminalBlink>, /// Sets whether Alternate Scroll mode (code: ?1007) is active by default. /// Alternate Scroll mode converts mouse scroll events into up / down key /// presses when in the alternate screen (e.g. when running applications /// like vim or less). The terminal can still set and unset this mode. /// /// Default: on pub alternate_scroll: Option<AlternateScroll>, /// Sets whether the option key behaves as the meta key. /// /// Default: false pub option_as_meta: Option<bool>, /// Whether or not selecting text in the terminal will automatically /// copy to the system clipboard. /// /// Default: false pub copy_on_select: Option<bool>, /// Whether to keep the text selection after copying it to the clipboard. /// /// Default: true pub keep_selection_on_copy: Option<bool>, /// Whether cmd-click (ctrl-click on Linux and Windows) opens hyperlinks even /// when the terminal application has enabled mouse reporting (e.g. vim with /// mouse=a, htop). When false, these clicks are forwarded to the application /// instead, and hyperlinks can still be opened with shift-cmd-click /// (shift-ctrl-click). /// /// Default: true pub open_links_in_mouse_mode: Option<bool>, /// Whether to show the terminal button in the status bar. /// /// Default: true pub button: Option<bool>, pub dock: Option<TerminalDockPosition>, /// Whether the terminal panel should use flexible (proportional) sizing. /// /// Default: true pub flexible: Option<bool>, /// Default width when the terminal is docked to the left or right. /// /// Default: 640 #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")] pub default_width: Option<f32>, /// Default height when the terminal is docked to the bottom. /// /// Default: 320 #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")] pub default_height: Option<f32>, /// The maximum number of lines to keep in the scrollback history. /// Maximum allowed value is 100_000, all values above that will be treated as 100_000. /// 0 disables the scrolling. /// Existing terminals will not pick up this change until they are recreated. /// See <a href="https://github.com/alacritty/alacritty/blob/cb3a79dbf6472740daca8440d5166c1d4af5029e/extra/man/alacritty.5.scd?plain=1#L207-L213">Alacritty documentation</a> for more information. /// /// Default: 10_000 pub max_scroll_history_lines: Option<usize>, /// The multiplier for scrolling with the mouse wheel. /// /// Default: 1.0 pub scroll_multiplier: Option<f32>, /// Toolbar related settings pub toolbar: Option<TerminalToolbarContent>, /// Scrollbar-related settings pub scrollbar: Option<ScrollbarSettingsContent>, /// The minimum APCA perceptual contrast between foreground and background colors. /// /// APCA (Accessible Perceptual Contrast Algorithm) is more accurate than WCAG 2.x, /// especially for dark mode. Values range from 0 to 106. /// /// Based on APCA Readability Criterion (ARC) Bronze Simple Mode: /// https://readtech.org/ARC/tests/bronze-simple-mode/ /// - 0: No contrast adjustment /// - 45: Minimum for large fluent text (36px+) /// - 60: Minimum for other content text /// - 75: Minimum for body text /// - 90: Preferred for body text /// /// Default: 45 #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")] pub minimum_contrast: Option<f32>, /// Whether to show a badge on the terminal panel icon with the count of open terminals. /// /// Default: false pub show_count_badge: Option<bool>, /// What to do when the `BEL` character (`\a`) is printed to terminal. /// /// Default: "system" pub bell: Option<TerminalBell>, } /// Shell configuration to open the terminal with. #[derive( Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::EnumDiscriminants, )] #[strum_discriminants(derive(strum::VariantArray, strum::VariantNames, strum::FromRepr))] #[serde(rename_all = "snake_case")] pub enum Shell { /// Use the system's default terminal configuration in /etc/passwd #[default] System, /// Use a specific program with no arguments. Program(String), /// Use a specific program with arguments. WithArguments { /// The program to run. program: String, /// The arguments to pass to the program. args: Vec<String>, /// An optional string to override the title of the terminal tab title_override: Option<String>, }, } #[derive( Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::EnumDiscriminants, )] #[strum_discriminants(derive(strum::VariantArray, strum::VariantNames, strum::FromRepr))] #[serde(rename_all = "snake_case")] pub enum WorkingDirectory { /// Use the current file's directory, falling back to the project directory, /// then the first project in the workspace. CurrentFileDirectory, /// Use the current file's project directory. Fallback to the /// first project directory strategy if unsuccessful. CurrentProjectDirectory, /// Use the first project in this workspace's directory. Fallback to using /// this platform's home directory. FirstProjectDirectory, /// Always use this platform's home directory (if it can be found). AlwaysHome, /// Always use a specific directory. This value will be shell expanded. /// If this path is not a valid directory the terminal will default to /// this platform's home directory (if it can be found). Always { directory: String }, } #[with_fallible_options] #[derive( Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, Default, )] pub struct ScrollbarSettingsContent { /// When to show the scrollbar in the terminal. /// /// Default: inherits editor scrollbar settings pub show: Option<ShowScrollbar>, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom, Default)] #[serde(rename_all = "snake_case")] pub enum TerminalLineHeight { /// Use a line height that's comfortable for reading, 1.618 #[default] Comfortable, /// Use a standard line height, 1.3. This option is useful for TUIs, /// particularly if they use box characters Standard, /// Use a custom line height. Custom(#[serde(serialize_with = "crate::serialize_f32_with_two_decimal_places")] f32), } impl TerminalLineHeight { pub fn value(&self) -> f32 { match self { TerminalLineHeight::Comfortable => 1.618, TerminalLineHeight::Standard => 1.3, TerminalLineHeight::Custom(line_height) => f32::max(*line_height, 1.), } } } /// When to show the scrollbar. /// /// Default: auto #[derive( Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, strum::VariantArray, strum::VariantNames, )] #[serde(rename_all = "snake_case")] pub enum ShowScrollbar { /// Show the scrollbar if there's important information or /// follow the system's configured behavior. #[default] Auto, /// Match the system's configured behavior. System, /// Always show the scrollbar. Always, /// Never show the scrollbar. Never, } #[derive( Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::VariantArray, strum::VariantNames, )] #[serde(rename_all = "snake_case")] // todo() -> combine with CursorShape pub enum CursorShapeContent { /// Cursor is a block like `█`. #[default] Block, /// Cursor is an underscore like `_`. Underline, /// Cursor is a vertical bar like `⎸`. Bar, /// Cursor is a hollow box like `▯`. Hollow, } #[derive( Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::VariantArray, strum::VariantNames, )] #[serde(rename_all = "snake_case")] pub enum TerminalBlink { /// Never blink the cursor, ignoring the terminal mode. Off, /// Default the cursor blink to off, but allow the terminal to /// set blinking. TerminalControlled, /// Always blink the cursor, ignoring the terminal mode. On, } #[derive( Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom, strum::VariantArray, strum::VariantNames, )] #[serde(rename_all = "snake_case")] pub enum AlternateScroll { On, Off, } // Toolbar related settings #[with_fallible_options] #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] pub struct TerminalToolbarContent { /// Whether to display the terminal title in breadcrumbs inside the terminal pane. /// Only shown if the terminal title is not empty. /// /// The shell running in the terminal needs to be configured to emit the title. /// Example: `echo -e "\e]2;New Title\007";` /// /// Default: true pub breadcrumbs: Option<bool>, } #[derive( Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom, strum::VariantArray, strum::VariantNames, )] #[serde(rename_all = "snake_case")] pub enum TerminalBell { /// Play an OS-specific alert sound. #[default] System, /// Do not play any sound. Off, } #[derive( Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom, )] #[serde(rename_all = "snake_case")] pub enum CondaManager { /// Automatically detect the conda manager #[default] Auto, /// Use conda Conda, /// Use mamba Mamba, /// Use micromamba Micromamba, } #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] #[serde(rename_all = "snake_case")] pub enum VenvSettings { #[default] Off, On { /// Default directories to search for virtual environments, relative /// to the current working directory. We recommend overriding this /// in your project's settings, rather than globally. activate_script: Option<ActivateScript>, venv_name: Option<String>, directories: Option<Vec<PathBuf>>, /// Preferred Conda manager to use when activating Conda environments. /// /// Default: auto conda_manager: Option<CondaManager>, }, } #[with_fallible_options] pub struct VenvSettingsContent<'a> { pub activate_script: ActivateScript, pub venv_name: &'a str, pub directories: &'a [PathBuf], pub conda_manager: CondaManager, } impl VenvSettings { pub fn as_option(&self) -> Option<VenvSettingsContent<'_>> { match self { VenvSettings::Off => None, VenvSettings::On { activate_script, venv_name, directories, conda_manager, } => Some(VenvSettingsContent { activate_script: activate_script.unwrap_or(ActivateScript::Default), venv_name: venv_name.as_deref().unwrap_or(""), directories: directories.as_deref().unwrap_or(&[]), conda_manager: conda_manager.unwrap_or(CondaManager::Auto), }), } } } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] #[serde(untagged)] pub enum PathHyperlinkRegex { SingleLine(String), MultiLine(Vec<String>), } #[derive(