302 lines · 11.9 KB · Rust
RawDownload
use core::num; use gpui::App;use language::CursorShape;use project::project_settings::DiagnosticSeverity;pub use settings::{    CompletionDetailAlignment, CurrentLineHighlight, DelayMs, DiffViewStyle, DisplayIn,    DocumentColorsRenderMode, DoubleClickInMultibuffer, GoToDefinitionFallback, HideMouseMode,    MinimapThumb, MinimapThumbBorder, MultiCursorModifier, ScrollBeyondLastLine,    ScrollbarDiagnostics, SeedQuerySetting, ShowMinimap, SnippetSortOrder,};use settings::{RegisterSetting, RelativeLineNumbers, Settings};use ui::scrollbars::{ScrollbarVisibility, ShowScrollbar}; /// Imports from the VSCode settings at/// https://code.visualstudio.com/docs/reference/default-settings#[derive(Clone, RegisterSetting)]pub struct EditorSettings {    pub cursor_blink: bool,    pub cursor_shape: Option<CursorShape>,    pub current_line_highlight: CurrentLineHighlight,    pub selection_highlight: bool,    pub rounded_selection: bool,    pub lsp_highlight_debounce: DelayMs,    pub hover_popover_enabled: bool,    pub hover_popover_delay: DelayMs,    pub toolbar: Toolbar,    pub scrollbar: Scrollbar,    pub minimap: Minimap,    pub gutter: Gutter,    pub scroll_beyond_last_line: ScrollBeyondLastLine,    pub vertical_scroll_margin: f64,    pub autoscroll_on_clicks: bool,    pub horizontal_scroll_margin: f32,    pub scroll_sensitivity: f32,    pub fast_scroll_sensitivity: f32,    pub sticky_scroll: StickyScroll,    pub relative_line_numbers: RelativeLineNumbers,    pub seed_search_query_from_cursor: SeedQuerySetting,    pub use_smartcase_search: bool,    pub multi_cursor_modifier: MultiCursorModifier,    pub redact_private_values: bool,    pub expand_excerpt_lines: u32,    pub excerpt_context_lines: u32,    pub middle_click_paste: bool,    pub double_click_in_multibuffer: DoubleClickInMultibuffer,    pub search_wrap: bool,    pub search: SearchSettings,    pub auto_signature_help: bool,    pub show_signature_help_after_edits: bool,    pub go_to_definition_fallback: GoToDefinitionFallback,    pub jupyter: Jupyter,    pub hide_mouse: Option<HideMouseMode>,    pub snippet_sort_order: SnippetSortOrder,    pub diagnostics_max_severity: Option<DiagnosticSeverity>,    pub inline_code_actions: bool,    pub drag_and_drop_selection: DragAndDropSelection,    pub lsp_document_colors: DocumentColorsRenderMode,    pub minimum_contrast_for_highlights: f32,    pub completion_menu_scrollbar: ShowScrollbar,    pub completion_detail_alignment: CompletionDetailAlignment,    pub diff_view_style: DiffViewStyle,}#[derive(Debug, Clone)]pub struct Jupyter {    /// Whether the Jupyter feature is enabled.    ///    /// Default: true    pub enabled: bool,} #[derive(Copy, Clone, Debug, PartialEq, Eq)]pub struct StickyScroll {    pub enabled: bool,} #[derive(Clone, Debug, PartialEq, Eq)]pub struct Toolbar {    pub breadcrumbs: bool,    pub quick_actions: bool,    pub selections_menu: bool,    pub agent_review: bool,    pub code_actions: bool,} #[derive(Copy, Clone, Debug, PartialEq, Eq)]pub struct Scrollbar {    pub show: ShowScrollbar,    pub git_diff: bool,    pub selected_text: bool,    pub selected_symbol: bool,    pub search_results: bool,    pub diagnostics: ScrollbarDiagnostics,    pub cursors: bool,    pub axes: ScrollbarAxes,} #[derive(Copy, Clone, Debug, PartialEq)]pub struct Minimap {    pub show: ShowMinimap,    pub display_in: DisplayIn,    pub thumb: MinimapThumb,    pub thumb_border: MinimapThumbBorder,    pub current_line_highlight: Option<CurrentLineHighlight>,    pub max_width_columns: num::NonZeroU32,} impl Minimap {    pub fn minimap_enabled(&self) -> bool {        self.show != ShowMinimap::Never    }     #[inline]    pub fn on_active_editor(&self) -> bool {        self.display_in == DisplayIn::ActiveEditor    }     pub fn with_show_override(self) -> Self {        Self {            show: ShowMinimap::Always,            ..self        }    }} #[derive(Copy, Clone, Debug, PartialEq, Eq)]pub struct Gutter {    pub min_line_number_digits: usize,    pub line_numbers: bool,    pub runnables: bool,    pub breakpoints: bool,    pub folds: bool,} /// Forcefully enable or disable the scrollbar for each axis#[derive(Copy, Clone, Debug, PartialEq, Eq)]pub struct ScrollbarAxes {    /// When false, forcefully disables the horizontal scrollbar. Otherwise, obey other settings.    ///    /// Default: true    pub horizontal: bool,     /// When false, forcefully disables the vertical scrollbar. Otherwise, obey other settings.    ///    /// Default: true    pub vertical: bool,} /// Whether to allow drag and drop text selection in buffer.#[derive(Copy, Clone, Default, Debug, PartialEq, Eq)]pub struct DragAndDropSelection {    /// When true, enables drag and drop text selection in buffer.    ///    /// Default: true    pub enabled: bool,     /// The delay in milliseconds that must elapse before drag and drop is allowed. Otherwise, a new text selection is created.    ///    /// Default: 300    pub delay: DelayMs,} /// Default options for buffer and project search items.#[derive(Copy, Clone, Default, Debug, PartialEq, Eq)]pub struct SearchSettings {    /// Whether to show the project search button in the status bar.    pub button: bool,    /// Whether to only match on whole words.    pub whole_word: bool,    /// Whether to match case sensitively.    pub case_sensitive: bool,    /// Whether to include gitignored files in search results.    pub include_ignored: bool,    /// Whether to interpret the search query as a regular expression.    pub regex: bool,    /// Whether to center the cursor on each search match when navigating.    pub center_on_match: bool,} impl EditorSettings {    pub fn jupyter_enabled(cx: &App) -> bool {        EditorSettings::get_global(cx).jupyter.enabled    }} impl ScrollbarVisibility for EditorSettings {    fn visibility(&self, _cx: &App) -> ShowScrollbar {        self.scrollbar.show    }} impl Settings for EditorSettings {    fn from_settings(content: &settings::SettingsContent) -> Self {        let editor = content.editor.clone();        let scrollbar = editor.scrollbar.unwrap();        let minimap = editor.minimap.unwrap();        let gutter = editor.gutter.unwrap();        let axes = scrollbar.axes.unwrap();        let toolbar = editor.toolbar.unwrap();        let search = editor.search.unwrap();        let drag_and_drop_selection = editor.drag_and_drop_selection.unwrap();        let sticky_scroll = editor.sticky_scroll.unwrap();        Self {            cursor_blink: editor.cursor_blink.unwrap(),            cursor_shape: editor.cursor_shape.map(Into::into),            current_line_highlight: editor.current_line_highlight.unwrap(),            selection_highlight: editor.selection_highlight.unwrap(),            rounded_selection: editor.rounded_selection.unwrap(),            lsp_highlight_debounce: editor.lsp_highlight_debounce.unwrap(),            hover_popover_enabled: editor.hover_popover_enabled.unwrap(),            hover_popover_delay: editor.hover_popover_delay.unwrap(),            toolbar: Toolbar {                breadcrumbs: toolbar.breadcrumbs.unwrap(),                quick_actions: toolbar.quick_actions.unwrap(),                selections_menu: toolbar.selections_menu.unwrap(),                agent_review: toolbar.agent_review.unwrap(),                code_actions: toolbar.code_actions.unwrap(),            },            scrollbar: Scrollbar {                show: scrollbar.show.map(Into::into).unwrap(),                git_diff: scrollbar.git_diff.unwrap()                    && content                        .git                        .as_ref()                        .unwrap()                        .enabled                        .unwrap()                        .is_git_diff_enabled(),                selected_text: scrollbar.selected_text.unwrap(),                selected_symbol: scrollbar.selected_symbol.unwrap(),                search_results: scrollbar.search_results.unwrap(),                diagnostics: scrollbar.diagnostics.unwrap(),                cursors: scrollbar.cursors.unwrap(),                axes: ScrollbarAxes {                    horizontal: axes.horizontal.unwrap(),                    vertical: axes.vertical.unwrap(),                },            },            minimap: Minimap {                show: minimap.show.unwrap(),                display_in: minimap.display_in.unwrap(),                thumb: minimap.thumb.unwrap(),                thumb_border: minimap.thumb_border.unwrap(),                current_line_highlight: minimap.current_line_highlight,                max_width_columns: minimap.max_width_columns.unwrap(),            },            gutter: Gutter {                min_line_number_digits: gutter.min_line_number_digits.unwrap(),                line_numbers: gutter.line_numbers.unwrap(),                runnables: gutter.runnables.unwrap(),                breakpoints: gutter.breakpoints.unwrap(),                folds: gutter.folds.unwrap(),            },            scroll_beyond_last_line: editor.scroll_beyond_last_line.unwrap(),            vertical_scroll_margin: editor.vertical_scroll_margin.unwrap() as f64,            autoscroll_on_clicks: editor.autoscroll_on_clicks.unwrap(),            horizontal_scroll_margin: editor.horizontal_scroll_margin.unwrap(),            scroll_sensitivity: editor.scroll_sensitivity.unwrap(),            fast_scroll_sensitivity: editor.fast_scroll_sensitivity.unwrap(),            sticky_scroll: StickyScroll {                enabled: sticky_scroll.enabled.unwrap(),            },            relative_line_numbers: editor.relative_line_numbers.unwrap(),            seed_search_query_from_cursor: editor.seed_search_query_from_cursor.unwrap(),            use_smartcase_search: editor.use_smartcase_search.unwrap(),            multi_cursor_modifier: editor.multi_cursor_modifier.unwrap(),            redact_private_values: editor.redact_private_values.unwrap(),            expand_excerpt_lines: editor.expand_excerpt_lines.unwrap(),            excerpt_context_lines: editor.excerpt_context_lines.unwrap(),            middle_click_paste: editor.middle_click_paste.unwrap(),            double_click_in_multibuffer: editor.double_click_in_multibuffer.unwrap(),            search_wrap: editor.search_wrap.unwrap(),            search: SearchSettings {                button: search.button.unwrap(),                whole_word: search.whole_word.unwrap(),                case_sensitive: search.case_sensitive.unwrap(),                include_ignored: search.include_ignored.unwrap(),                regex: search.regex.unwrap(),                center_on_match: search.center_on_match.unwrap(),            },            auto_signature_help: editor.auto_signature_help.unwrap(),            show_signature_help_after_edits: editor.show_signature_help_after_edits.unwrap(),            go_to_definition_fallback: editor.go_to_definition_fallback.unwrap(),            jupyter: Jupyter {                enabled: editor.jupyter.unwrap().enabled.unwrap(),            },            hide_mouse: editor.hide_mouse,            snippet_sort_order: editor.snippet_sort_order.unwrap(),            diagnostics_max_severity: editor.diagnostics_max_severity.map(Into::into),            inline_code_actions: editor.inline_code_actions.unwrap(),            drag_and_drop_selection: DragAndDropSelection {                enabled: drag_and_drop_selection.enabled.unwrap(),                delay: drag_and_drop_selection.delay.unwrap(),            },            lsp_document_colors: editor.lsp_document_colors.unwrap(),            minimum_contrast_for_highlights: editor.minimum_contrast_for_highlights.unwrap().0,            completion_menu_scrollbar: editor.completion_menu_scrollbar.map(Into::into).unwrap(),            completion_detail_alignment: editor.completion_detail_alignment.unwrap(),            diff_view_style: editor.diff_view_style.unwrap(),        }    }}