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,
 10    ScrollbarSettingsContent, ShowIndentGuides, 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    /// What draws window decorations/titlebar, the client application (Zed) or display server
117    /// Default: client
118    pub window_decorations: Option<WindowDecorations>,
119}
120
121#[with_fallible_options]
122#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]
123pub struct ItemSettingsContent {
124    /// Whether to show the Git file status on a tab item.
125    ///
126    /// Default: false
127    pub git_status: Option<bool>,
128    /// Position of the close button in a tab.
129    ///
130    /// Default: right
131    pub close_position: Option<ClosePosition>,
132    /// Whether to show the file icon for a tab.
133    ///
134    /// Default: false
135    pub file_icons: Option<bool>,
136    /// What to do after closing the current tab.
137    ///
138    /// Default: history
139    pub activate_on_close: Option<ActivateOnClose>,
140    /// Which files containing diagnostic errors/warnings to mark in the tabs.
141    /// This setting can take the following three values:
142    ///
143    /// Default: off
144    pub show_diagnostics: Option<ShowDiagnostics>,
145    /// Whether to always show the close button on tabs.
146    ///
147    /// Default: false
148    pub show_close_button: Option<ShowCloseButton>,
149}
150
151#[with_fallible_options]
152#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]
153pub struct PreviewTabsSettingsContent {
154    /// Whether to show opened editors as preview tabs.
155    /// 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.
156    ///
157    /// Default: true
158    pub enabled: Option<bool>,
159    /// Whether to open tabs in preview mode when opened from the project panel with a single click.
160    ///
161    /// Default: true
162    pub enable_preview_from_project_panel: Option<bool>,
163    /// Whether to open tabs in preview mode when selected from the file finder.
164    ///
165    /// Default: false
166    pub enable_preview_from_file_finder: Option<bool>,
167    /// Whether to open tabs in preview mode when opened from a multibuffer.
168    ///
169    /// Default: true
170    pub enable_preview_from_multibuffer: Option<bool>,
171    /// Whether to open tabs in preview mode when code navigation is used to open a multibuffer.
172    ///
173    /// Default: false
174    pub enable_preview_multibuffer_from_code_navigation: Option<bool>,
175    /// Whether to open tabs in preview mode when code navigation is used to open a single file.
176    ///
177    /// Default: true
178    pub enable_preview_file_from_code_navigation: Option<bool>,
179    /// Whether to keep tabs in preview mode when code navigation is used to navigate away from them.
180    /// 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.
181    ///
182    /// Default: false
183    pub enable_keep_preview_on_code_navigation: Option<bool>,
184}
185
186#[derive(
187    Copy,
188    Clone,
189    Debug,
190    PartialEq,
191    Default,
192    Serialize,
193    Deserialize,
194    JsonSchema,
195    MergeFrom,
196    strum::VariantArray,
197    strum::VariantNames,
198)]
199#[serde(rename_all = "lowercase")]
200pub enum ClosePosition {
201    Left,
202    #[default]
203    Right,
204}
205
206#[derive(
207    Copy,
208    Clone,
209    Debug,
210    PartialEq,
211    Default,
212    Serialize,
213    Deserialize,
214    JsonSchema,
215    MergeFrom,
216    strum::VariantArray,
217    strum::VariantNames,
218)]
219#[serde(rename_all = "lowercase")]
220pub enum ShowCloseButton {
221    Always,
222    #[default]
223    Hover,
224    Hidden,
225}
226
227#[derive(
228    Copy,
229    Clone,
230    Debug,
231    Default,
232    Serialize,
233    Deserialize,
234    JsonSchema,
235    MergeFrom,
236    PartialEq,
237    Eq,
238    strum::VariantArray,
239    strum::VariantNames,
240)]
241#[serde(rename_all = "snake_case")]
242pub enum ShowDiagnostics {
243    #[default]
244    Off,
245    Errors,
246    All,
247}
248
249#[derive(
250    Copy,
251    Clone,
252    Debug,
253    PartialEq,
254    Default,
255    Serialize,
256    Deserialize,
257    JsonSchema,
258    MergeFrom,
259    strum::VariantArray,
260    strum::VariantNames,
261)]
262#[serde(rename_all = "snake_case")]
263pub enum ActivateOnClose {
264    #[default]
265    History,
266    Neighbour,
267    LeftNeighbour,
268}
269
270#[with_fallible_options]
271#[derive(Copy, Clone, PartialEq, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
272#[serde(rename_all = "snake_case")]
273pub struct ActivePaneModifiers {
274    /// Size of the border surrounding the active pane.
275    /// When set to 0, the active pane doesn't have any border.
276    /// The border is drawn inset.
277    ///
278    /// Default: `0.0`
279    #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")]
280    pub border_size: Option<f32>,
281    /// Opacity of inactive panels.
282    /// When set to 1.0, the inactive panes have the same opacity as the active one.
283    /// If set to 0, the inactive panes content will not be visible at all.
284    /// Values are clamped to the [0.0, 1.0] range.
285    ///
286    /// Default: `1.0`
287    #[schemars(range(min = 0.0, max = 1.0))]
288    pub inactive_opacity: Option<InactiveOpacity>,
289}
290
291#[derive(
292    Copy,
293    Clone,
294    Debug,
295    Default,
296    Serialize,
297    Deserialize,
298    PartialEq,
299    JsonSchema,
300    MergeFrom,
301    strum::VariantArray,
302    strum::VariantNames,
303)]
304#[serde(rename_all = "snake_case")]
305pub enum BottomDockLayout {
306    /// Contained between the left and right docks
307    #[default]
308    Contained,
309    /// Takes up the full width of the window
310    Full,
311    /// Extends under the left dock while snapping to the right dock
312    LeftAligned,
313    /// Extends under the right dock while snapping to the left dock
314    RightAligned,
315}
316
317#[derive(
318    Copy,
319    Clone,
320    Default,
321    Debug,
322    Serialize,
323    Deserialize,
324    PartialEq,
325    JsonSchema,
326    MergeFrom,
327    strum::VariantArray,
328    strum::VariantNames,
329)]
330#[serde(rename_all = "snake_case")]
331pub enum WindowDecorations {
332    /// Zed draws its own window decorations/titlebar (client-side decoration)
333    #[default]
334    Client,
335    /// Show system's window titlebar (server-side decoration; not supported by GNOME Wayland)
336    Server,
337}
338
339#[derive(
340    Copy,
341    Clone,
342    PartialEq,
343    Default,
344    Serialize,
345    Deserialize,
346    JsonSchema,
347    MergeFrom,
348    Debug,
349    strum::VariantArray,
350    strum::VariantNames,
351)]
352#[serde(rename_all = "snake_case")]
353pub enum CloseWindowWhenNoItems {
354    /// Match platform conventions by default, so "on" on macOS and "off" everywhere else
355    #[default]
356    PlatformDefault,
357    /// Close the window when there are no tabs
358    CloseWindow,
359    /// Leave the window open when there are no tabs
360    KeepWindowOpen,
361}
362
363impl CloseWindowWhenNoItems {
364    pub fn should_close(&self) -> bool {
365        match self {
366            CloseWindowWhenNoItems::PlatformDefault => cfg!(target_os = "macos"),
367            CloseWindowWhenNoItems::CloseWindow => true,
368            CloseWindowWhenNoItems::KeepWindowOpen => false,
369        }
370    }
371}
372
373#[derive(
374    Copy,
375    Clone,
376    PartialEq,
377    Eq,
378    Default,
379    Serialize,
380    Deserialize,
381    JsonSchema,
382    MergeFrom,
383    Debug,
384    strum::VariantArray,
385    strum::VariantNames,
386)]
387#[serde(rename_all = "snake_case")]
388pub enum RestoreOnStartupBehavior {
389    /// Always start with an empty editor tab
390    #[serde(alias = "none")]
391    EmptyTab,
392    /// Restore the workspace that was closed last.
393    LastWorkspace,
394    /// Restore all workspaces that were open when quitting Zed.
395    #[default]
396    LastSession,
397    /// Show the launchpad with recent projects (no tabs).
398    Launchpad,
399}
400
401#[with_fallible_options]
402#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq)]
403pub struct TabBarSettingsContent {
404    /// Whether or not to show the tab bar in the editor.
405    ///
406    /// Default: true
407    pub show: Option<bool>,
408    /// Whether or not to show the navigation history buttons in the tab bar.
409    ///
410    /// Default: true
411    pub show_nav_history_buttons: Option<bool>,
412    /// Whether or not to show the tab bar buttons.
413    ///
414    /// Default: true
415    pub show_tab_bar_buttons: Option<bool>,
416}
417
418#[with_fallible_options]
419#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug, PartialEq, Eq)]
420pub struct StatusBarSettingsContent {
421    /// Whether to show the status bar.
422    ///
423    /// Default: true
424    #[serde(rename = "experimental.show")]
425    pub show: Option<bool>,
426    /// Whether to display the active language button in the status bar.
427    ///
428    /// Default: true
429    pub active_language_button: Option<bool>,
430    /// Whether to show the cursor position button in the status bar.
431    ///
432    /// Default: true
433    pub cursor_position_button: Option<bool>,
434    /// Whether to show active line endings button in the status bar.
435    ///
436    /// Default: false
437    pub line_endings_button: Option<bool>,
438    /// Whether to show the active encoding button in the status bar.
439    ///
440    /// Default: non_utf8
441    pub active_encoding_button: Option<EncodingDisplayOptions>,
442}
443
444#[derive(
445    Copy,
446    Clone,
447    Debug,
448    Eq,
449    PartialEq,
450    Default,
451    Serialize,
452    Deserialize,
453    JsonSchema,
454    MergeFrom,
455    strum::VariantNames,
456    strum::VariantArray,
457)]
458#[serde(rename_all = "snake_case")]
459pub enum EncodingDisplayOptions {
460    Enabled,
461    Disabled,
462    #[default]
463    NonUtf8,
464}
465impl EncodingDisplayOptions {
466    pub fn should_show(&self, is_utf8: bool, has_bom: bool) -> bool {
467        match self {
468            Self::Disabled => false,
469            Self::Enabled => true,
470            Self::NonUtf8 => {
471                let is_standard_utf8 = is_utf8 && !has_bom;
472                !is_standard_utf8
473            }
474        }
475    }
476}
477
478#[derive(
479    Copy,
480    Clone,
481    Debug,
482    Serialize,
483    Deserialize,
484    PartialEq,
485    Eq,
486    JsonSchema,
487    MergeFrom,
488    strum::EnumDiscriminants,
489)]
490#[strum_discriminants(derive(strum::VariantArray, strum::VariantNames, strum::FromRepr))]
491#[serde(rename_all = "snake_case")]
492pub enum AutosaveSetting {
493    /// Disable autosave.
494    Off,
495    /// Save after inactivity period of `milliseconds`.
496    AfterDelay { milliseconds: DelayMs },
497    /// Autosave when focus changes.
498    OnFocusChange,
499    /// Autosave when the active window changes.
500    OnWindowChange,
501}
502
503impl AutosaveSetting {
504    pub fn should_save_on_close(&self) -> bool {
505        matches!(
506            &self,
507            AutosaveSetting::OnFocusChange
508                | AutosaveSetting::OnWindowChange
509                | AutosaveSetting::AfterDelay { .. }
510        )
511    }
512}
513
514#[derive(
515    Copy,
516    Clone,
517    Debug,
518    Serialize,
519    Deserialize,
520    PartialEq,
521    Eq,
522    JsonSchema,
523    MergeFrom,
524    strum::VariantArray,
525    strum::VariantNames,
526)]
527#[serde(rename_all = "snake_case")]
528pub enum PaneSplitDirectionHorizontal {
529    Up,
530    Down,
531}
532
533#[derive(
534    Copy,
535    Clone,
536    Debug,
537    Serialize,
538    Deserialize,
539    PartialEq,
540    Eq,
541    JsonSchema,
542    MergeFrom,
543    strum::VariantArray,
544    strum::VariantNames,
545)]
546#[serde(rename_all = "snake_case")]
547pub enum PaneSplitDirectionVertical {
548    Left,
549    Right,
550}
551
552#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Default)]
553#[serde(rename_all = "snake_case")]
554#[with_fallible_options]
555pub struct CenteredLayoutSettings {
556    /// The relative width of the left padding of the central pane from the
557    /// workspace when the centered layout is used.
558    ///
559    /// Default: 0.2
560    pub left_padding: Option<CenteredPaddingSettings>,
561    // The relative width of the right padding of the central pane from the
562    // workspace when the centered layout is used.
563    ///
564    /// Default: 0.2
565    pub right_padding: Option<CenteredPaddingSettings>,
566}
567
568#[derive(
569    Copy,
570    Clone,
571    Default,
572    Serialize,
573    Deserialize,
574    JsonSchema,
575    MergeFrom,
576    PartialEq,
577    Debug,
578    strum::VariantArray,
579    strum::VariantNames,
580)]
581#[serde(rename_all = "snake_case")]
582pub enum OnLastWindowClosed {
583    /// Match platform conventions by default, so don't quit on macOS, and quit on other platforms
584    #[default]
585    PlatformDefault,
586    /// Quit the application the last window is closed
587    QuitApp,
588}
589
590#[derive(
591    Copy,
592    Clone,
593    Default,
594    Serialize,
595    Deserialize,
596    JsonSchema,
597    MergeFrom,
598    PartialEq,
599    Eq,
600    Debug,
601    strum::VariantArray,
602    strum::VariantNames,
603)]
604#[serde(rename_all = "snake_case")]
605pub enum TextRenderingMode {
606    /// Use platform default behavior.
607    #[default]
608    PlatformDefault,
609    /// Use subpixel (ClearType-style) text rendering.
610    Subpixel,
611    /// Use grayscale text rendering.
612    Grayscale,
613}
614
615impl OnLastWindowClosed {
616    pub fn is_quit_app(&self) -> bool {
617        match self {
618            OnLastWindowClosed::PlatformDefault => false,
619            OnLastWindowClosed::QuitApp => true,
620        }
621    }
622}
623
624#[with_fallible_options]
625#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)]
626pub struct ProjectPanelAutoOpenSettings {
627    /// Whether to automatically open newly created files in the editor.
628    ///
629    /// Default: true
630    pub on_create: Option<bool>,
631    /// Whether to automatically open files after pasting or duplicating them.
632    ///
633    /// Default: true
634    pub on_paste: Option<bool>,
635    /// Whether to automatically open files dropped from external sources.
636    ///
637    /// Default: true
638    pub on_drop: Option<bool>,
639}
640
641#[with_fallible_options]
642#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)]
643pub struct ProjectPanelSettingsContent {
644    /// Whether to show the project panel button in the status bar.
645    ///
646    /// Default: true
647    pub button: Option<bool>,
648    /// Whether to hide gitignore files in the project panel.
649    ///
650    /// Default: false
651    pub hide_gitignore: Option<bool>,
652    /// Customize default width (in pixels) taken by project panel
653    ///
654    /// Default: 240
655    #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")]
656    pub default_width: Option<f32>,
657    /// The position of project panel
658    ///
659    /// Default: left
660    pub dock: Option<DockSide>,
661    /// Spacing between worktree entries in the project panel.
662    ///
663    /// Default: comfortable
664    pub entry_spacing: Option<ProjectPanelEntrySpacing>,
665    /// Whether to show file icons in the project panel.
666    ///
667    /// Default: true
668    pub file_icons: Option<bool>,
669    /// Whether to show folder icons or chevrons for directories in the project panel.
670    ///
671    /// Default: true
672    pub folder_icons: Option<bool>,
673    /// Whether to show the git status in the project panel.
674    ///
675    /// Default: true
676    pub git_status: Option<bool>,
677    /// Amount of indentation (in pixels) for nested items.
678    ///
679    /// Default: 20
680    #[serde(serialize_with = "serialize_optional_f32_with_two_decimal_places")]
681    pub indent_size: Option<f32>,
682    /// Whether to reveal it in the project panel automatically,
683    /// when a corresponding project entry becomes active.
684    /// Gitignored entries are never auto revealed.
685    ///
686    /// Default: true
687    pub auto_reveal_entries: Option<bool>,
688    /// Whether to fold directories automatically
689    /// when directory has only one directory inside.
690    ///
691    /// Default: true
692    pub auto_fold_dirs: Option<bool>,
693    /// Whether the project panel should open on startup.
694    ///
695    /// Default: true
696    pub starts_open: Option<bool>,
697    /// Scrollbar-related settings
698    pub scrollbar: Option<ScrollbarSettingsContent>,
699    /// Which files containing diagnostic errors/warnings to mark in the project panel.
700    ///
701    /// Default: all
702    pub show_diagnostics: Option<ShowDiagnostics>,
703    /// Settings related to indent guides in the project panel.
704    pub indent_guides: Option<ProjectPanelIndentGuidesSettings>,
705    /// Whether to hide the root entry when only one folder is open in the window.
706    ///
707    /// Default: false
708    pub hide_root: Option<bool>,
709    /// Whether to hide the hidden entries in the project panel.
710    ///
711    /// Default: false
712    pub hide_hidden: Option<bool>,
713    /// Whether to stick parent directories at top of the project panel.
714    ///
715    /// Default: true
716    pub sticky_scroll: Option<bool>,
717    /// Whether to enable drag-and-drop operations in the project panel.
718    ///
719    /// Default: true
720    pub drag_and_drop: Option<bool>,
721    /// Settings for automatically opening files.
722    pub auto_open: Option<ProjectPanelAutoOpenSettings>,
723    /// How to order sibling entries in the project panel.
724    ///
725    /// Default: directories_first
726    pub sort_mode: Option<ProjectPanelSortMode>,
727}
728
729#[derive(
730    Copy,
731    Clone,
732    Debug,
733    Default,
734    Serialize,
735    Deserialize,
736    JsonSchema,
737    MergeFrom,
738    PartialEq,
739    Eq,
740    strum::VariantArray,
741    strum::VariantNames,
742)]
743#[serde(rename_all = "snake_case")]
744pub enum ProjectPanelEntrySpacing {
745    /// Comfortable spacing of entries.
746    #[default]
747    Comfortable,
748    /// The standard spacing of entries.
749    Standard,
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 ProjectPanelSortMode {
768    /// Show directories first, then files
769    #[default]
770    DirectoriesFirst,
771    /// Mix directories and files together
772    Mixed,
773    /// Show files first, then directories
774    FilesFirst,
775}
776
777#[with_fallible_options]
778#[derive(
779    Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, Default,
780)]
781pub struct ProjectPanelIndentGuidesSettings {
782    pub show: Option<ShowIndentGuides>,
783}