workspace.rs

  1use std::num::NonZeroUsize;
  2
  3use collections::HashMap;
  4use schemars::JsonSchema;
  5use serde::{Deserialize, Serialize};
  6use settings_macros::{MergeFrom, with_fallible_options};
  7
  8use crate::{
  9    CenteredPaddingSettings, DelayMs, DockPosition, DockSide, InactiveOpacity, ShowIndentGuides,
 10    ShowScrollbar, serialize_optional_f32_with_two_decimal_places,
 11};
 12
 13#[with_fallible_options]
 14#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
 15pub struct WorkspaceSettingsContent {
 16    /// Active pane styling settings.
 17    pub active_pane_modifiers: Option<ActivePaneModifiers>,
 18    /// The text rendering mode to use.
 19    ///
 20    /// Default: platform_default
 21    pub text_rendering_mode: Option<TextRenderingMode>,
 22    /// Layout mode for the bottom dock
 23    ///
 24    /// Default: contained
 25    pub bottom_dock_layout: Option<BottomDockLayout>,
 26    /// Direction to split horizontally.
 27    ///
 28    /// Default: "up"
 29    pub pane_split_direction_horizontal: Option<PaneSplitDirectionHorizontal>,
 30    /// Direction to split vertically.
 31    ///
 32    /// Default: "left"
 33    pub pane_split_direction_vertical: Option<PaneSplitDirectionVertical>,
 34    /// Centered layout related settings.
 35    pub centered_layout: Option<CenteredLayoutSettings>,
 36    /// Whether or not to prompt the user to confirm before closing the application.
 37    ///
 38    /// Default: false
 39    pub confirm_quit: Option<bool>,
 40    /// Whether or not to show the call status icon in the status bar.
 41    ///
 42    /// Default: true
 43    pub show_call_status_icon: Option<bool>,
 44    /// When to automatically save edited buffers.
 45    ///
 46    /// Default: off
 47    pub autosave: Option<AutosaveSetting>,
 48    /// Controls previous session restoration in freshly launched Zed instance.
 49    /// Values: empty_tab, last_workspace, last_session, launchpad
 50    /// Default: last_session
 51    pub restore_on_startup: Option<RestoreOnStartupBehavior>,
 52    /// Whether to attempt to restore previous file's state when opening it again.
 53    /// The state is stored per pane.
 54    /// When disabled, defaults are applied instead of the state restoration.
 55    ///
 56    /// E.g. for editors, selections, folds and scroll positions are restored, if the same file is closed and, later, opened again in the same pane.
 57    /// When disabled, a single selection in the very beginning of the file, zero scroll position and no folds state is used as a default.
 58    ///
 59    /// Default: true
 60    pub restore_on_file_reopen: Option<bool>,
 61    /// The size of the workspace split drop targets on the outer edges.
 62    /// Given as a fraction that will be multiplied by the smaller dimension of the workspace.
 63    ///
 64    /// Default: `0.2` (20% of the smaller dimension of the workspace)
 65    #[serde(serialize_with = "serialize_optional_f32_with_two_decimal_places")]
 66    pub drop_target_size: Option<f32>,
 67    /// Whether to close the window when using 'close active item' on a workspace with no tabs
 68    ///
 69    /// Default: auto ("on" on macOS, "off" otherwise)
 70    pub when_closing_with_no_tabs: Option<CloseWindowWhenNoItems>,
 71    /// Whether to use the system provided dialogs for Open and Save As.
 72    /// When set to false, Zed will use the built-in keyboard-first pickers.
 73    ///
 74    /// Default: true
 75    pub use_system_path_prompts: Option<bool>,
 76    /// Whether to use the system provided prompts.
 77    /// When set to false, Zed will use the built-in prompts.
 78    /// Note that this setting has no effect on Linux, where Zed will always
 79    /// use the built-in prompts.
 80    ///
 81    /// Default: true
 82    pub use_system_prompts: Option<bool>,
 83    /// Aliases for the command palette. When you type a key in this map,
 84    /// it will be assumed to equal the value.
 85    ///
 86    /// Default: true
 87    #[serde(default)]
 88    pub command_aliases: HashMap<String, String>,
 89    /// Maximum open tabs in a pane. Will not close an unsaved
 90    /// tab. Set to `None` for unlimited tabs.
 91    ///
 92    /// Default: none
 93    pub max_tabs: Option<NonZeroUsize>,
 94    /// What to do when the last window is closed
 95    ///
 96    /// Default: auto (nothing on macOS, "app quit" otherwise)
 97    pub on_last_window_closed: Option<OnLastWindowClosed>,
 98    /// Whether to resize all the panels in a dock when resizing the dock.
 99    ///
100    /// Default: ["left"]
101    pub resize_all_panels_in_dock: Option<Vec<DockPosition>>,
102    /// Whether to automatically close files that have been deleted on disk.
103    ///
104    /// Default: false
105    pub close_on_file_delete: Option<bool>,
106    /// Whether to allow windows to tab together based on the user’s tabbing preference (macOS only).
107    ///
108    /// Default: false
109    pub use_system_window_tabs: Option<bool>,
110    /// Whether to show padding for zoomed panels.
111    /// When enabled, zoomed bottom panels will have some top padding,
112    /// while zoomed left/right panels will have padding to the right/left (respectively).
113    ///
114    /// Default: true
115    pub zoomed_padding: Option<bool>,
116    /// Whether toggling a panel (e.g. with its keyboard shortcut) also closes
117    /// the panel when it is already focused, instead of just moving focus back
118    /// to the editor.
119    ///
120    /// Default: false
121    pub close_panel_on_toggle: Option<bool>,
122    /// What draws window decorations/titlebar, the client application (Zed) or display server
123    /// Default: client
124    pub window_decorations: Option<WindowDecorations>,
125}
126
127#[with_fallible_options]
128#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]
129pub struct ItemSettingsContent {
130    /// Whether to show the Git file status on a tab item.
131    ///
132    /// Default: false
133    pub git_status: Option<bool>,
134    /// Position of the close button in a tab.
135    ///
136    /// Default: right
137    pub close_position: Option<ClosePosition>,
138    /// Whether to show the file icon for a tab.
139    ///
140    /// Default: false
141    pub file_icons: Option<bool>,
142    /// What to do after closing the current tab.
143    ///
144    /// Default: history
145    pub activate_on_close: Option<ActivateOnClose>,
146    /// Which files containing diagnostic errors/warnings to mark in the tabs.
147    /// This setting can take the following three values:
148    ///
149    /// Default: off
150    pub show_diagnostics: Option<ShowDiagnostics>,
151    /// Whether to always show the close button on tabs.
152    ///
153    /// Default: false
154    pub show_close_button: Option<ShowCloseButton>,
155}
156
157#[with_fallible_options]
158#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]
159pub struct PreviewTabsSettingsContent {
160    /// Whether to show opened editors as preview tabs.
161    /// Preview tabs do not stay open, are reused until explicitly set to be kept open opened (via double-click or editing) and show file names in italic.
162    ///
163    /// Default: true
164    pub enabled: Option<bool>,
165    /// Whether to open tabs in preview mode when opened from the project panel with a single click.
166    ///
167    /// Default: true
168    pub enable_preview_from_project_panel: Option<bool>,
169    /// Whether to open tabs in preview mode when selected from the file finder.
170    ///
171    /// Default: false
172    pub enable_preview_from_file_finder: Option<bool>,
173    /// Whether to open tabs in preview mode when opened from a multibuffer.
174    ///
175    /// Default: true
176    pub enable_preview_from_multibuffer: Option<bool>,
177    /// Whether to open tabs in preview mode when code navigation is used to open a multibuffer.
178    ///
179    /// Default: false
180    pub enable_preview_multibuffer_from_code_navigation: Option<bool>,
181    /// Whether to open tabs in preview mode when code navigation is used to open a single file.
182    ///
183    /// Default: true
184    pub enable_preview_file_from_code_navigation: Option<bool>,
185    /// Whether to keep tabs in preview mode when code navigation is used to navigate away from them.
186    /// If `enable_preview_file_from_code_navigation` or `enable_preview_multibuffer_from_code_navigation` is also true, the new tab may replace the existing one.
187    ///
188    /// Default: false
189    pub enable_keep_preview_on_code_navigation: Option<bool>,
190}
191
192#[derive(
193    Copy,
194    Clone,
195    Debug,
196    PartialEq,
197    Default,
198    Serialize,
199    Deserialize,
200    JsonSchema,
201    MergeFrom,
202    strum::VariantArray,
203    strum::VariantNames,
204)]
205#[serde(rename_all = "lowercase")]
206pub enum ClosePosition {
207    Left,
208    #[default]
209    Right,
210}
211
212#[derive(
213    Copy,
214    Clone,
215    Debug,
216    PartialEq,
217    Default,
218    Serialize,
219    Deserialize,
220    JsonSchema,
221    MergeFrom,
222    strum::VariantArray,
223    strum::VariantNames,
224)]
225#[serde(rename_all = "lowercase")]
226pub enum ShowCloseButton {
227    Always,
228    #[default]
229    Hover,
230    Hidden,
231}
232
233#[derive(
234    Copy,
235    Clone,
236    Debug,
237    Default,
238    Serialize,
239    Deserialize,
240    JsonSchema,
241    MergeFrom,
242    PartialEq,
243    Eq,
244    strum::VariantArray,
245    strum::VariantNames,
246)]
247#[serde(rename_all = "snake_case")]
248pub enum ShowDiagnostics {
249    #[default]
250    Off,
251    Errors,
252    All,
253}
254
255#[derive(
256    Copy,
257    Clone,
258    Debug,
259    PartialEq,
260    Default,
261    Serialize,
262    Deserialize,
263    JsonSchema,
264    MergeFrom,
265    strum::VariantArray,
266    strum::VariantNames,
267)]
268#[serde(rename_all = "snake_case")]
269pub enum ActivateOnClose {
270    #[default]
271    History,
272    Neighbour,
273    LeftNeighbour,
274}
275
276#[with_fallible_options]
277#[derive(Copy, Clone, PartialEq, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
278#[serde(rename_all = "snake_case")]
279pub struct ActivePaneModifiers {
280    /// Size of the border surrounding the active pane.
281    /// When set to 0, the active pane doesn't have any border.
282    /// The border is drawn inset.
283    ///
284    /// Default: `0.0`
285    #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")]
286    pub border_size: Option<f32>,
287    /// Opacity of inactive panels.
288    /// When set to 1.0, the inactive panes have the same opacity as the active one.
289    /// If set to 0, the inactive panes content will not be visible at all.
290    /// Values are clamped to the [0.0, 1.0] range.
291    ///
292    /// Default: `1.0`
293    #[schemars(range(min = 0.0, max = 1.0))]
294    pub inactive_opacity: Option<InactiveOpacity>,
295}
296
297#[derive(
298    Copy,
299    Clone,
300    Debug,
301    Default,
302    Serialize,
303    Deserialize,
304    PartialEq,
305    JsonSchema,
306    MergeFrom,
307    strum::VariantArray,
308    strum::VariantNames,
309)]
310#[serde(rename_all = "snake_case")]
311pub enum BottomDockLayout {
312    /// Contained between the left and right docks
313    #[default]
314    Contained,
315    /// Takes up the full width of the window
316    Full,
317    /// Extends under the left dock while snapping to the right dock
318    LeftAligned,
319    /// Extends under the right dock while snapping to the left dock
320    RightAligned,
321}
322
323#[derive(
324    Copy,
325    Clone,
326    Default,
327    Debug,
328    Serialize,
329    Deserialize,
330    PartialEq,
331    JsonSchema,
332    MergeFrom,
333    strum::VariantArray,
334    strum::VariantNames,
335)]
336#[serde(rename_all = "snake_case")]
337pub enum WindowDecorations {
338    /// Zed draws its own window decorations/titlebar (client-side decoration)
339    #[default]
340    Client,
341    /// Show system's window titlebar (server-side decoration; not supported by GNOME Wayland)
342    Server,
343}
344
345#[derive(
346    Copy,
347    Clone,
348    PartialEq,
349    Default,
350    Serialize,
351    Deserialize,
352    JsonSchema,
353    MergeFrom,
354    Debug,
355    strum::VariantArray,
356    strum::VariantNames,
357)]
358#[serde(rename_all = "snake_case")]
359pub enum CloseWindowWhenNoItems {
360    /// Match platform conventions by default, so "on" on macOS and "off" everywhere else
361    #[default]
362    PlatformDefault,
363    /// Close the window when there are no tabs
364    CloseWindow,
365    /// Leave the window open when there are no tabs
366    KeepWindowOpen,
367}
368
369impl CloseWindowWhenNoItems {
370    pub fn should_close(&self) -> bool {
371        match self {
372            CloseWindowWhenNoItems::PlatformDefault => cfg!(target_os = "macos"),
373            CloseWindowWhenNoItems::CloseWindow => true,
374            CloseWindowWhenNoItems::KeepWindowOpen => false,
375        }
376    }
377}
378
379#[derive(
380    Copy,
381    Clone,
382    PartialEq,
383    Eq,
384    Default,
385    Serialize,
386    Deserialize,
387    JsonSchema,
388    MergeFrom,
389    Debug,
390    strum::VariantArray,
391    strum::VariantNames,
392)]
393#[serde(rename_all = "snake_case")]
394pub enum RestoreOnStartupBehavior {
395    /// Always start with an empty editor tab
396    #[serde(alias = "none")]
397    EmptyTab,
398    /// Restore the workspace that was closed last.
399    LastWorkspace,
400    /// Restore all workspaces that were open when quitting Zed.
401    #[default]
402    LastSession,
403    /// Show the launchpad with recent projects (no tabs).
404    Launchpad,
405}
406
407#[with_fallible_options]
408#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq)]
409pub struct TabBarSettingsContent {
410    /// Whether or not to show the tab bar in the editor.
411    ///
412    /// Default: true
413    pub show: Option<bool>,
414    /// Whether or not to show the navigation history buttons in the tab bar.
415    ///
416    /// Default: true
417    pub show_nav_history_buttons: Option<bool>,
418    /// Whether or not to show the tab bar buttons.
419    ///
420    /// Default: true
421    pub show_tab_bar_buttons: Option<bool>,
422    /// Whether or not to show pinned tabs in a separate row.
423    /// When enabled, pinned tabs appear in a top row and unpinned tabs in a bottom row.
424    ///
425    /// Default: false
426    pub show_pinned_tabs_in_separate_row: Option<bool>,
427}
428
429#[with_fallible_options]
430#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq, Eq)]
431pub struct StatusBarSettingsContent {
432    /// Whether to show the status bar.
433    ///
434    /// Default: true
435    #[serde(rename = "experimental.show")]
436    pub show: Option<bool>,
437    /// Whether to display the active language button in the status bar.
438    ///
439    /// Default: true
440    pub active_language_button: Option<bool>,
441    /// Whether to show the cursor position button in the status bar.
442    ///
443    /// Default: true
444    pub cursor_position_button: Option<bool>,
445    /// Whether to show active line endings button in the status bar.
446    ///
447    /// Default: false
448    pub line_endings_button: Option<bool>,
449    /// Whether to show the active encoding button in the status bar.
450    ///
451    /// Default: non_utf8
452    pub active_encoding_button: Option<EncodingDisplayOptions>,
453}
454
455#[derive(
456    Copy,
457    Clone,
458    Debug,
459    Eq,
460    PartialEq,
461    Default,
462    Serialize,
463    Deserialize,
464    JsonSchema,
465    MergeFrom,
466    strum::VariantNames,
467    strum::VariantArray,
468)]
469#[serde(rename_all = "snake_case")]
470pub enum EncodingDisplayOptions {
471    Enabled,
472    Disabled,
473    #[default]
474    NonUtf8,
475}
476impl EncodingDisplayOptions {
477    pub fn should_show(&self, is_utf8: bool, has_bom: bool) -> bool {
478        match self {
479            Self::Disabled => false,
480            Self::Enabled => true,
481            Self::NonUtf8 => {
482                let is_standard_utf8 = is_utf8 && !has_bom;
483                !is_standard_utf8
484            }
485        }
486    }
487}
488
489#[derive(
490    Copy,
491    Clone,
492    Debug,
493    Serialize,
494    Deserialize,
495    PartialEq,
496    Eq,
497    JsonSchema,
498    MergeFrom,
499    strum::EnumDiscriminants,
500)]
501#[strum_discriminants(derive(strum::VariantArray, strum::VariantNames, strum::FromRepr))]
502#[serde(rename_all = "snake_case")]
503pub enum AutosaveSetting {
504    /// Disable autosave.
505    Off,
506    /// Save after inactivity period of `milliseconds`.
507    AfterDelay { milliseconds: DelayMs },
508    /// Autosave when focus changes.
509    OnFocusChange,
510    /// Autosave when the active window changes.
511    OnWindowChange,
512}
513
514impl AutosaveSetting {
515    pub fn should_save_on_close(&self) -> bool {
516        matches!(
517            &self,
518            AutosaveSetting::OnFocusChange
519                | AutosaveSetting::OnWindowChange
520                | AutosaveSetting::AfterDelay { .. }
521        )
522    }
523}
524
525#[derive(
526    Copy,
527    Clone,
528    Debug,
529    Serialize,
530    Deserialize,
531    PartialEq,
532    Eq,
533    JsonSchema,
534    MergeFrom,
535    strum::VariantArray,
536    strum::VariantNames,
537)]
538#[serde(rename_all = "snake_case")]
539pub enum PaneSplitDirectionHorizontal {
540    Up,
541    Down,
542}
543
544#[derive(
545    Copy,
546    Clone,
547    Debug,
548    Serialize,
549    Deserialize,
550    PartialEq,
551    Eq,
552    JsonSchema,
553    MergeFrom,
554    strum::VariantArray,
555    strum::VariantNames,
556)]
557#[serde(rename_all = "snake_case")]
558pub enum PaneSplitDirectionVertical {
559    Left,
560    Right,
561}
562
563#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Default)]
564#[serde(rename_all = "snake_case")]
565#[with_fallible_options]
566pub struct CenteredLayoutSettings {
567    /// The relative width of the left padding of the central pane from the
568    /// workspace when the centered layout is used.
569    ///
570    /// Default: 0.2
571    pub left_padding: Option<CenteredPaddingSettings>,
572    // The relative width of the right padding of the central pane from the
573    // workspace when the centered layout is used.
574    ///
575    /// Default: 0.2
576    pub right_padding: Option<CenteredPaddingSettings>,
577}
578
579#[derive(
580    Copy,
581    Clone,
582    Default,
583    Serialize,
584    Deserialize,
585    JsonSchema,
586    MergeFrom,
587    PartialEq,
588    Debug,
589    strum::VariantArray,
590    strum::VariantNames,
591)]
592#[serde(rename_all = "snake_case")]
593pub enum OnLastWindowClosed {
594    /// Match platform conventions by default, so don't quit on macOS, and quit on other platforms
595    #[default]
596    PlatformDefault,
597    /// Quit the application the last window is closed
598    QuitApp,
599}
600
601#[derive(
602    Copy,
603    Clone,
604    Default,
605    Serialize,
606    Deserialize,
607    JsonSchema,
608    MergeFrom,
609    PartialEq,
610    Eq,
611    Debug,
612    strum::VariantArray,
613    strum::VariantNames,
614)]
615#[serde(rename_all = "snake_case")]
616pub enum TextRenderingMode {
617    /// Use platform default behavior.
618    #[default]
619    PlatformDefault,
620    /// Use subpixel (ClearType-style) text rendering.
621    Subpixel,
622    /// Use grayscale text rendering.
623    Grayscale,
624}
625
626impl OnLastWindowClosed {
627    pub fn is_quit_app(&self) -> bool {
628        match self {
629            OnLastWindowClosed::PlatformDefault => false,
630            OnLastWindowClosed::QuitApp => true,
631        }
632    }
633}
634
635#[with_fallible_options]
636#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)]
637pub struct ProjectPanelAutoOpenSettings {
638    /// Whether to automatically open newly created files in the editor.
639    ///
640    /// Default: true
641    pub on_create: Option<bool>,
642    /// Whether to automatically open files after pasting or duplicating them.
643    ///
644    /// Default: true
645    pub on_paste: Option<bool>,
646    /// Whether to automatically open files dropped from external sources.
647    ///
648    /// Default: true
649    pub on_drop: Option<bool>,
650}
651
652#[with_fallible_options]
653#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)]
654pub struct ProjectPanelSettingsContent {
655    /// Whether to show the project panel button in the status bar.
656    ///
657    /// Default: true
658    pub button: Option<bool>,
659    /// Whether to hide gitignore files in the project panel.
660    ///
661    /// Default: false
662    pub hide_gitignore: Option<bool>,
663    /// Customize default width (in pixels) taken by project panel
664    ///
665    /// Default: 240
666    #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")]
667    pub default_width: Option<f32>,
668    /// The position of project panel
669    ///
670    /// Default: left
671    pub dock: Option<DockSide>,
672    /// Spacing between worktree entries in the project panel.
673    ///
674    /// Default: comfortable
675    pub entry_spacing: Option<ProjectPanelEntrySpacing>,
676    /// Whether to show file icons in the project panel.
677    ///
678    /// Default: true
679    pub file_icons: Option<bool>,
680    /// Whether to show folder icons or chevrons for directories in the project panel.
681    ///
682    /// Default: true
683    pub folder_icons: Option<bool>,
684    /// Whether to show the git status in the project panel.
685    ///
686    /// Default: true
687    pub git_status: Option<bool>,
688    /// Amount of indentation (in pixels) for nested items.
689    ///
690    /// Default: 20
691    #[serde(serialize_with = "serialize_optional_f32_with_two_decimal_places")]
692    pub indent_size: Option<f32>,
693    /// Whether to reveal it in the project panel automatically,
694    /// when a corresponding project entry becomes active.
695    /// Gitignored entries are never auto revealed.
696    ///
697    /// Default: true
698    pub auto_reveal_entries: Option<bool>,
699    /// Whether to fold directories automatically
700    /// when directory has only one directory inside.
701    ///
702    /// Default: true
703    pub auto_fold_dirs: Option<bool>,
704    /// Whether to show folder names with bold text in the project panel.
705    ///
706    /// Default: false
707    pub bold_folder_labels: Option<bool>,
708    /// Whether the project panel should open on startup.
709    ///
710    /// Default: true
711    pub starts_open: Option<bool>,
712    /// Scrollbar-related settings
713    pub scrollbar: Option<ProjectPanelScrollbarSettingsContent>,
714    /// Which files containing diagnostic errors/warnings to mark in the project panel.
715    ///
716    /// Default: all
717    pub show_diagnostics: Option<ShowDiagnostics>,
718    /// Settings related to indent guides in the project panel.
719    pub indent_guides: Option<ProjectPanelIndentGuidesSettings>,
720    /// Whether to hide the root entry when only one folder is open in the window.
721    ///
722    /// Default: false
723    pub hide_root: Option<bool>,
724    /// Whether to hide the hidden entries in the project panel.
725    ///
726    /// Default: false
727    pub hide_hidden: Option<bool>,
728    /// Whether to stick parent directories at top of the project panel.
729    ///
730    /// Default: true
731    pub sticky_scroll: Option<bool>,
732    /// Whether to enable drag-and-drop operations in the project panel.
733    ///
734    /// Default: true
735    pub drag_and_drop: Option<bool>,
736    /// Settings for automatically opening files.
737    pub auto_open: Option<ProjectPanelAutoOpenSettings>,
738    /// How to order sibling entries in the project panel.
739    ///
740    /// Default: directories_first
741    pub sort_mode: Option<ProjectPanelSortMode>,
742    /// Whether to show error and warning count badges next to file names in the project panel.
743    ///
744    /// Default: false
745    pub diagnostic_badges: Option<bool>,
746    /// Whether to show a git status indicator next to file names in the project panel.
747    ///
748    /// Default: false
749    pub git_status_indicator: Option<bool>,
750}
751
752#[derive(
753    Copy,
754    Clone,
755    Debug,
756    Default,
757    Serialize,
758    Deserialize,
759    JsonSchema,
760    MergeFrom,
761    PartialEq,
762    Eq,
763    strum::VariantArray,
764    strum::VariantNames,
765)]
766#[serde(rename_all = "snake_case")]
767pub enum ProjectPanelEntrySpacing {
768    /// Comfortable spacing of entries.
769    #[default]
770    Comfortable,
771    /// The standard spacing of entries.
772    Standard,
773}
774
775#[derive(
776    Copy,
777    Clone,
778    Debug,
779    Default,
780    Serialize,
781    Deserialize,
782    JsonSchema,
783    MergeFrom,
784    PartialEq,
785    Eq,
786    strum::VariantArray,
787    strum::VariantNames,
788)]
789#[serde(rename_all = "snake_case")]
790pub enum ProjectPanelSortMode {
791    /// Show directories first, then files
792    #[default]
793    DirectoriesFirst,
794    /// Mix directories and files together
795    Mixed,
796    /// Show files first, then directories
797    FilesFirst,
798}
799
800#[with_fallible_options]
801#[derive(
802    Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, Default,
803)]
804pub struct ProjectPanelScrollbarSettingsContent {
805    /// When to show the scrollbar in the project panel.
806    ///
807    /// Default: inherits editor scrollbar settings
808    pub show: Option<ShowScrollbar>,
809    /// Whether to allow horizontal scrolling in the project panel.
810    /// When false, the view is locked to the leftmost position and
811    /// long file names are clipped.
812    ///
813    /// Default: true
814    pub horizontal_scroll: Option<bool>,
815}
816
817#[with_fallible_options]
818#[derive(
819    Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, Default,
820)]
821pub struct ProjectPanelIndentGuidesSettings {
822    pub show: Option<ShowIndentGuides>,
823}
824
825/// Controls how semantic tokens from language servers are used for syntax highlighting.
826#[derive(
827    Debug,
828    PartialEq,
829    Eq,
830    Clone,
831    Copy,
832    Default,
833    Serialize,
834    Deserialize,
835    JsonSchema,
836    MergeFrom,
837    strum::VariantArray,
838    strum::VariantNames,
839    strum::EnumMessage,
840)]
841#[serde(rename_all = "snake_case")]
842pub enum SemanticTokens {
843    /// Do not request semantic tokens from language servers.
844    #[default]
845    Off,
846    /// Use LSP semantic tokens together with tree-sitter highlighting.
847    Combined,
848    /// Use LSP semantic tokens exclusively, replacing tree-sitter highlighting.
849    Full,
850}
851
852impl SemanticTokens {
853    /// Returns true if semantic tokens should be requested from language servers.
854    pub fn enabled(&self) -> bool {
855        self != &Self::Off
856    }
857
858    /// Returns true if tree-sitter syntax highlighting should be used.
859    /// In `full` mode, tree-sitter is disabled in favor of LSP semantic tokens.
860    pub fn use_tree_sitter(&self) -> bool {
861        self != &Self::Full
862    }
863}
864
865#[derive(
866    Debug,
867    PartialEq,
868    Eq,
869    Clone,
870    Copy,
871    Default,
872    Serialize,
873    Deserialize,
874    JsonSchema,
875    MergeFrom,
876    strum::VariantArray,
877    strum::VariantNames,
878)]
879#[serde(rename_all = "snake_case")]
880pub enum DocumentFoldingRanges {
881    /// Do not request folding ranges from language servers; use tree-sitter and indent-based folding.
882    #[default]
883    Off,
884    /// Use LSP folding wherever possible, falling back to tree-sitter and indent-based folding when no results were returned by the server.
885    On,
886}
887
888impl DocumentFoldingRanges {
889    /// Returns true if LSP folding ranges should be requested from language servers.
890    pub fn enabled(&self) -> bool {
891        self != &Self::Off
892    }
893}
894
895#[derive(
896    Debug,
897    PartialEq,
898    Eq,
899    Clone,
900    Copy,
901    Default,
902    Serialize,
903    Deserialize,
904    JsonSchema,
905    MergeFrom,
906    strum::VariantArray,
907    strum::VariantNames,
908)]
909#[serde(rename_all = "snake_case")]
910pub enum DocumentSymbols {
911    /// Use tree-sitter queries to compute document symbols for outlines and breadcrumbs (default).
912    #[default]
913    #[serde(alias = "tree_sitter")]
914    Off,
915    /// Use the language server's `textDocument/documentSymbol` LSP response for outlines and
916    /// breadcrumbs. When enabled, tree-sitter is not used for document symbols.
917    #[serde(alias = "language_server")]
918    On,
919}
920
921impl DocumentSymbols {
922    /// Returns true if LSP document symbols should be used instead of tree-sitter.
923    pub fn lsp_enabled(&self) -> bool {
924        self == &Self::On
925    }
926}