page_data.rs

   1use settings::{LanguageSettingsContent, SettingsContent};
   2use std::sync::Arc;
   3use ui::{IntoElement, SharedString};
   4
   5use crate::{
   6    SettingField, SettingItem, SettingsFieldMetadata, SettingsPage, SettingsPageItem, SubPageLink,
   7    sub_page_stack,
   8};
   9
  10pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
  11    vec![
  12        SettingsPage {
  13            title: "General",
  14            items: vec![
  15                SettingsPageItem::SectionHeader("General Settings"),
  16                SettingsPageItem::SettingItem(SettingItem {
  17                    title: "Confirm Quit",
  18                    description: "Whether to confirm before quitting Zed",
  19                    field: Box::new(SettingField {
  20                        pick: |settings_content| &settings_content.workspace.confirm_quit,
  21                        pick_mut: |settings_content| &mut settings_content.workspace.confirm_quit,
  22                    }),
  23                    metadata: None,
  24                }),
  25                SettingsPageItem::SettingItem(SettingItem {
  26                    title: "Restore On Startup",
  27                    description: "Whether to restore previous session when opening Zed",
  28                    field: Box::new(SettingField {
  29                        pick: |settings_content| &settings_content.workspace.restore_on_startup,
  30                        pick_mut: |settings_content| {
  31                            &mut settings_content.workspace.restore_on_startup
  32                        },
  33                    }),
  34                    metadata: None,
  35                }),
  36                SettingsPageItem::SettingItem(SettingItem {
  37                    title: "Restore File State",
  38                    description: "Whether to restore previous file state when reopening",
  39                    field: Box::new(SettingField {
  40                        pick: |settings_content| &settings_content.workspace.restore_on_file_reopen,
  41                        pick_mut: |settings_content| {
  42                            &mut settings_content.workspace.restore_on_file_reopen
  43                        },
  44                    }),
  45                    metadata: None,
  46                }),
  47                SettingsPageItem::SettingItem(SettingItem {
  48                    title: "Close on File Delete",
  49                    description: "Whether to automatically close files that have been deleted",
  50                    field: Box::new(SettingField {
  51                        pick: |settings_content| &settings_content.workspace.close_on_file_delete,
  52                        pick_mut: |settings_content| {
  53                            &mut settings_content.workspace.close_on_file_delete
  54                        },
  55                    }),
  56                    metadata: None,
  57                }),
  58                SettingsPageItem::SettingItem(SettingItem {
  59                    title: "When Closing With No Tabs",
  60                    description: "What to do when using the 'close active item' action with no tabs",
  61                    field: Box::new(SettingField {
  62                        pick: |settings_content| {
  63                            &settings_content.workspace.when_closing_with_no_tabs
  64                        },
  65                        pick_mut: |settings_content| {
  66                            &mut settings_content.workspace.when_closing_with_no_tabs
  67                        },
  68                    }),
  69                    metadata: None,
  70                }),
  71                SettingsPageItem::SettingItem(SettingItem {
  72                    title: "On Last Window Closed",
  73                    description: "What to do when the last window is closed",
  74                    field: Box::new(SettingField {
  75                        pick: |settings_content| &settings_content.workspace.on_last_window_closed,
  76                        pick_mut: |settings_content| {
  77                            &mut settings_content.workspace.on_last_window_closed
  78                        },
  79                    }),
  80                    metadata: None,
  81                }),
  82                SettingsPageItem::SettingItem(SettingItem {
  83                    title: "Use System Path Prompts",
  84                    description: "Whether to use native OS dialogs for 'Open' and 'Save As'",
  85                    field: Box::new(SettingField {
  86                        pick: |settings_content| {
  87                            &settings_content.workspace.use_system_path_prompts
  88                        },
  89                        pick_mut: |settings_content| {
  90                            &mut settings_content.workspace.use_system_path_prompts
  91                        },
  92                    }),
  93                    metadata: None,
  94                }),
  95                SettingsPageItem::SettingItem(SettingItem {
  96                    title: "Use System Prompts",
  97                    description: "Whether to use native OS dialogs for confirmations",
  98                    field: Box::new(SettingField {
  99                        pick: |settings_content| &settings_content.workspace.use_system_prompts,
 100                        pick_mut: |settings_content| {
 101                            &mut settings_content.workspace.use_system_prompts
 102                        },
 103                    }),
 104                    metadata: None,
 105                }),
 106                // SettingsPageItem::SectionHeader("Scoped Settings"),
 107                // todo(settings_ui): Implement another setting item type that just shows an edit in settings.json
 108                // SettingsPageItem::SettingItem(SettingItem {
 109                //     title: "Preview Channel",
 110                //     description: "Which settings should be activated only in Preview build of Zed",
 111                //     field: Box::new(SettingField {
 112                //         pick: |settings_content| &settings_content.workspace.use_system_prompts,
 113                //         pick_mut: |settings_content| {
 114                //             &mut settings_content.workspace.use_system_prompts
 115                //         },
 116                //     }),
 117                //     metadata: None,
 118                // }),
 119                // SettingsPageItem::SettingItem(SettingItem {
 120                //     title: "Settings Profiles",
 121                //     description: "Any number of settings profiles that are temporarily applied on top of your existing user settings.",
 122                //     field: Box::new(SettingField {
 123                //         pick: |settings_content| &settings_content.workspace.use_system_prompts,
 124                //         pick_mut: |settings_content| {
 125                //             &mut settings_content.workspace.use_system_prompts
 126                //         },
 127                //     }),
 128                //     metadata: None,
 129                // }),
 130                SettingsPageItem::SectionHeader("Privacy"),
 131                SettingsPageItem::SettingItem(SettingItem {
 132                    title: "Telemetry Diagnostics",
 133                    description: "Send debug information like crash reports",
 134                    field: Box::new(SettingField {
 135                        pick: |settings_content| {
 136                            if let Some(telemetry) = &settings_content.telemetry {
 137                                &telemetry.diagnostics
 138                            } else {
 139                                &None
 140                            }
 141                        },
 142                        pick_mut: |settings_content| {
 143                            &mut settings_content
 144                                .telemetry
 145                                .get_or_insert_default()
 146                                .diagnostics
 147                        },
 148                    }),
 149                    metadata: None,
 150                }),
 151                SettingsPageItem::SettingItem(SettingItem {
 152                    title: "Telemetry Metrics",
 153                    description: "Send anonymized usage data like what languages you're using Zed with",
 154                    field: Box::new(SettingField {
 155                        pick: |settings_content| {
 156                            if let Some(telemetry) = &settings_content.telemetry {
 157                                &telemetry.metrics
 158                            } else {
 159                                &None
 160                            }
 161                        },
 162                        pick_mut: |settings_content| {
 163                            &mut settings_content.telemetry.get_or_insert_default().metrics
 164                        },
 165                    }),
 166                    metadata: None,
 167                }),
 168            ],
 169        },
 170        SettingsPage {
 171            title: "Appearance & Behavior",
 172            items: vec![
 173                // SettingsPageItem::SectionHeader("Theme"),
 174                // todo(settings_ui): Figure out how we want to add these
 175                // SettingsPageItem::SettingItem(SettingItem {
 176                //     title: "Theme Mode",
 177                //     description: "How to select the theme",
 178                //     field: Box::new(SettingField {
 179                //         pick: |settings_content| &settings_content.theme.theme,
 180                //         pick_mut: |settings_content| &mut settings_content.theme.theme,
 181                //     }),
 182                //     metadata: None,
 183                // }),
 184                // SettingsPageItem::SettingItem(SettingItem {
 185                //     title: "Icon Theme",
 186                //     // todo(settings_ui)
 187                //     // This description is misleading because the icon theme is used in more places than the file explorer)
 188                //     description: "Choose the icon theme for file explorer",
 189                //     field: Box::new(SettingField {
 190                //         pick: |settings_content| &settings_content.theme.icon_theme,
 191                //         pick_mut: |settings_content| &mut settings_content.theme.icon_theme,
 192                //     }),
 193                //     metadata: None,
 194                // }),
 195                SettingsPageItem::SectionHeader("Fonts"),
 196                SettingsPageItem::SettingItem(SettingItem {
 197                    title: "Buffer Font Family",
 198                    description: "Font family for editor text",
 199                    field: Box::new(SettingField {
 200                        pick: |settings_content| &settings_content.theme.buffer_font_family,
 201                        pick_mut: |settings_content| &mut settings_content.theme.buffer_font_family,
 202                    }),
 203                    metadata: None,
 204                }),
 205                SettingsPageItem::SettingItem(SettingItem {
 206                    title: "Buffer Font Size",
 207                    description: "Font size for editor text",
 208                    field: Box::new(SettingField {
 209                        pick: |settings_content| &settings_content.theme.buffer_font_size,
 210                        pick_mut: |settings_content| &mut settings_content.theme.buffer_font_size,
 211                    }),
 212                    metadata: None,
 213                }),
 214                SettingsPageItem::SettingItem(SettingItem {
 215                    title: "Buffer Font Weight",
 216                    description: "Font weight for editor text (100-900)",
 217                    field: Box::new(SettingField {
 218                        pick: |settings_content| &settings_content.theme.buffer_font_weight,
 219                        pick_mut: |settings_content| &mut settings_content.theme.buffer_font_weight,
 220                    }),
 221                    metadata: None,
 222                }),
 223                // todo(settings_ui): This needs custom ui
 224                // SettingsPageItem::SettingItem(SettingItem {
 225                //     title: "Buffer Line Height",
 226                //     description: "Line height for editor text",
 227                //     field: Box::new(SettingField {
 228                //         pick: |settings_content| &settings_content.theme.buffer_line_height,
 229                //         pick_mut: |settings_content| &mut settings_content.theme.buffer_line_height,
 230                //     }),
 231                //     metadata: None,
 232                // }),
 233                SettingsPageItem::SettingItem(SettingItem {
 234                    title: "UI Font Family",
 235                    description: "Font family for UI elements",
 236                    field: Box::new(SettingField {
 237                        pick: |settings_content| &settings_content.theme.ui_font_family,
 238                        pick_mut: |settings_content| &mut settings_content.theme.ui_font_family,
 239                    }),
 240                    metadata: None,
 241                }),
 242                SettingsPageItem::SettingItem(SettingItem {
 243                    title: "UI Font Size",
 244                    description: "Font size for UI elements",
 245                    field: Box::new(SettingField {
 246                        pick: |settings_content| &settings_content.theme.ui_font_size,
 247                        pick_mut: |settings_content| &mut settings_content.theme.ui_font_size,
 248                    }),
 249                    metadata: None,
 250                }),
 251                SettingsPageItem::SettingItem(SettingItem {
 252                    title: "UI Font Weight",
 253                    description: "Font weight for UI elements (100-900)",
 254                    field: Box::new(SettingField {
 255                        pick: |settings_content| &settings_content.theme.ui_font_weight,
 256                        pick_mut: |settings_content| &mut settings_content.theme.ui_font_weight,
 257                    }),
 258                    metadata: None,
 259                }),
 260                SettingsPageItem::SectionHeader("Keymap"),
 261                SettingsPageItem::SettingItem(SettingItem {
 262                    title: "Base Keymap",
 263                    description: "The name of a base set of key bindings to use",
 264                    field: Box::new(SettingField {
 265                        pick: |settings_content| &settings_content.base_keymap,
 266                        pick_mut: |settings_content| &mut settings_content.base_keymap,
 267                    }),
 268                    metadata: None,
 269                }),
 270                // todo(settings_ui): Vim/Helix Mode should be apart of one type because it's undefined
 271                // behavior to have them both enabled at the same time
 272                SettingsPageItem::SettingItem(SettingItem {
 273                    title: "Vim Mode",
 274                    description: "Whether to enable vim modes and key bindings",
 275                    field: Box::new(SettingField {
 276                        pick: |settings_content| &settings_content.vim_mode,
 277                        pick_mut: |settings_content| &mut settings_content.vim_mode,
 278                    }),
 279                    metadata: None,
 280                }),
 281                SettingsPageItem::SettingItem(SettingItem {
 282                    title: "Helix Mode",
 283                    description: "Whether to enable helix modes and key bindings",
 284                    field: Box::new(SettingField {
 285                        pick: |settings_content| &settings_content.helix_mode,
 286                        pick_mut: |settings_content| &mut settings_content.helix_mode,
 287                    }),
 288                    metadata: None,
 289                }),
 290                SettingsPageItem::SettingItem(SettingItem {
 291                    title: "Multi Cursor Modifier",
 292                    description: "Modifier key for adding multiple cursors",
 293                    field: Box::new(SettingField {
 294                        pick: |settings_content| &settings_content.editor.multi_cursor_modifier,
 295                        pick_mut: |settings_content| {
 296                            &mut settings_content.editor.multi_cursor_modifier
 297                        },
 298                    }),
 299                    metadata: None,
 300                }),
 301                SettingsPageItem::SectionHeader("Cursor"),
 302                SettingsPageItem::SettingItem(SettingItem {
 303                    title: "Cursor Blink",
 304                    description: "Whether the cursor blinks in the editor",
 305                    field: Box::new(SettingField {
 306                        pick: |settings_content| &settings_content.editor.cursor_blink,
 307                        pick_mut: |settings_content| &mut settings_content.editor.cursor_blink,
 308                    }),
 309                    metadata: None,
 310                }),
 311                SettingsPageItem::SettingItem(SettingItem {
 312                    title: "Cursor Shape",
 313                    description: "Cursor shape for the editor",
 314                    field: Box::new(SettingField {
 315                        pick: |settings_content| &settings_content.editor.cursor_shape,
 316                        pick_mut: |settings_content| &mut settings_content.editor.cursor_shape,
 317                    }),
 318                    metadata: None,
 319                }),
 320                SettingsPageItem::SettingItem(SettingItem {
 321                    title: "Hide Mouse",
 322                    description: "When to hide the mouse cursor",
 323                    field: Box::new(SettingField {
 324                        pick: |settings_content| &settings_content.editor.hide_mouse,
 325                        pick_mut: |settings_content| &mut settings_content.editor.hide_mouse,
 326                    }),
 327                    metadata: None,
 328                }),
 329                SettingsPageItem::SectionHeader("Highlighting"),
 330                SettingsPageItem::SettingItem(SettingItem {
 331                    title: "Unnecessary Code Fade",
 332                    description: "How much to fade out unused code (0.0 - 0.9)",
 333                    field: Box::new(SettingField {
 334                        pick: |settings_content| &settings_content.theme.unnecessary_code_fade,
 335                        pick_mut: |settings_content| {
 336                            &mut settings_content.theme.unnecessary_code_fade
 337                        },
 338                    }),
 339                    metadata: None,
 340                }),
 341                SettingsPageItem::SettingItem(SettingItem {
 342                    title: "Current Line Highlight",
 343                    description: "How to highlight the current line",
 344                    field: Box::new(SettingField {
 345                        pick: |settings_content| &settings_content.editor.current_line_highlight,
 346                        pick_mut: |settings_content| {
 347                            &mut settings_content.editor.current_line_highlight
 348                        },
 349                    }),
 350                    metadata: None,
 351                }),
 352                SettingsPageItem::SettingItem(SettingItem {
 353                    title: "Selection Highlight",
 354                    description: "Whether to highlight all occurrences of selected text",
 355                    field: Box::new(SettingField {
 356                        pick: |settings_content| &settings_content.editor.selection_highlight,
 357                        pick_mut: |settings_content| {
 358                            &mut settings_content.editor.selection_highlight
 359                        },
 360                    }),
 361                    metadata: None,
 362                }),
 363                SettingsPageItem::SettingItem(SettingItem {
 364                    title: "Rounded Selection",
 365                    description: "Whether the text selection should have rounded corners",
 366                    field: Box::new(SettingField {
 367                        pick: |settings_content| &settings_content.editor.rounded_selection,
 368                        pick_mut: |settings_content| &mut settings_content.editor.rounded_selection,
 369                    }),
 370                    metadata: None,
 371                }),
 372                SettingsPageItem::SectionHeader("Guides"),
 373                SettingsPageItem::SettingItem(SettingItem {
 374                    title: "Show Wrap Guides",
 375                    description: "Whether to show wrap guides (vertical rulers)",
 376                    field: Box::new(SettingField {
 377                        pick: |settings_content| {
 378                            &settings_content
 379                                .project
 380                                .all_languages
 381                                .defaults
 382                                .show_wrap_guides
 383                        },
 384                        pick_mut: |settings_content| {
 385                            &mut settings_content
 386                                .project
 387                                .all_languages
 388                                .defaults
 389                                .show_wrap_guides
 390                        },
 391                    }),
 392                    metadata: None,
 393                }),
 394                // todo(settings_ui): This needs a custom component
 395                // SettingsPageItem::SettingItem(SettingItem {
 396                //     title: "Wrap Guides",
 397                //     description: "Character counts at which to show wrap guides",
 398                //     field: Box::new(SettingField {
 399                //         pick: |settings_content| {
 400                //             &settings_content
 401                //                 .project
 402                //                 .all_languages
 403                //                 .defaults
 404                //                 .wrap_guides
 405                //         },
 406                //         pick_mut: |settings_content| {
 407                //             &mut settings_content
 408                //                 .project
 409                //                 .all_languages
 410                //                 .defaults
 411                //                 .wrap_guides
 412                //         },
 413                //     }),
 414                //     metadata: None,
 415                // }),
 416                SettingsPageItem::SectionHeader("Whitespace"),
 417                SettingsPageItem::SettingItem(SettingItem {
 418                    title: "Show Whitespace",
 419                    description: "Whether to show tabs and spaces",
 420                    field: Box::new(SettingField {
 421                        pick: |settings_content| {
 422                            &settings_content
 423                                .project
 424                                .all_languages
 425                                .defaults
 426                                .show_whitespaces
 427                        },
 428                        pick_mut: |settings_content| {
 429                            &mut settings_content
 430                                .project
 431                                .all_languages
 432                                .defaults
 433                                .show_whitespaces
 434                        },
 435                    }),
 436                    metadata: None,
 437                }),
 438                SettingsPageItem::SectionHeader("Layout"),
 439                SettingsPageItem::SettingItem(SettingItem {
 440                    title: "Bottom Dock Layout",
 441                    description: "Layout mode for the bottom dock",
 442                    field: Box::new(SettingField {
 443                        pick: |settings_content| &settings_content.workspace.bottom_dock_layout,
 444                        pick_mut: |settings_content| {
 445                            &mut settings_content.workspace.bottom_dock_layout
 446                        },
 447                    }),
 448                    metadata: None,
 449                }),
 450                // SettingsPageItem::SettingItem(SettingItem {
 451                //     title: "Centered Layout Left Padding",
 452                //     description: "Left padding for centered layout",
 453                //     field: Box::new(SettingField {
 454                //         pick: |settings_content| {
 455                //             if let Some(centered_layout) =
 456                //                 &settings_content.workspace.centered_layout
 457                //             {
 458                //                 &centered_layout.left_padding
 459                //             } else {
 460                //                 &None
 461                //             }
 462                //         },
 463                //         pick_mut: |settings_content| {
 464                //             if let Some(mut centered_layout) =
 465                //                 settings_content.workspace.centered_layout
 466                //             {
 467                //                 &mut centered_layout.left_padding
 468                //             } else {
 469                //                 &mut None
 470                //             }
 471                //         },
 472                //     }),
 473                //     metadata: None,
 474                // }),
 475                // SettingsPageItem::SettingItem(SettingItem {
 476                //     title: "Centered Layout Right Padding",
 477                //     description: "Right padding for centered layout",
 478                //     field: Box::new(SettingField {
 479                //         pick: |settings_content| {
 480                //             if let Some(centered_layout) =
 481                //                 &settings_content.workspace.centered_layout
 482                //             {
 483                //                 &centered_layout.right_padding
 484                //             } else {
 485                //                 &None
 486                //             }
 487                //         },
 488                //         pick_mut: |settings_content| {
 489                //             if let Some(mut centered_layout) =
 490                //                 settings_content.workspace.centered_layout
 491                //             {
 492                //                 &mut centered_layout.right_padding
 493                //             } else {
 494                //                 &mut None
 495                //             }
 496                //         },
 497                //     }),
 498                //     metadata: None,
 499                // }),
 500                SettingsPageItem::SettingItem(SettingItem {
 501                    title: "Zoomed Padding",
 502                    description: "Whether to show padding for zoomed panels",
 503                    field: Box::new(SettingField {
 504                        pick: |settings_content| &settings_content.workspace.zoomed_padding,
 505                        pick_mut: |settings_content| &mut settings_content.workspace.zoomed_padding,
 506                    }),
 507                    metadata: None,
 508                }),
 509                SettingsPageItem::SettingItem(SettingItem {
 510                    title: "Use System Window Tabs",
 511                    description: "(macOS-only) Whether to allow windows to merge based on the user's tabbing preference",
 512                    field: Box::new(SettingField {
 513                        pick: |settings_content| &settings_content.workspace.use_system_window_tabs,
 514                        pick_mut: |settings_content| {
 515                            &mut settings_content.workspace.use_system_window_tabs
 516                        },
 517                    }),
 518                    metadata: None,
 519                }),
 520                SettingsPageItem::SectionHeader("Window"),
 521                // todo(settings_ui): Should we filter by platform?
 522                SettingsPageItem::SettingItem(SettingItem {
 523                    title: "Use System Window Tabs",
 524                    description: "(macOS only) Whether to allow windows to tab together",
 525                    field: Box::new(SettingField {
 526                        pick: |settings_content| &settings_content.workspace.use_system_window_tabs,
 527                        pick_mut: |settings_content| {
 528                            &mut settings_content.workspace.use_system_window_tabs
 529                        },
 530                    }),
 531                    metadata: None,
 532                }),
 533            ],
 534        },
 535        SettingsPage {
 536            title: "Editor",
 537            items: vec![
 538                SettingsPageItem::SectionHeader("Indentation"),
 539                SettingsPageItem::SettingItem(SettingItem {
 540                    title: "Tab Size",
 541                    description: "How many columns a tab should occupy",
 542                    field: Box::new(SettingField {
 543                        pick: |settings_content| {
 544                            &settings_content.project.all_languages.defaults.tab_size
 545                        },
 546                        pick_mut: |settings_content| {
 547                            &mut settings_content.project.all_languages.defaults.tab_size
 548                        },
 549                    }),
 550                    metadata: None,
 551                }),
 552                SettingsPageItem::SettingItem(SettingItem {
 553                    title: "Hard Tabs",
 554                    description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
 555                    field: Box::new(SettingField {
 556                        pick: |settings_content| {
 557                            &settings_content.project.all_languages.defaults.hard_tabs
 558                        },
 559                        pick_mut: |settings_content| {
 560                            &mut settings_content.project.all_languages.defaults.hard_tabs
 561                        },
 562                    }),
 563                    metadata: None,
 564                }),
 565                SettingsPageItem::SettingItem(SettingItem {
 566                    title: "Auto Indent",
 567                    description: "Whether indentation should be adjusted based on the context whilst typing",
 568                    field: Box::new(SettingField {
 569                        pick: |settings_content| {
 570                            &settings_content.project.all_languages.defaults.auto_indent
 571                        },
 572                        pick_mut: |settings_content| {
 573                            &mut settings_content.project.all_languages.defaults.auto_indent
 574                        },
 575                    }),
 576                    metadata: None,
 577                }),
 578                SettingsPageItem::SettingItem(SettingItem {
 579                    title: "Auto Indent On Paste",
 580                    description: "Whether indentation of pasted content should be adjusted based on the context",
 581                    field: Box::new(SettingField {
 582                        pick: |settings_content| {
 583                            &settings_content
 584                                .project
 585                                .all_languages
 586                                .defaults
 587                                .auto_indent_on_paste
 588                        },
 589                        pick_mut: |settings_content| {
 590                            &mut settings_content
 591                                .project
 592                                .all_languages
 593                                .defaults
 594                                .auto_indent_on_paste
 595                        },
 596                    }),
 597                    metadata: None,
 598                }),
 599                SettingsPageItem::SectionHeader("Wrapping"),
 600                SettingsPageItem::SettingItem(SettingItem {
 601                    title: "Preferred Line Length",
 602                    description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
 603                    field: Box::new(SettingField {
 604                        pick: |settings_content| {
 605                            &settings_content
 606                                .project
 607                                .all_languages
 608                                .defaults
 609                                .preferred_line_length
 610                        },
 611                        pick_mut: |settings_content| {
 612                            &mut settings_content
 613                                .project
 614                                .all_languages
 615                                .defaults
 616                                .preferred_line_length
 617                        },
 618                    }),
 619                    metadata: None,
 620                }),
 621                SettingsPageItem::SettingItem(SettingItem {
 622                    title: "Soft Wrap",
 623                    description: "How to soft-wrap long lines of text",
 624                    field: Box::new(SettingField {
 625                        pick: |settings_content| {
 626                            &settings_content.project.all_languages.defaults.soft_wrap
 627                        },
 628                        pick_mut: |settings_content| {
 629                            &mut settings_content.project.all_languages.defaults.soft_wrap
 630                        },
 631                    }),
 632                    metadata: None,
 633                }),
 634                SettingsPageItem::SectionHeader("Search"),
 635                SettingsPageItem::SettingItem(SettingItem {
 636                    title: "Search Wrap",
 637                    description: "Whether the editor search results will loop",
 638                    field: Box::new(SettingField {
 639                        pick: |settings_content| &settings_content.editor.search_wrap,
 640                        pick_mut: |settings_content| &mut settings_content.editor.search_wrap,
 641                    }),
 642                    metadata: None,
 643                }),
 644                SettingsPageItem::SettingItem(SettingItem {
 645                    title: "Seed Search Query From Cursor",
 646                    description: "When to populate a new search's query based on the text under the cursor",
 647                    field: Box::new(SettingField {
 648                        pick: |settings_content| {
 649                            &settings_content.editor.seed_search_query_from_cursor
 650                        },
 651                        pick_mut: |settings_content| {
 652                            &mut settings_content.editor.seed_search_query_from_cursor
 653                        },
 654                    }),
 655                    metadata: None,
 656                }),
 657                SettingsPageItem::SettingItem(SettingItem {
 658                    title: "Use Smartcase Search",
 659                    description: "Whether to use smartcase (i.e., case-sensitive) search",
 660                    field: Box::new(SettingField {
 661                        pick: |settings_content| &settings_content.editor.use_smartcase_search,
 662                        pick_mut: |settings_content| {
 663                            &mut settings_content.editor.use_smartcase_search
 664                        },
 665                    }),
 666                    metadata: None,
 667                }),
 668                SettingsPageItem::SectionHeader("Editor Behavior"),
 669                SettingsPageItem::SettingItem(SettingItem {
 670                    title: "Redact Private Values",
 671                    description: "Hide the values of variables in private files",
 672                    field: Box::new(SettingField {
 673                        pick: |settings_content| &settings_content.editor.redact_private_values,
 674                        pick_mut: |settings_content| {
 675                            &mut settings_content.editor.redact_private_values
 676                        },
 677                    }),
 678                    metadata: None,
 679                }),
 680                SettingsPageItem::SettingItem(SettingItem {
 681                    title: "Middle Click Paste",
 682                    description: "Whether to enable middle-click paste on Linux",
 683                    field: Box::new(SettingField {
 684                        pick: |settings_content| &settings_content.editor.middle_click_paste,
 685                        pick_mut: |settings_content| {
 686                            &mut settings_content.editor.middle_click_paste
 687                        },
 688                    }),
 689                    metadata: None,
 690                }),
 691                SettingsPageItem::SettingItem(SettingItem {
 692                    title: "Double Click In Multibuffer",
 693                    description: "What to do when multibuffer is double-clicked in some of its excerpts",
 694                    field: Box::new(SettingField {
 695                        pick: |settings_content| {
 696                            &settings_content.editor.double_click_in_multibuffer
 697                        },
 698                        pick_mut: |settings_content| {
 699                            &mut settings_content.editor.double_click_in_multibuffer
 700                        },
 701                    }),
 702                    metadata: None,
 703                }),
 704                SettingsPageItem::SettingItem(SettingItem {
 705                    title: "Go To Definition Fallback",
 706                    description: "Whether to follow-up empty go to definition responses from the language server",
 707                    field: Box::new(SettingField {
 708                        pick: |settings_content| &settings_content.editor.go_to_definition_fallback,
 709                        pick_mut: |settings_content| {
 710                            &mut settings_content.editor.go_to_definition_fallback
 711                        },
 712                    }),
 713                    metadata: None,
 714                }),
 715                SettingsPageItem::SettingItem(SettingItem {
 716                    title: "Expand Excerpt Lines",
 717                    description: "How many lines to expand the multibuffer excerpts by default",
 718                    field: Box::new(SettingField {
 719                        pick: |settings_content| &settings_content.editor.expand_excerpt_lines,
 720                        pick_mut: |settings_content| {
 721                            &mut settings_content.editor.expand_excerpt_lines
 722                        },
 723                    }),
 724                    metadata: None,
 725                }),
 726                SettingsPageItem::SettingItem(SettingItem {
 727                    title: "Excerpt Context Lines",
 728                    description: "How many lines of context to provide in multibuffer excerpts by default",
 729                    field: Box::new(SettingField {
 730                        pick: |settings_content| &settings_content.editor.excerpt_context_lines,
 731                        pick_mut: |settings_content| {
 732                            &mut settings_content.editor.excerpt_context_lines
 733                        },
 734                    }),
 735                    metadata: None,
 736                }),
 737                SettingsPageItem::SettingItem(SettingItem {
 738                    title: "Minimum Contrast For Highlights",
 739                    description: "The minimum APCA perceptual contrast to maintain when rendering text over highlight backgrounds",
 740                    field: Box::new(SettingField {
 741                        pick: |settings_content| {
 742                            &settings_content.editor.minimum_contrast_for_highlights
 743                        },
 744                        pick_mut: |settings_content| {
 745                            &mut settings_content.editor.minimum_contrast_for_highlights
 746                        },
 747                    }),
 748                    metadata: None,
 749                }),
 750                SettingsPageItem::SectionHeader("Scrolling"),
 751                SettingsPageItem::SettingItem(SettingItem {
 752                    title: "Scroll Beyond Last Line",
 753                    description: "Whether the editor will scroll beyond the last line",
 754                    field: Box::new(SettingField {
 755                        pick: |settings_content| &settings_content.editor.scroll_beyond_last_line,
 756                        pick_mut: |settings_content| {
 757                            &mut settings_content.editor.scroll_beyond_last_line
 758                        },
 759                    }),
 760                    metadata: None,
 761                }),
 762                SettingsPageItem::SettingItem(SettingItem {
 763                    title: "Vertical Scroll Margin",
 764                    description: "The number of lines to keep above/below the cursor when auto-scrolling",
 765                    field: Box::new(SettingField {
 766                        pick: |settings_content| &settings_content.editor.vertical_scroll_margin,
 767                        pick_mut: |settings_content| {
 768                            &mut settings_content.editor.vertical_scroll_margin
 769                        },
 770                    }),
 771                    metadata: None,
 772                }),
 773                SettingsPageItem::SettingItem(SettingItem {
 774                    title: "Horizontal Scroll Margin",
 775                    description: "The number of characters to keep on either side when scrolling with the mouse",
 776                    field: Box::new(SettingField {
 777                        pick: |settings_content| &settings_content.editor.horizontal_scroll_margin,
 778                        pick_mut: |settings_content| {
 779                            &mut settings_content.editor.horizontal_scroll_margin
 780                        },
 781                    }),
 782                    metadata: None,
 783                }),
 784                SettingsPageItem::SettingItem(SettingItem {
 785                    title: "Scroll Sensitivity",
 786                    description: "Scroll sensitivity multiplier for both horizontal and vertical scrolling",
 787                    field: Box::new(SettingField {
 788                        pick: |settings_content| &settings_content.editor.scroll_sensitivity,
 789                        pick_mut: |settings_content| {
 790                            &mut settings_content.editor.scroll_sensitivity
 791                        },
 792                    }),
 793                    metadata: None,
 794                }),
 795                SettingsPageItem::SettingItem(SettingItem {
 796                    title: "Fast Scroll Sensitivity",
 797                    description: "Fast Scroll sensitivity multiplier for both horizontal and vertical scrolling",
 798                    field: Box::new(SettingField {
 799                        pick: |settings_content| &settings_content.editor.fast_scroll_sensitivity,
 800                        pick_mut: |settings_content| {
 801                            &mut settings_content.editor.fast_scroll_sensitivity
 802                        },
 803                    }),
 804                    metadata: None,
 805                }),
 806                SettingsPageItem::SettingItem(SettingItem {
 807                    title: "Autoscroll On Clicks",
 808                    description: "Whether to scroll when clicking near the edge of the visible text area",
 809                    field: Box::new(SettingField {
 810                        pick: |settings_content| &settings_content.editor.autoscroll_on_clicks,
 811                        pick_mut: |settings_content| {
 812                            &mut settings_content.editor.autoscroll_on_clicks
 813                        },
 814                    }),
 815                    metadata: None,
 816                }),
 817                SettingsPageItem::SectionHeader("Auto Actions"),
 818                SettingsPageItem::SettingItem(SettingItem {
 819                    title: "Use Autoclose",
 820                    description: "Whether to automatically type closing characters for you",
 821                    field: Box::new(SettingField {
 822                        pick: |settings_content| {
 823                            &settings_content
 824                                .project
 825                                .all_languages
 826                                .defaults
 827                                .use_autoclose
 828                        },
 829                        pick_mut: |settings_content| {
 830                            &mut settings_content
 831                                .project
 832                                .all_languages
 833                                .defaults
 834                                .use_autoclose
 835                        },
 836                    }),
 837                    metadata: None,
 838                }),
 839                SettingsPageItem::SettingItem(SettingItem {
 840                    title: "Use Auto Surround",
 841                    description: "Whether to automatically surround text with characters for you",
 842                    field: Box::new(SettingField {
 843                        pick: |settings_content| {
 844                            &settings_content
 845                                .project
 846                                .all_languages
 847                                .defaults
 848                                .use_auto_surround
 849                        },
 850                        pick_mut: |settings_content| {
 851                            &mut settings_content
 852                                .project
 853                                .all_languages
 854                                .defaults
 855                                .use_auto_surround
 856                        },
 857                    }),
 858                    metadata: None,
 859                }),
 860                SettingsPageItem::SettingItem(SettingItem {
 861                    title: "Use On Type Format",
 862                    description: "Whether to use additional LSP queries to format the code after every trigger symbol input",
 863                    field: Box::new(SettingField {
 864                        pick: |settings_content| {
 865                            &settings_content
 866                                .project
 867                                .all_languages
 868                                .defaults
 869                                .use_on_type_format
 870                        },
 871                        pick_mut: |settings_content| {
 872                            &mut settings_content
 873                                .project
 874                                .all_languages
 875                                .defaults
 876                                .use_on_type_format
 877                        },
 878                    }),
 879                    metadata: None,
 880                }),
 881                SettingsPageItem::SettingItem(SettingItem {
 882                    title: "Always Treat Brackets As Autoclosed",
 883                    description: "Controls how the editor handles the autoclosed characters",
 884                    field: Box::new(SettingField {
 885                        pick: |settings_content| {
 886                            &settings_content
 887                                .project
 888                                .all_languages
 889                                .defaults
 890                                .always_treat_brackets_as_autoclosed
 891                        },
 892                        pick_mut: |settings_content| {
 893                            &mut settings_content
 894                                .project
 895                                .all_languages
 896                                .defaults
 897                                .always_treat_brackets_as_autoclosed
 898                        },
 899                    }),
 900                    metadata: None,
 901                }),
 902                SettingsPageItem::SectionHeader("Formatting"),
 903                SettingsPageItem::SettingItem(SettingItem {
 904                    title: "Remove Trailing Whitespace On Save",
 905                    description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
 906                    field: Box::new(SettingField {
 907                        pick: |settings_content| {
 908                            &settings_content
 909                                .project
 910                                .all_languages
 911                                .defaults
 912                                .remove_trailing_whitespace_on_save
 913                        },
 914                        pick_mut: |settings_content| {
 915                            &mut settings_content
 916                                .project
 917                                .all_languages
 918                                .defaults
 919                                .remove_trailing_whitespace_on_save
 920                        },
 921                    }),
 922                    metadata: None,
 923                }),
 924                SettingsPageItem::SettingItem(SettingItem {
 925                    title: "Ensure Final Newline On Save",
 926                    description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
 927                    field: Box::new(SettingField {
 928                        pick: |settings_content| {
 929                            &settings_content
 930                                .project
 931                                .all_languages
 932                                .defaults
 933                                .ensure_final_newline_on_save
 934                        },
 935                        pick_mut: |settings_content| {
 936                            &mut settings_content
 937                                .project
 938                                .all_languages
 939                                .defaults
 940                                .ensure_final_newline_on_save
 941                        },
 942                    }),
 943                    metadata: None,
 944                }),
 945                SettingsPageItem::SettingItem(SettingItem {
 946                    title: "Extend Comment On Newline",
 947                    description: "Whether to start a new line with a comment when a previous line is a comment as well",
 948                    field: Box::new(SettingField {
 949                        pick: |settings_content| {
 950                            &settings_content
 951                                .project
 952                                .all_languages
 953                                .defaults
 954                                .extend_comment_on_newline
 955                        },
 956                        pick_mut: |settings_content| {
 957                            &mut settings_content
 958                                .project
 959                                .all_languages
 960                                .defaults
 961                                .extend_comment_on_newline
 962                        },
 963                    }),
 964                    metadata: None,
 965                }),
 966                SettingsPageItem::SectionHeader("Language Server Completions"),
 967                SettingsPageItem::SettingItem(SettingItem {
 968                    title: "Show Completions On Input",
 969                    description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
 970                    field: Box::new(SettingField {
 971                        pick: |settings_content| {
 972                            &settings_content
 973                                .project
 974                                .all_languages
 975                                .defaults
 976                                .show_completions_on_input
 977                        },
 978                        pick_mut: |settings_content| {
 979                            &mut settings_content
 980                                .project
 981                                .all_languages
 982                                .defaults
 983                                .show_completions_on_input
 984                        },
 985                    }),
 986                    metadata: None,
 987                }),
 988                SettingsPageItem::SettingItem(SettingItem {
 989                    title: "Show Completion Documentation",
 990                    description: "Whether to display inline and alongside documentation for items in the completions menu",
 991                    field: Box::new(SettingField {
 992                        pick: |settings_content| {
 993                            &settings_content
 994                                .project
 995                                .all_languages
 996                                .defaults
 997                                .show_completion_documentation
 998                        },
 999                        pick_mut: |settings_content| {
1000                            &mut settings_content
1001                                .project
1002                                .all_languages
1003                                .defaults
1004                                .show_completion_documentation
1005                        },
1006                    }),
1007                    metadata: None,
1008                }),
1009                SettingsPageItem::SettingItem(SettingItem {
1010                    title: "Auto Signature Help",
1011                    description: "Whether to automatically show a signature help pop-up or not",
1012                    field: Box::new(SettingField {
1013                        pick: |settings_content| &settings_content.editor.auto_signature_help,
1014                        pick_mut: |settings_content| {
1015                            &mut settings_content.editor.auto_signature_help
1016                        },
1017                    }),
1018                    metadata: None,
1019                }),
1020                SettingsPageItem::SettingItem(SettingItem {
1021                    title: "Show Signature Help After Edits",
1022                    description: "Whether to show the signature help pop-up after completions or bracket pairs inserted",
1023                    field: Box::new(SettingField {
1024                        pick: |settings_content| {
1025                            &settings_content.editor.show_signature_help_after_edits
1026                        },
1027                        pick_mut: |settings_content| {
1028                            &mut settings_content.editor.show_signature_help_after_edits
1029                        },
1030                    }),
1031                    metadata: None,
1032                }),
1033                SettingsPageItem::SettingItem(SettingItem {
1034                    title: "Snippet Sort Order",
1035                    description: "Determines how snippets are sorted relative to other completion items",
1036                    field: Box::new(SettingField {
1037                        pick: |settings_content| &settings_content.editor.snippet_sort_order,
1038                        pick_mut: |settings_content| {
1039                            &mut settings_content.editor.snippet_sort_order
1040                        },
1041                    }),
1042                    metadata: None,
1043                }),
1044                SettingsPageItem::SectionHeader("Hover"),
1045                SettingsPageItem::SettingItem(SettingItem {
1046                    title: "Hover Popover Enabled",
1047                    description: "Whether to show the informational hover box when moving the mouse over symbols in the editor",
1048                    field: Box::new(SettingField {
1049                        pick: |settings_content| &settings_content.editor.hover_popover_enabled,
1050                        pick_mut: |settings_content| {
1051                            &mut settings_content.editor.hover_popover_enabled
1052                        },
1053                    }),
1054                    metadata: None,
1055                }),
1056                // todo(settings ui): add units to this numeric stepper
1057                SettingsPageItem::SettingItem(SettingItem {
1058                    title: "Hover Popover Delay",
1059                    description: "Time to wait in milliseconds before showing the informational hover box",
1060                    field: Box::new(SettingField {
1061                        pick: |settings_content| &settings_content.editor.hover_popover_delay,
1062                        pick_mut: |settings_content| {
1063                            &mut settings_content.editor.hover_popover_delay
1064                        },
1065                    }),
1066                    metadata: None,
1067                }),
1068                SettingsPageItem::SectionHeader("Code Actions"),
1069                SettingsPageItem::SettingItem(SettingItem {
1070                    title: "Inline Code Actions",
1071                    description: "Whether to show code action button at start of buffer line",
1072                    field: Box::new(SettingField {
1073                        pick: |settings_content| &settings_content.editor.inline_code_actions,
1074                        pick_mut: |settings_content| {
1075                            &mut settings_content.editor.inline_code_actions
1076                        },
1077                    }),
1078                    metadata: None,
1079                }),
1080                SettingsPageItem::SectionHeader("Selection"),
1081                SettingsPageItem::SettingItem(SettingItem {
1082                    title: "Drag And Drop Selection",
1083                    description: "Whether to enable drag and drop selection",
1084                    field: Box::new(SettingField {
1085                        pick: |settings_content| {
1086                            if let Some(drag_and_drop) =
1087                                &settings_content.editor.drag_and_drop_selection
1088                            {
1089                                &drag_and_drop.enabled
1090                            } else {
1091                                &None
1092                            }
1093                        },
1094                        pick_mut: |settings_content| {
1095                            &mut settings_content
1096                                .editor
1097                                .drag_and_drop_selection
1098                                .get_or_insert_default()
1099                                .enabled
1100                        },
1101                    }),
1102                    metadata: None,
1103                }),
1104                SettingsPageItem::SettingItem(SettingItem {
1105                    title: "Drag And Drop Selection Delay",
1106                    description: "Delay in milliseconds before drag and drop selection starts",
1107                    field: Box::new(SettingField {
1108                        pick: |settings_content| {
1109                            if let Some(drag_and_drop) =
1110                                &settings_content.editor.drag_and_drop_selection
1111                            {
1112                                &drag_and_drop.delay
1113                            } else {
1114                                &None
1115                            }
1116                        },
1117                        pick_mut: |settings_content| {
1118                            &mut settings_content
1119                                .editor
1120                                .drag_and_drop_selection
1121                                .get_or_insert_default()
1122                                .delay
1123                        },
1124                    }),
1125                    metadata: None,
1126                }),
1127                SettingsPageItem::SectionHeader("Gutter"),
1128                SettingsPageItem::SettingItem(SettingItem {
1129                    title: "Show Line Numbers",
1130                    description: "Whether to show line numbers in the gutter",
1131                    field: Box::new(SettingField {
1132                        pick: |settings_content| {
1133                            if let Some(gutter) = &settings_content.editor.gutter {
1134                                &gutter.line_numbers
1135                            } else {
1136                                &None
1137                            }
1138                        },
1139                        pick_mut: |settings_content| {
1140                            &mut settings_content
1141                                .editor
1142                                .gutter
1143                                .get_or_insert_default()
1144                                .line_numbers
1145                        },
1146                    }),
1147                    metadata: None,
1148                }),
1149                SettingsPageItem::SettingItem(SettingItem {
1150                    title: "Relative Line Numbers",
1151                    description: "Whether the line numbers on editors gutter are relative or not",
1152                    field: Box::new(SettingField {
1153                        pick: |settings_content| &settings_content.editor.relative_line_numbers,
1154                        pick_mut: |settings_content| {
1155                            &mut settings_content.editor.relative_line_numbers
1156                        },
1157                    }),
1158                    metadata: None,
1159                }),
1160                SettingsPageItem::SettingItem(SettingItem {
1161                    title: "Show Runnables",
1162                    description: "Whether to show runnable buttons in the gutter",
1163                    field: Box::new(SettingField {
1164                        pick: |settings_content| {
1165                            if let Some(gutter) = &settings_content.editor.gutter {
1166                                &gutter.runnables
1167                            } else {
1168                                &None
1169                            }
1170                        },
1171                        pick_mut: |settings_content| {
1172                            &mut settings_content
1173                                .editor
1174                                .gutter
1175                                .get_or_insert_default()
1176                                .runnables
1177                        },
1178                    }),
1179                    metadata: None,
1180                }),
1181                SettingsPageItem::SettingItem(SettingItem {
1182                    title: "Show Breakpoints",
1183                    description: "Whether to show breakpoints in the gutter",
1184                    field: Box::new(SettingField {
1185                        pick: |settings_content| {
1186                            if let Some(gutter) = &settings_content.editor.gutter {
1187                                &gutter.breakpoints
1188                            } else {
1189                                &None
1190                            }
1191                        },
1192                        pick_mut: |settings_content| {
1193                            &mut settings_content
1194                                .editor
1195                                .gutter
1196                                .get_or_insert_default()
1197                                .breakpoints
1198                        },
1199                    }),
1200                    metadata: None,
1201                }),
1202                SettingsPageItem::SettingItem(SettingItem {
1203                    title: "Show Folds",
1204                    description: "Whether to show code folding controls in the gutter",
1205                    field: Box::new(SettingField {
1206                        pick: |settings_content| {
1207                            if let Some(gutter) = &settings_content.editor.gutter {
1208                                &gutter.folds
1209                            } else {
1210                                &None
1211                            }
1212                        },
1213                        pick_mut: |settings_content| {
1214                            &mut settings_content.editor.gutter.get_or_insert_default().folds
1215                        },
1216                    }),
1217                    metadata: None,
1218                }),
1219                SettingsPageItem::SettingItem(SettingItem {
1220                    title: "Min Line Number Digits",
1221                    description: "Minimum number of characters to reserve space for in the gutter.",
1222                    field: Box::new(SettingField {
1223                        pick: |settings_content| {
1224                            if let Some(gutter) = &settings_content.editor.gutter {
1225                                &gutter.min_line_number_digits
1226                            } else {
1227                                &None
1228                            }
1229                        },
1230                        pick_mut: |settings_content| {
1231                            &mut settings_content
1232                                .editor
1233                                .gutter
1234                                .get_or_insert_default()
1235                                .min_line_number_digits
1236                        },
1237                    }),
1238                    metadata: None,
1239                }),
1240                SettingsPageItem::SectionHeader("Scrollbar"),
1241                SettingsPageItem::SettingItem(SettingItem {
1242                    title: "Show",
1243                    description: "When to show the scrollbar in the editor",
1244                    field: Box::new(SettingField {
1245                        pick: |settings_content| {
1246                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
1247                                &scrollbar.show
1248                            } else {
1249                                &None
1250                            }
1251                        },
1252                        pick_mut: |settings_content| {
1253                            &mut settings_content
1254                                .editor
1255                                .scrollbar
1256                                .get_or_insert_default()
1257                                .show
1258                        },
1259                    }),
1260                    metadata: None,
1261                }),
1262                SettingsPageItem::SettingItem(SettingItem {
1263                    title: "Cursors",
1264                    description: "Whether to show cursor positions in the scrollbar",
1265                    field: Box::new(SettingField {
1266                        pick: |settings_content| {
1267                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
1268                                &scrollbar.cursors
1269                            } else {
1270                                &None
1271                            }
1272                        },
1273                        pick_mut: |settings_content| {
1274                            &mut settings_content
1275                                .editor
1276                                .scrollbar
1277                                .get_or_insert_default()
1278                                .cursors
1279                        },
1280                    }),
1281                    metadata: None,
1282                }),
1283                SettingsPageItem::SettingItem(SettingItem {
1284                    title: "Git Diff",
1285                    description: "Whether to show git diff indicators in the scrollbar",
1286                    field: Box::new(SettingField {
1287                        pick: |settings_content| {
1288                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
1289                                &scrollbar.git_diff
1290                            } else {
1291                                &None
1292                            }
1293                        },
1294                        pick_mut: |settings_content| {
1295                            &mut settings_content
1296                                .editor
1297                                .scrollbar
1298                                .get_or_insert_default()
1299                                .git_diff
1300                        },
1301                    }),
1302                    metadata: None,
1303                }),
1304                SettingsPageItem::SettingItem(SettingItem {
1305                    title: "Search Results",
1306                    description: "Whether to show buffer search result indicators in the scrollbar",
1307                    field: Box::new(SettingField {
1308                        pick: |settings_content| {
1309                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
1310                                &scrollbar.search_results
1311                            } else {
1312                                &None
1313                            }
1314                        },
1315                        pick_mut: |settings_content| {
1316                            &mut settings_content
1317                                .editor
1318                                .scrollbar
1319                                .get_or_insert_default()
1320                                .search_results
1321                        },
1322                    }),
1323                    metadata: None,
1324                }),
1325                SettingsPageItem::SettingItem(SettingItem {
1326                    title: "Selected Text",
1327                    description: "Whether to show selected text occurrences in the scrollbar",
1328                    field: Box::new(SettingField {
1329                        pick: |settings_content| {
1330                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
1331                                &scrollbar.selected_text
1332                            } else {
1333                                &None
1334                            }
1335                        },
1336                        pick_mut: |settings_content| {
1337                            &mut settings_content
1338                                .editor
1339                                .scrollbar
1340                                .get_or_insert_default()
1341                                .selected_text
1342                        },
1343                    }),
1344                    metadata: None,
1345                }),
1346                SettingsPageItem::SettingItem(SettingItem {
1347                    title: "Selected Symbol",
1348                    description: "Whether to show selected symbol occurrences in the scrollbar",
1349                    field: Box::new(SettingField {
1350                        pick: |settings_content| {
1351                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
1352                                &scrollbar.selected_symbol
1353                            } else {
1354                                &None
1355                            }
1356                        },
1357                        pick_mut: |settings_content| {
1358                            &mut settings_content
1359                                .editor
1360                                .scrollbar
1361                                .get_or_insert_default()
1362                                .selected_symbol
1363                        },
1364                    }),
1365                    metadata: None,
1366                }),
1367                SettingsPageItem::SettingItem(SettingItem {
1368                    title: "Diagnostics",
1369                    description: "Which diagnostic indicators to show in the scrollbar",
1370                    field: Box::new(SettingField {
1371                        pick: |settings_content| {
1372                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
1373                                &scrollbar.diagnostics
1374                            } else {
1375                                &None
1376                            }
1377                        },
1378                        pick_mut: |settings_content| {
1379                            &mut settings_content
1380                                .editor
1381                                .scrollbar
1382                                .get_or_insert_default()
1383                                .diagnostics
1384                        },
1385                    }),
1386                    metadata: None,
1387                }),
1388                SettingsPageItem::SettingItem(SettingItem {
1389                    title: "Horizontal Scrollbar",
1390                    description: "When false, forcefully disables the horizontal scrollbar",
1391                    field: Box::new(SettingField {
1392                        pick: |settings_content| {
1393                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
1394                                if let Some(axes) = &scrollbar.axes {
1395                                    &axes.horizontal
1396                                } else {
1397                                    &None
1398                                }
1399                            } else {
1400                                &None
1401                            }
1402                        },
1403                        pick_mut: |settings_content| {
1404                            &mut settings_content
1405                                .editor
1406                                .scrollbar
1407                                .get_or_insert_default()
1408                                .axes
1409                                .get_or_insert_default()
1410                                .horizontal
1411                        },
1412                    }),
1413                    metadata: None,
1414                }),
1415                SettingsPageItem::SettingItem(SettingItem {
1416                    title: "Vertical Scrollbar",
1417                    description: "When false, forcefully disables the vertical scrollbar",
1418                    field: Box::new(SettingField {
1419                        pick: |settings_content| {
1420                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
1421                                if let Some(axes) = &scrollbar.axes {
1422                                    &axes.vertical
1423                                } else {
1424                                    &None
1425                                }
1426                            } else {
1427                                &None
1428                            }
1429                        },
1430                        pick_mut: |settings_content| {
1431                            &mut settings_content
1432                                .editor
1433                                .scrollbar
1434                                .get_or_insert_default()
1435                                .axes
1436                                .get_or_insert_default()
1437                                .vertical
1438                        },
1439                    }),
1440                    metadata: None,
1441                }),
1442                SettingsPageItem::SectionHeader("Minimap"),
1443                SettingsPageItem::SettingItem(SettingItem {
1444                    title: "Show",
1445                    description: "When to show the minimap in the editor",
1446                    field: Box::new(SettingField {
1447                        pick: |settings_content| {
1448                            if let Some(minimap) = &settings_content.editor.minimap {
1449                                &minimap.show
1450                            } else {
1451                                &None
1452                            }
1453                        },
1454                        pick_mut: |settings_content| {
1455                            &mut settings_content.editor.minimap.get_or_insert_default().show
1456                        },
1457                    }),
1458                    metadata: None,
1459                }),
1460                SettingsPageItem::SettingItem(SettingItem {
1461                    title: "Display In",
1462                    description: "Where to show the minimap in the editor",
1463                    field: Box::new(SettingField {
1464                        pick: |settings_content| {
1465                            if let Some(minimap) = &settings_content.editor.minimap {
1466                                &minimap.display_in
1467                            } else {
1468                                &None
1469                            }
1470                        },
1471                        pick_mut: |settings_content| {
1472                            &mut settings_content
1473                                .editor
1474                                .minimap
1475                                .get_or_insert_default()
1476                                .display_in
1477                        },
1478                    }),
1479                    metadata: None,
1480                }),
1481                SettingsPageItem::SettingItem(SettingItem {
1482                    title: "Thumb",
1483                    description: "When to show the minimap thumb",
1484                    field: Box::new(SettingField {
1485                        pick: |settings_content| {
1486                            if let Some(minimap) = &settings_content.editor.minimap {
1487                                &minimap.thumb
1488                            } else {
1489                                &None
1490                            }
1491                        },
1492                        pick_mut: |settings_content| {
1493                            &mut settings_content
1494                                .editor
1495                                .minimap
1496                                .get_or_insert_default()
1497                                .thumb
1498                        },
1499                    }),
1500                    metadata: None,
1501                }),
1502                SettingsPageItem::SettingItem(SettingItem {
1503                    title: "Thumb Border",
1504                    description: "Border style for the minimap's scrollbar thumb",
1505                    field: Box::new(SettingField {
1506                        pick: |settings_content| {
1507                            if let Some(minimap) = &settings_content.editor.minimap {
1508                                &minimap.thumb_border
1509                            } else {
1510                                &None
1511                            }
1512                        },
1513                        pick_mut: |settings_content| {
1514                            &mut settings_content
1515                                .editor
1516                                .minimap
1517                                .get_or_insert_default()
1518                                .thumb_border
1519                        },
1520                    }),
1521                    metadata: None,
1522                }),
1523                SettingsPageItem::SettingItem(SettingItem {
1524                    title: "Current Line Highlight",
1525                    description: "How to highlight the current line in the minimap",
1526                    field: Box::new(SettingField {
1527                        pick: |settings_content| {
1528                            if let Some(minimap) = &settings_content.editor.minimap
1529                                && minimap.current_line_highlight.is_some()
1530                            {
1531                                &minimap.current_line_highlight
1532                            } else {
1533                                &settings_content.editor.current_line_highlight
1534                            }
1535                        },
1536                        pick_mut: |settings_content| {
1537                            &mut settings_content
1538                                .editor
1539                                .minimap
1540                                .get_or_insert_default()
1541                                .current_line_highlight
1542                        },
1543                    }),
1544                    metadata: None,
1545                }),
1546                SettingsPageItem::SettingItem(SettingItem {
1547                    title: "Max Width Columns",
1548                    description: "Maximum number of columns to display in the minimap",
1549                    field: Box::new(SettingField {
1550                        pick: |settings_content| {
1551                            if let Some(minimap) = &settings_content.editor.minimap {
1552                                &minimap.max_width_columns
1553                            } else {
1554                                &None
1555                            }
1556                        },
1557                        pick_mut: |settings_content| {
1558                            &mut settings_content
1559                                .editor
1560                                .minimap
1561                                .get_or_insert_default()
1562                                .max_width_columns
1563                        },
1564                    }),
1565                    metadata: None,
1566                }),
1567                SettingsPageItem::SectionHeader("Tabs"),
1568                SettingsPageItem::SettingItem(SettingItem {
1569                    title: "Show Tab Bar",
1570                    description: "Whether or not to show the tab bar in the editor",
1571                    field: Box::new(SettingField {
1572                        pick: |settings_content| {
1573                            if let Some(tab_bar) = &settings_content.tab_bar {
1574                                &tab_bar.show
1575                            } else {
1576                                &None
1577                            }
1578                        },
1579                        pick_mut: |settings_content| {
1580                            &mut settings_content.tab_bar.get_or_insert_default().show
1581                        },
1582                    }),
1583                    metadata: None,
1584                }),
1585                SettingsPageItem::SettingItem(SettingItem {
1586                    title: "Show Git Status In Tabs",
1587                    description: "Whether to show the Git file status on a tab item",
1588                    field: Box::new(SettingField {
1589                        pick: |settings_content| {
1590                            if let Some(tabs) = &settings_content.tabs {
1591                                &tabs.git_status
1592                            } else {
1593                                &None
1594                            }
1595                        },
1596                        pick_mut: |settings_content| {
1597                            &mut settings_content.tabs.get_or_insert_default().git_status
1598                        },
1599                    }),
1600                    metadata: None,
1601                }),
1602                SettingsPageItem::SettingItem(SettingItem {
1603                    title: "Show File Icons In Tabs",
1604                    description: "Whether to show the file icon for a tab",
1605                    field: Box::new(SettingField {
1606                        pick: |settings_content| {
1607                            if let Some(tabs) = &settings_content.tabs {
1608                                &tabs.file_icons
1609                            } else {
1610                                &None
1611                            }
1612                        },
1613                        pick_mut: |settings_content| {
1614                            &mut settings_content.tabs.get_or_insert_default().file_icons
1615                        },
1616                    }),
1617                    metadata: None,
1618                }),
1619                SettingsPageItem::SettingItem(SettingItem {
1620                    title: "Tab Close Position",
1621                    description: "Position of the close button in a tab",
1622                    field: Box::new(SettingField {
1623                        pick: |settings_content| {
1624                            if let Some(tabs) = &settings_content.tabs {
1625                                &tabs.close_position
1626                            } else {
1627                                &None
1628                            }
1629                        },
1630                        pick_mut: |settings_content| {
1631                            &mut settings_content.tabs.get_or_insert_default().close_position
1632                        },
1633                    }),
1634                    metadata: None,
1635                }),
1636                // SettingsPageItem::SettingItem(SettingItem {
1637                //     title: "Maximum Tabs",
1638                //     description: "Maximum open tabs in a pane. Will not close an unsaved tab",
1639                //     // todo(settings_ui): The default for this value is null and it's use in code
1640                //     // is complex, so I'm going to come back to this later
1641                //     field: Box::new(SettingField {
1642                //         pick: |settings_content| &settings_content.workspace.max_tabs,
1643                //         pick_mut: |settings_content| &mut settings_content.workspace.max_tabs,
1644                //     }),
1645                //     metadata: None,
1646                // }),
1647                SettingsPageItem::SectionHeader("Toolbar"),
1648                SettingsPageItem::SettingItem(SettingItem {
1649                    title: "Breadcrumbs",
1650                    description: "Whether to show breadcrumbs",
1651                    field: Box::new(SettingField {
1652                        pick: |settings_content| {
1653                            if let Some(toolbar) = &settings_content.editor.toolbar {
1654                                &toolbar.breadcrumbs
1655                            } else {
1656                                &None
1657                            }
1658                        },
1659                        pick_mut: |settings_content| {
1660                            &mut settings_content
1661                                .editor
1662                                .toolbar
1663                                .get_or_insert_default()
1664                                .breadcrumbs
1665                        },
1666                    }),
1667                    metadata: None,
1668                }),
1669                SettingsPageItem::SettingItem(SettingItem {
1670                    title: "Quick Actions",
1671                    description: "Whether to show quick action buttons (e.g., search, selection, editor controls, etc.)",
1672                    field: Box::new(SettingField {
1673                        pick: |settings_content| {
1674                            if let Some(toolbar) = &settings_content.editor.toolbar {
1675                                &toolbar.quick_actions
1676                            } else {
1677                                &None
1678                            }
1679                        },
1680                        pick_mut: |settings_content| {
1681                            &mut settings_content
1682                                .editor
1683                                .toolbar
1684                                .get_or_insert_default()
1685                                .quick_actions
1686                        },
1687                    }),
1688                    metadata: None,
1689                }),
1690                SettingsPageItem::SettingItem(SettingItem {
1691                    title: "Selections Menu",
1692                    description: "Whether to show the selections menu in the editor toolbar",
1693                    field: Box::new(SettingField {
1694                        pick: |settings_content| {
1695                            if let Some(toolbar) = &settings_content.editor.toolbar {
1696                                &toolbar.selections_menu
1697                            } else {
1698                                &None
1699                            }
1700                        },
1701                        pick_mut: |settings_content| {
1702                            &mut settings_content
1703                                .editor
1704                                .toolbar
1705                                .get_or_insert_default()
1706                                .selections_menu
1707                        },
1708                    }),
1709                    metadata: None,
1710                }),
1711                SettingsPageItem::SettingItem(SettingItem {
1712                    title: "Agent Review",
1713                    description: "Whether to show agent review buttons in the editor toolbar",
1714                    field: Box::new(SettingField {
1715                        pick: |settings_content| {
1716                            if let Some(toolbar) = &settings_content.editor.toolbar {
1717                                &toolbar.agent_review
1718                            } else {
1719                                &None
1720                            }
1721                        },
1722                        pick_mut: |settings_content| {
1723                            &mut settings_content
1724                                .editor
1725                                .toolbar
1726                                .get_or_insert_default()
1727                                .agent_review
1728                        },
1729                    }),
1730                    metadata: None,
1731                }),
1732                SettingsPageItem::SettingItem(SettingItem {
1733                    title: "Code Actions",
1734                    description: "Whether to show code action buttons in the editor toolbar",
1735                    field: Box::new(SettingField {
1736                        pick: |settings_content| {
1737                            if let Some(toolbar) = &settings_content.editor.toolbar {
1738                                &toolbar.code_actions
1739                            } else {
1740                                &None
1741                            }
1742                        },
1743                        pick_mut: |settings_content| {
1744                            &mut settings_content
1745                                .editor
1746                                .toolbar
1747                                .get_or_insert_default()
1748                                .code_actions
1749                        },
1750                    }),
1751                    metadata: None,
1752                }),
1753            ],
1754        },
1755        SettingsPage {
1756            title: "Languages & Frameworks",
1757            items: {
1758                let mut items = vec![
1759                    SettingsPageItem::SectionHeader(LANGUAGES_SECTION_HEADER),
1760                    SettingsPageItem::SubPageLink(SubPageLink {
1761                        title: "JSON",
1762                        render: Arc::new(|this, window, cx| {
1763                            this.render_page_items(language_settings_data().iter(), window, cx)
1764                                .into_any_element()
1765                        }),
1766                    }),
1767                    SettingsPageItem::SubPageLink(SubPageLink {
1768                        title: "JSONC",
1769                        render: Arc::new(|this, window, cx| {
1770                            this.render_page_items(language_settings_data().iter(), window, cx)
1771                                .into_any_element()
1772                        }),
1773                    }),
1774                    SettingsPageItem::SubPageLink(SubPageLink {
1775                        title: "Rust",
1776                        render: Arc::new(|this, window, cx| {
1777                            this.render_page_items(language_settings_data().iter(), window, cx)
1778                                .into_any_element()
1779                        }),
1780                    }),
1781                    SettingsPageItem::SubPageLink(SubPageLink {
1782                        title: "Python",
1783                        render: Arc::new(|this, window, cx| {
1784                            this.render_page_items(language_settings_data().iter(), window, cx)
1785                                .into_any_element()
1786                        }),
1787                    }),
1788                    SettingsPageItem::SubPageLink(SubPageLink {
1789                        title: "TSX",
1790                        render: Arc::new(|this, window, cx| {
1791                            this.render_page_items(language_settings_data().iter(), window, cx)
1792                                .into_any_element()
1793                        }),
1794                    }),
1795                ];
1796
1797                items.push(SettingsPageItem::SectionHeader("Default Language Settings"));
1798                items.extend(language_settings_data());
1799
1800                items
1801            },
1802        },
1803        SettingsPage {
1804            title: "Workbench & Window",
1805            items: vec![
1806                SettingsPageItem::SectionHeader("Status Bar"),
1807                SettingsPageItem::SettingItem(SettingItem {
1808                    title: "Active Language Button",
1809                    description: "Whether to show the active language button in the status bar",
1810                    field: Box::new(SettingField {
1811                        pick: |settings_content| {
1812                            if let Some(status_bar) = &settings_content.status_bar {
1813                                &status_bar.active_language_button
1814                            } else {
1815                                &None
1816                            }
1817                        },
1818                        pick_mut: |settings_content| {
1819                            &mut settings_content
1820                                .status_bar
1821                                .get_or_insert_default()
1822                                .active_language_button
1823                        },
1824                    }),
1825                    metadata: None,
1826                }),
1827                SettingsPageItem::SettingItem(SettingItem {
1828                    title: "Cursor Position Button",
1829                    description: "Whether to show the cursor position button in the status bar",
1830                    field: Box::new(SettingField {
1831                        pick: |settings_content| {
1832                            if let Some(status_bar) = &settings_content.status_bar {
1833                                &status_bar.cursor_position_button
1834                            } else {
1835                                &None
1836                            }
1837                        },
1838                        pick_mut: |settings_content| {
1839                            &mut settings_content
1840                                .status_bar
1841                                .get_or_insert_default()
1842                                .cursor_position_button
1843                        },
1844                    }),
1845                    metadata: None,
1846                }),
1847                SettingsPageItem::SettingItem(SettingItem {
1848                    title: "Terminal Button",
1849                    description: "Whether to show the terminal button in the status bar",
1850                    field: Box::new(SettingField {
1851                        pick: |settings_content| {
1852                            if let Some(terminal) = &settings_content.terminal {
1853                                &terminal.button
1854                            } else {
1855                                &None
1856                            }
1857                        },
1858                        pick_mut: |settings_content| {
1859                            &mut settings_content.terminal.get_or_insert_default().button
1860                        },
1861                    }),
1862                    metadata: None,
1863                }),
1864                SettingsPageItem::SettingItem(SettingItem {
1865                    title: "Diagnostics Button",
1866                    description: "Whether to show the project diagnostics button in the status bar",
1867                    field: Box::new(SettingField {
1868                        pick: |settings_content| {
1869                            if let Some(diagnostics) = &settings_content.diagnostics {
1870                                &diagnostics.button
1871                            } else {
1872                                &None
1873                            }
1874                        },
1875                        pick_mut: |settings_content| {
1876                            &mut settings_content.diagnostics.get_or_insert_default().button
1877                        },
1878                    }),
1879                    metadata: None,
1880                }),
1881                SettingsPageItem::SettingItem(SettingItem {
1882                    title: "Project Search Button",
1883                    description: "Whether to show the project search button in the status bar",
1884                    field: Box::new(SettingField {
1885                        pick: |settings_content| {
1886                            if let Some(search) = &settings_content.editor.search {
1887                                &search.button
1888                            } else {
1889                                &None
1890                            }
1891                        },
1892                        pick_mut: |settings_content| {
1893                            &mut settings_content
1894                                .editor
1895                                .search
1896                                .get_or_insert_default()
1897                                .button
1898                        },
1899                    }),
1900                    metadata: None,
1901                }),
1902                SettingsPageItem::SectionHeader("Tab Bar"),
1903                SettingsPageItem::SettingItem(SettingItem {
1904                    title: "Editor Tabs",
1905                    description: "Whether or not to show the tab bar in the editor",
1906                    field: Box::new(SettingField {
1907                        pick: |settings_content| {
1908                            if let Some(tab_bar) = &settings_content.tab_bar {
1909                                &tab_bar.show
1910                            } else {
1911                                &None
1912                            }
1913                        },
1914                        pick_mut: |settings_content| {
1915                            &mut settings_content.tab_bar.get_or_insert_default().show
1916                        },
1917                    }),
1918                    metadata: None,
1919                }),
1920                SettingsPageItem::SettingItem(SettingItem {
1921                    title: "Show Navigation History Buttons",
1922                    description: "Whether or not to show the navigation history buttons in the tab bar",
1923                    field: Box::new(SettingField {
1924                        pick: |settings_content| {
1925                            if let Some(tab_bar) = &settings_content.tab_bar {
1926                                &tab_bar.show_nav_history_buttons
1927                            } else {
1928                                &None
1929                            }
1930                        },
1931                        pick_mut: |settings_content| {
1932                            &mut settings_content
1933                                .tab_bar
1934                                .get_or_insert_default()
1935                                .show_nav_history_buttons
1936                        },
1937                    }),
1938                    metadata: None,
1939                }),
1940                SettingsPageItem::SectionHeader("Title Bar"),
1941                SettingsPageItem::SettingItem(SettingItem {
1942                    title: "Show Branch Icon",
1943                    description: "Whether to show the branch icon beside branch switcher in the titlebar",
1944                    field: Box::new(SettingField {
1945                        pick: |settings_content| {
1946                            if let Some(title_bar) = &settings_content.title_bar {
1947                                &title_bar.show_branch_icon
1948                            } else {
1949                                &None
1950                            }
1951                        },
1952                        pick_mut: |settings_content| {
1953                            &mut settings_content
1954                                .title_bar
1955                                .get_or_insert_default()
1956                                .show_branch_icon
1957                        },
1958                    }),
1959                    metadata: None,
1960                }),
1961                SettingsPageItem::SettingItem(SettingItem {
1962                    title: "Show Branch Name",
1963                    description: "Whether to show the branch name button in the titlebar",
1964                    field: Box::new(SettingField {
1965                        pick: |settings_content| {
1966                            if let Some(title_bar) = &settings_content.title_bar {
1967                                &title_bar.show_branch_name
1968                            } else {
1969                                &None
1970                            }
1971                        },
1972                        pick_mut: |settings_content| {
1973                            &mut settings_content
1974                                .title_bar
1975                                .get_or_insert_default()
1976                                .show_branch_name
1977                        },
1978                    }),
1979                    metadata: None,
1980                }),
1981                SettingsPageItem::SettingItem(SettingItem {
1982                    title: "Show Project Items",
1983                    description: "Whether to show the project host and name in the titlebar",
1984                    field: Box::new(SettingField {
1985                        pick: |settings_content| {
1986                            if let Some(title_bar) = &settings_content.title_bar {
1987                                &title_bar.show_project_items
1988                            } else {
1989                                &None
1990                            }
1991                        },
1992                        pick_mut: |settings_content| {
1993                            &mut settings_content
1994                                .title_bar
1995                                .get_or_insert_default()
1996                                .show_project_items
1997                        },
1998                    }),
1999                    metadata: None,
2000                }),
2001                SettingsPageItem::SettingItem(SettingItem {
2002                    title: "Show Onboarding Banner",
2003                    description: "Whether to show onboarding banners in the titlebar",
2004                    field: Box::new(SettingField {
2005                        pick: |settings_content| {
2006                            if let Some(title_bar) = &settings_content.title_bar {
2007                                &title_bar.show_onboarding_banner
2008                            } else {
2009                                &None
2010                            }
2011                        },
2012                        pick_mut: |settings_content| {
2013                            &mut settings_content
2014                                .title_bar
2015                                .get_or_insert_default()
2016                                .show_onboarding_banner
2017                        },
2018                    }),
2019                    metadata: None,
2020                }),
2021                SettingsPageItem::SettingItem(SettingItem {
2022                    title: "Show User Picture",
2023                    description: "Whether to show user picture in the titlebar",
2024                    field: Box::new(SettingField {
2025                        pick: |settings_content| {
2026                            if let Some(title_bar) = &settings_content.title_bar {
2027                                &title_bar.show_user_picture
2028                            } else {
2029                                &None
2030                            }
2031                        },
2032                        pick_mut: |settings_content| {
2033                            &mut settings_content
2034                                .title_bar
2035                                .get_or_insert_default()
2036                                .show_user_picture
2037                        },
2038                    }),
2039                    metadata: None,
2040                }),
2041                SettingsPageItem::SettingItem(SettingItem {
2042                    title: "Show Sign In",
2043                    description: "Whether to show the sign in button in the titlebar",
2044                    field: Box::new(SettingField {
2045                        pick: |settings_content| {
2046                            if let Some(title_bar) = &settings_content.title_bar {
2047                                &title_bar.show_sign_in
2048                            } else {
2049                                &None
2050                            }
2051                        },
2052                        pick_mut: |settings_content| {
2053                            &mut settings_content
2054                                .title_bar
2055                                .get_or_insert_default()
2056                                .show_sign_in
2057                        },
2058                    }),
2059                    metadata: None,
2060                }),
2061                SettingsPageItem::SettingItem(SettingItem {
2062                    title: "Show Menus",
2063                    description: "Whether to show the menus in the titlebar",
2064                    field: Box::new(SettingField {
2065                        pick: |settings_content| {
2066                            if let Some(title_bar) = &settings_content.title_bar {
2067                                &title_bar.show_menus
2068                            } else {
2069                                &None
2070                            }
2071                        },
2072                        pick_mut: |settings_content| {
2073                            &mut settings_content
2074                                .title_bar
2075                                .get_or_insert_default()
2076                                .show_menus
2077                        },
2078                    }),
2079                    metadata: None,
2080                }),
2081                SettingsPageItem::SectionHeader("Tab Settings"),
2082                SettingsPageItem::SettingItem(SettingItem {
2083                    title: "Activate On Close",
2084                    description: "What to do after closing the current tab",
2085                    field: Box::new(SettingField {
2086                        pick: |settings_content| {
2087                            if let Some(tabs) = &settings_content.tabs {
2088                                &tabs.activate_on_close
2089                            } else {
2090                                &None
2091                            }
2092                        },
2093                        pick_mut: |settings_content| {
2094                            &mut settings_content
2095                                .tabs
2096                                .get_or_insert_default()
2097                                .activate_on_close
2098                        },
2099                    }),
2100                    metadata: None,
2101                }),
2102                SettingsPageItem::SettingItem(SettingItem {
2103                    title: "Tab Show Diagnostics",
2104                    description: "Which files containing diagnostic errors/warnings to mark in the tabs",
2105                    field: Box::new(SettingField {
2106                        pick: |settings_content| {
2107                            if let Some(tabs) = &settings_content.tabs {
2108                                &tabs.show_diagnostics
2109                            } else {
2110                                &None
2111                            }
2112                        },
2113                        pick_mut: |settings_content| {
2114                            &mut settings_content
2115                                .tabs
2116                                .get_or_insert_default()
2117                                .show_diagnostics
2118                        },
2119                    }),
2120                    metadata: None,
2121                }),
2122                SettingsPageItem::SettingItem(SettingItem {
2123                    title: "Show Close Button",
2124                    description: "Controls the appearance behavior of the tab's close button",
2125                    field: Box::new(SettingField {
2126                        pick: |settings_content| {
2127                            if let Some(tabs) = &settings_content.tabs {
2128                                &tabs.show_close_button
2129                            } else {
2130                                &None
2131                            }
2132                        },
2133                        pick_mut: |settings_content| {
2134                            &mut settings_content
2135                                .tabs
2136                                .get_or_insert_default()
2137                                .show_close_button
2138                        },
2139                    }),
2140                    metadata: None,
2141                }),
2142                SettingsPageItem::SectionHeader("Preview Tabs"),
2143                SettingsPageItem::SettingItem(SettingItem {
2144                    title: "Preview Tabs Enabled",
2145                    description: "Whether to show opened editors as preview tabs",
2146                    field: Box::new(SettingField {
2147                        pick: |settings_content| {
2148                            if let Some(preview_tabs) = &settings_content.preview_tabs {
2149                                &preview_tabs.enabled
2150                            } else {
2151                                &None
2152                            }
2153                        },
2154                        pick_mut: |settings_content| {
2155                            &mut settings_content
2156                                .preview_tabs
2157                                .get_or_insert_default()
2158                                .enabled
2159                        },
2160                    }),
2161                    metadata: None,
2162                }),
2163                SettingsPageItem::SettingItem(SettingItem {
2164                    title: "Enable Preview From File Finder",
2165                    description: "Whether to open tabs in preview mode when selected from the file finder",
2166                    field: Box::new(SettingField {
2167                        pick: |settings_content| {
2168                            if let Some(preview_tabs) = &settings_content.preview_tabs {
2169                                &preview_tabs.enable_preview_from_file_finder
2170                            } else {
2171                                &None
2172                            }
2173                        },
2174                        pick_mut: |settings_content| {
2175                            &mut settings_content
2176                                .preview_tabs
2177                                .get_or_insert_default()
2178                                .enable_preview_from_file_finder
2179                        },
2180                    }),
2181                    metadata: None,
2182                }),
2183                SettingsPageItem::SettingItem(SettingItem {
2184                    title: "Enable Preview From Code Navigation",
2185                    description: "Whether a preview tab gets replaced when code navigation is used to navigate away from the tab",
2186                    field: Box::new(SettingField {
2187                        pick: |settings_content| {
2188                            if let Some(preview_tabs) = &settings_content.preview_tabs {
2189                                &preview_tabs.enable_preview_from_code_navigation
2190                            } else {
2191                                &None
2192                            }
2193                        },
2194                        pick_mut: |settings_content| {
2195                            &mut settings_content
2196                                .preview_tabs
2197                                .get_or_insert_default()
2198                                .enable_preview_from_code_navigation
2199                        },
2200                    }),
2201                    metadata: None,
2202                }),
2203                SettingsPageItem::SectionHeader("Search Settings"),
2204                SettingsPageItem::SettingItem(SettingItem {
2205                    title: "Whole Word",
2206                    description: "Whether to search for whole words by default",
2207                    field: Box::new(SettingField {
2208                        pick: |settings_content| {
2209                            if let Some(search) = &settings_content.editor.search {
2210                                &search.whole_word
2211                            } else {
2212                                &None
2213                            }
2214                        },
2215                        pick_mut: |settings_content| {
2216                            &mut settings_content
2217                                .editor
2218                                .search
2219                                .get_or_insert_default()
2220                                .whole_word
2221                        },
2222                    }),
2223                    metadata: None,
2224                }),
2225                SettingsPageItem::SettingItem(SettingItem {
2226                    title: "Case Sensitive",
2227                    description: "Whether to search case-sensitively by default",
2228                    field: Box::new(SettingField {
2229                        pick: |settings_content| {
2230                            if let Some(search) = &settings_content.editor.search {
2231                                &search.case_sensitive
2232                            } else {
2233                                &None
2234                            }
2235                        },
2236                        pick_mut: |settings_content| {
2237                            &mut settings_content
2238                                .editor
2239                                .search
2240                                .get_or_insert_default()
2241                                .case_sensitive
2242                        },
2243                    }),
2244                    metadata: None,
2245                }),
2246                SettingsPageItem::SettingItem(SettingItem {
2247                    title: "Include Ignored",
2248                    description: "Whether to include ignored files in search results by default",
2249                    field: Box::new(SettingField {
2250                        pick: |settings_content| {
2251                            if let Some(search) = &settings_content.editor.search {
2252                                &search.include_ignored
2253                            } else {
2254                                &None
2255                            }
2256                        },
2257                        pick_mut: |settings_content| {
2258                            &mut settings_content
2259                                .editor
2260                                .search
2261                                .get_or_insert_default()
2262                                .include_ignored
2263                        },
2264                    }),
2265                    metadata: None,
2266                }),
2267                SettingsPageItem::SettingItem(SettingItem {
2268                    title: "Regex",
2269                    description: "Whether to use regex search by default",
2270                    field: Box::new(SettingField {
2271                        pick: |settings_content| {
2272                            if let Some(search) = &settings_content.editor.search {
2273                                &search.regex
2274                            } else {
2275                                &None
2276                            }
2277                        },
2278                        pick_mut: |settings_content| {
2279                            &mut settings_content.editor.search.get_or_insert_default().regex
2280                        },
2281                    }),
2282                    metadata: None,
2283                }),
2284                SettingsPageItem::SectionHeader("File Finder"),
2285                SettingsPageItem::SettingItem(SettingItem {
2286                    title: "File Icons",
2287                    description: "Whether to show file icons in the file finder",
2288                    field: Box::new(SettingField {
2289                        pick: |settings_content| {
2290                            if let Some(file_finder) = &settings_content.file_finder {
2291                                &file_finder.file_icons
2292                            } else {
2293                                &None
2294                            }
2295                        },
2296                        pick_mut: |settings_content| {
2297                            &mut settings_content
2298                                .file_finder
2299                                .get_or_insert_default()
2300                                .file_icons
2301                        },
2302                    }),
2303                    metadata: None,
2304                }),
2305                SettingsPageItem::SettingItem(SettingItem {
2306                    title: "Modal Max Width",
2307                    description: "Determines how much space the file finder can take up in relation to the available window width",
2308                    field: Box::new(SettingField {
2309                        pick: |settings_content| {
2310                            if let Some(file_finder) = &settings_content.file_finder {
2311                                &file_finder.modal_max_width
2312                            } else {
2313                                &None
2314                            }
2315                        },
2316                        pick_mut: |settings_content| {
2317                            &mut settings_content
2318                                .file_finder
2319                                .get_or_insert_default()
2320                                .modal_max_width
2321                        },
2322                    }),
2323                    metadata: None,
2324                }),
2325                SettingsPageItem::SettingItem(SettingItem {
2326                    title: "Skip Focus For Active In Search",
2327                    description: "Whether the file finder should skip focus for the active file in search results",
2328                    field: Box::new(SettingField {
2329                        pick: |settings_content| {
2330                            if let Some(file_finder) = &settings_content.file_finder {
2331                                &file_finder.skip_focus_for_active_in_search
2332                            } else {
2333                                &None
2334                            }
2335                        },
2336                        pick_mut: |settings_content| {
2337                            &mut settings_content
2338                                .file_finder
2339                                .get_or_insert_default()
2340                                .skip_focus_for_active_in_search
2341                        },
2342                    }),
2343                    metadata: None,
2344                }),
2345                SettingsPageItem::SettingItem(SettingItem {
2346                    title: "Git Status",
2347                    description: "Whether to show the git status in the file finder",
2348                    field: Box::new(SettingField {
2349                        pick: |settings_content| {
2350                            if let Some(file_finder) = &settings_content.file_finder {
2351                                &file_finder.git_status
2352                            } else {
2353                                &None
2354                            }
2355                        },
2356                        pick_mut: |settings_content| {
2357                            &mut settings_content
2358                                .file_finder
2359                                .get_or_insert_default()
2360                                .git_status
2361                        },
2362                    }),
2363                    metadata: None,
2364                }),
2365                // todo: null by default
2366                // SettingsPageItem::SettingItem(SettingItem {
2367                //     title: "Include Ignored",
2368                //     description: "Whether to use gitignored files when searching",
2369                //     field: Box::new(SettingField {
2370                //         pick: |settings_content| {
2371                //             if let Some(file_finder) = &settings_content.file_finder {
2372                //                 &file_finder.include_ignored
2373                //             } else {
2374                //                 &None
2375                //             }
2376                //         },
2377                //         pick_mut: |settings_content| {
2378                //             &mut settings_content
2379                //                 .file_finder
2380                //                 .get_or_insert_default()
2381                //                 .include_ignored
2382                //         },
2383                //     }),
2384                //     metadata: None,
2385                // }),
2386            ],
2387        },
2388        SettingsPage {
2389            title: "Panels",
2390            items: vec![
2391                SettingsPageItem::SectionHeader("Project Panel"),
2392                SettingsPageItem::SettingItem(SettingItem {
2393                    title: "Project Panel Button",
2394                    description: "Whether to show the project panel button in the status bar",
2395                    field: Box::new(SettingField {
2396                        pick: |settings_content| {
2397                            if let Some(project_panel) = &settings_content.project_panel {
2398                                &project_panel.button
2399                            } else {
2400                                &None
2401                            }
2402                        },
2403                        pick_mut: |settings_content| {
2404                            &mut settings_content
2405                                .project_panel
2406                                .get_or_insert_default()
2407                                .button
2408                        },
2409                    }),
2410                    metadata: None,
2411                }),
2412                SettingsPageItem::SettingItem(SettingItem {
2413                    title: "Project Panel Dock",
2414                    description: "Where to dock the project panel",
2415                    field: Box::new(SettingField {
2416                        pick: |settings_content| {
2417                            if let Some(project_panel) = &settings_content.project_panel {
2418                                &project_panel.dock
2419                            } else {
2420                                &None
2421                            }
2422                        },
2423                        pick_mut: |settings_content| {
2424                            &mut settings_content.project_panel.get_or_insert_default().dock
2425                        },
2426                    }),
2427                    metadata: None,
2428                }),
2429                SettingsPageItem::SettingItem(SettingItem {
2430                    title: "Project Panel Default Width",
2431                    description: "Default width of the project panel in pixels",
2432                    field: Box::new(SettingField {
2433                        pick: |settings_content| {
2434                            if let Some(project_panel) = &settings_content.project_panel {
2435                                &project_panel.default_width
2436                            } else {
2437                                &None
2438                            }
2439                        },
2440                        pick_mut: |settings_content| {
2441                            &mut settings_content
2442                                .project_panel
2443                                .get_or_insert_default()
2444                                .default_width
2445                        },
2446                    }),
2447                    metadata: None,
2448                }),
2449                SettingsPageItem::SettingItem(SettingItem {
2450                    title: "Hide .gitignore",
2451                    description: "Whether to hide the gitignore entries in the project panel",
2452                    field: Box::new(SettingField {
2453                        pick: |settings_content| {
2454                            if let Some(project_panel) = &settings_content.project_panel {
2455                                &project_panel.hide_gitignore
2456                            } else {
2457                                &None
2458                            }
2459                        },
2460                        pick_mut: |settings_content| {
2461                            &mut settings_content
2462                                .project_panel
2463                                .get_or_insert_default()
2464                                .hide_gitignore
2465                        },
2466                    }),
2467                    metadata: None,
2468                }),
2469                SettingsPageItem::SettingItem(SettingItem {
2470                    title: "Entry Spacing",
2471                    description: "Spacing between worktree entries in the project panel",
2472                    field: Box::new(SettingField {
2473                        pick: |settings_content| {
2474                            if let Some(project_panel) = &settings_content.project_panel {
2475                                &project_panel.entry_spacing
2476                            } else {
2477                                &None
2478                            }
2479                        },
2480                        pick_mut: |settings_content| {
2481                            &mut settings_content
2482                                .project_panel
2483                                .get_or_insert_default()
2484                                .entry_spacing
2485                        },
2486                    }),
2487                    metadata: None,
2488                }),
2489                SettingsPageItem::SettingItem(SettingItem {
2490                    title: "File Icons",
2491                    description: "Whether to show folder icons or chevrons for directories in the project panel",
2492                    field: Box::new(SettingField {
2493                        pick: |settings_content| {
2494                            if let Some(project_panel) = &settings_content.project_panel {
2495                                &project_panel.file_icons
2496                            } else {
2497                                &None
2498                            }
2499                        },
2500                        pick_mut: |settings_content| {
2501                            &mut settings_content
2502                                .project_panel
2503                                .get_or_insert_default()
2504                                .file_icons
2505                        },
2506                    }),
2507                    metadata: None,
2508                }),
2509                SettingsPageItem::SettingItem(SettingItem {
2510                    title: "Folder Icons",
2511                    description: "Whether to show folder icons or chevrons for directories in the project panel",
2512                    field: Box::new(SettingField {
2513                        pick: |settings_content| {
2514                            if let Some(project_panel) = &settings_content.project_panel {
2515                                &project_panel.folder_icons
2516                            } else {
2517                                &None
2518                            }
2519                        },
2520                        pick_mut: |settings_content| {
2521                            &mut settings_content
2522                                .project_panel
2523                                .get_or_insert_default()
2524                                .folder_icons
2525                        },
2526                    }),
2527                    metadata: None,
2528                }),
2529                SettingsPageItem::SettingItem(SettingItem {
2530                    title: "Git Status",
2531                    description: "Whether to show the git status in the project panel",
2532                    field: Box::new(SettingField {
2533                        pick: |settings_content| {
2534                            if let Some(project_panel) = &settings_content.project_panel {
2535                                &project_panel.git_status
2536                            } else {
2537                                &None
2538                            }
2539                        },
2540                        pick_mut: |settings_content| {
2541                            &mut settings_content
2542                                .project_panel
2543                                .get_or_insert_default()
2544                                .git_status
2545                        },
2546                    }),
2547                    metadata: None,
2548                }),
2549                SettingsPageItem::SettingItem(SettingItem {
2550                    title: "Indent Size",
2551                    description: "Amount of indentation for nested items",
2552                    field: Box::new(SettingField {
2553                        pick: |settings_content| {
2554                            if let Some(project_panel) = &settings_content.project_panel {
2555                                &project_panel.indent_size
2556                            } else {
2557                                &None
2558                            }
2559                        },
2560                        pick_mut: |settings_content| {
2561                            &mut settings_content
2562                                .project_panel
2563                                .get_or_insert_default()
2564                                .indent_size
2565                        },
2566                    }),
2567                    metadata: None,
2568                }),
2569                SettingsPageItem::SettingItem(SettingItem {
2570                    title: "Auto Reveal Entries",
2571                    description: "Whether to reveal it in the project panel automatically when a corresponding project entry becomes active",
2572                    field: Box::new(SettingField {
2573                        pick: |settings_content| {
2574                            if let Some(project_panel) = &settings_content.project_panel {
2575                                &project_panel.auto_reveal_entries
2576                            } else {
2577                                &None
2578                            }
2579                        },
2580                        pick_mut: |settings_content| {
2581                            &mut settings_content
2582                                .project_panel
2583                                .get_or_insert_default()
2584                                .auto_reveal_entries
2585                        },
2586                    }),
2587                    metadata: None,
2588                }),
2589                SettingsPageItem::SettingItem(SettingItem {
2590                    title: "Starts Open",
2591                    description: "Whether the project panel should open on startup",
2592                    field: Box::new(SettingField {
2593                        pick: |settings_content| {
2594                            if let Some(project_panel) = &settings_content.project_panel {
2595                                &project_panel.starts_open
2596                            } else {
2597                                &None
2598                            }
2599                        },
2600                        pick_mut: |settings_content| {
2601                            &mut settings_content
2602                                .project_panel
2603                                .get_or_insert_default()
2604                                .starts_open
2605                        },
2606                    }),
2607                    metadata: None,
2608                }),
2609                SettingsPageItem::SettingItem(SettingItem {
2610                    title: "Auto Fold Directories",
2611                    description: "Whether to fold directories automatically and show compact folders when a directory has only one subdirectory inside",
2612                    field: Box::new(SettingField {
2613                        pick: |settings_content| {
2614                            if let Some(project_panel) = &settings_content.project_panel {
2615                                &project_panel.auto_fold_dirs
2616                            } else {
2617                                &None
2618                            }
2619                        },
2620                        pick_mut: |settings_content| {
2621                            &mut settings_content
2622                                .project_panel
2623                                .get_or_insert_default()
2624                                .auto_fold_dirs
2625                        },
2626                    }),
2627                    metadata: None,
2628                }),
2629                // SettingsPageItem::SettingItem(SettingItem {
2630                //     title: "Scrollbar Show",
2631                //     description: "When to show the scrollbar in the project panel",
2632                //     field: Box::new(SettingField {
2633                //         pick: |settings_content| {
2634                //             if let Some(project_panel) = &settings_content.project_panel {
2635                //                 if let Some(scrollbar) = &project_panel.scrollbar {
2636                //                     &scrollbar.show
2637                //                 } else {
2638                //                     &None
2639                //                 }
2640                //             } else {
2641                //                 &None
2642                //             }
2643                //         },
2644                //         pick_mut: |settings_content| {
2645                //             &mut settings_content
2646                //                 .project_panel
2647                //                 .get_or_insert_default()
2648                //                 .scrollbar
2649                //         },
2650                //     }),
2651                //     metadata: None,
2652                // }),
2653                SettingsPageItem::SettingItem(SettingItem {
2654                    title: "Show Diagnostics",
2655                    description: "Which files containing diagnostic errors/warnings to mark in the project panel",
2656                    field: Box::new(SettingField {
2657                        pick: |settings_content| {
2658                            if let Some(project_panel) = &settings_content.project_panel {
2659                                &project_panel.show_diagnostics
2660                            } else {
2661                                &None
2662                            }
2663                        },
2664                        pick_mut: |settings_content| {
2665                            &mut settings_content
2666                                .project_panel
2667                                .get_or_insert_default()
2668                                .show_diagnostics
2669                        },
2670                    }),
2671                    metadata: None,
2672                }),
2673                SettingsPageItem::SettingItem(SettingItem {
2674                    title: "Sticky Scroll",
2675                    description: "Whether to stick parent directories at top of the project panel",
2676                    field: Box::new(SettingField {
2677                        pick: |settings_content| {
2678                            if let Some(project_panel) = &settings_content.project_panel {
2679                                &project_panel.sticky_scroll
2680                            } else {
2681                                &None
2682                            }
2683                        },
2684                        pick_mut: |settings_content| {
2685                            &mut settings_content
2686                                .project_panel
2687                                .get_or_insert_default()
2688                                .sticky_scroll
2689                        },
2690                    }),
2691                    metadata: None,
2692                }),
2693                // SettingsPageItem::SettingItem(SettingItem {
2694                //     title: "Indent Guides Show",
2695                //     description: "When to show indent guides in the project panel",
2696                //     field: Box::new(SettingField {
2697                //         pick: |settings_content| {
2698                //             if let Some(project_panel) = &settings_content.project_panel {
2699                //                 if let Some(indent_guides) = &project_panel.indent_guides {
2700                //                     &indent_guides.show
2701                //                 } else {
2702                //                     &None
2703                //                 }
2704                //             } else {
2705                //                 &None
2706                //             }
2707                //         },
2708                //         pick_mut: |settings_content| {
2709                //             &mut settings_content
2710                //                 .project_panel
2711                //                 .get_or_insert_default()
2712                //                 .indent_guides
2713                //                 .get_or_insert_default()
2714                //                 .show
2715                //         },
2716                //     }),
2717                //     metadata: None,
2718                // }),
2719                SettingsPageItem::SettingItem(SettingItem {
2720                    title: "Drag and Drop",
2721                    description: "Whether to enable drag-and-drop operations in the project panel",
2722                    field: Box::new(SettingField {
2723                        pick: |settings_content| {
2724                            if let Some(project_panel) = &settings_content.project_panel {
2725                                &project_panel.drag_and_drop
2726                            } else {
2727                                &None
2728                            }
2729                        },
2730                        pick_mut: |settings_content| {
2731                            &mut settings_content
2732                                .project_panel
2733                                .get_or_insert_default()
2734                                .drag_and_drop
2735                        },
2736                    }),
2737                    metadata: None,
2738                }),
2739                SettingsPageItem::SettingItem(SettingItem {
2740                    title: "Hide Root",
2741                    description: "Whether to hide the root entry when only one folder is open in the window",
2742                    field: Box::new(SettingField {
2743                        pick: |settings_content| {
2744                            if let Some(project_panel) = &settings_content.project_panel {
2745                                &project_panel.hide_root
2746                            } else {
2747                                &None
2748                            }
2749                        },
2750                        pick_mut: |settings_content| {
2751                            &mut settings_content
2752                                .project_panel
2753                                .get_or_insert_default()
2754                                .hide_root
2755                        },
2756                    }),
2757                    metadata: None,
2758                }),
2759                SettingsPageItem::SectionHeader("Terminal Panel"),
2760                SettingsPageItem::SettingItem(SettingItem {
2761                    title: "Terminal Dock",
2762                    description: "Where to dock the terminal panel",
2763                    field: Box::new(SettingField {
2764                        pick: |settings_content| {
2765                            if let Some(terminal) = &settings_content.terminal {
2766                                &terminal.dock
2767                            } else {
2768                                &None
2769                            }
2770                        },
2771                        pick_mut: |settings_content| {
2772                            &mut settings_content.terminal.get_or_insert_default().dock
2773                        },
2774                    }),
2775                    metadata: None,
2776                }),
2777                SettingsPageItem::SectionHeader("Outline Panel"),
2778                SettingsPageItem::SettingItem(SettingItem {
2779                    title: "Outline Panel Button",
2780                    description: "Whether to show the outline panel button in the status bar",
2781                    field: Box::new(SettingField {
2782                        pick: |settings_content| {
2783                            if let Some(outline_panel) = &settings_content.outline_panel {
2784                                &outline_panel.button
2785                            } else {
2786                                &None
2787                            }
2788                        },
2789                        pick_mut: |settings_content| {
2790                            &mut settings_content
2791                                .outline_panel
2792                                .get_or_insert_default()
2793                                .button
2794                        },
2795                    }),
2796                    metadata: None,
2797                }),
2798                SettingsPageItem::SettingItem(SettingItem {
2799                    title: "Outline Panel Dock",
2800                    description: "Where to dock the outline panel",
2801                    field: Box::new(SettingField {
2802                        pick: |settings_content| {
2803                            if let Some(outline_panel) = &settings_content.outline_panel {
2804                                &outline_panel.dock
2805                            } else {
2806                                &None
2807                            }
2808                        },
2809                        pick_mut: |settings_content| {
2810                            &mut settings_content.outline_panel.get_or_insert_default().dock
2811                        },
2812                    }),
2813                    metadata: None,
2814                }),
2815                SettingsPageItem::SettingItem(SettingItem {
2816                    title: "Outline Panel Default Width",
2817                    description: "Default width of the outline panel in pixels",
2818                    field: Box::new(SettingField {
2819                        pick: |settings_content| {
2820                            if let Some(outline_panel) = &settings_content.outline_panel {
2821                                &outline_panel.default_width
2822                            } else {
2823                                &None
2824                            }
2825                        },
2826                        pick_mut: |settings_content| {
2827                            &mut settings_content
2828                                .outline_panel
2829                                .get_or_insert_default()
2830                                .default_width
2831                        },
2832                    }),
2833                    metadata: None,
2834                }),
2835                SettingsPageItem::SettingItem(SettingItem {
2836                    title: "File Icons",
2837                    description: "Whether to show file icons in the outline panel",
2838                    field: Box::new(SettingField {
2839                        pick: |settings_content| {
2840                            if let Some(outline_panel) = &settings_content.outline_panel {
2841                                &outline_panel.file_icons
2842                            } else {
2843                                &None
2844                            }
2845                        },
2846                        pick_mut: |settings_content| {
2847                            &mut settings_content
2848                                .outline_panel
2849                                .get_or_insert_default()
2850                                .file_icons
2851                        },
2852                    }),
2853                    metadata: None,
2854                }),
2855                SettingsPageItem::SettingItem(SettingItem {
2856                    title: "Folder Icons",
2857                    description: "Whether to show folder icons or chevrons for directories in the outline panel",
2858                    field: Box::new(SettingField {
2859                        pick: |settings_content| {
2860                            if let Some(outline_panel) = &settings_content.outline_panel {
2861                                &outline_panel.folder_icons
2862                            } else {
2863                                &None
2864                            }
2865                        },
2866                        pick_mut: |settings_content| {
2867                            &mut settings_content
2868                                .outline_panel
2869                                .get_or_insert_default()
2870                                .folder_icons
2871                        },
2872                    }),
2873                    metadata: None,
2874                }),
2875                SettingsPageItem::SettingItem(SettingItem {
2876                    title: "Git Status",
2877                    description: "Whether to show the git status in the outline panel",
2878                    field: Box::new(SettingField {
2879                        pick: |settings_content| {
2880                            if let Some(outline_panel) = &settings_content.outline_panel {
2881                                &outline_panel.git_status
2882                            } else {
2883                                &None
2884                            }
2885                        },
2886                        pick_mut: |settings_content| {
2887                            &mut settings_content
2888                                .outline_panel
2889                                .get_or_insert_default()
2890                                .git_status
2891                        },
2892                    }),
2893                    metadata: None,
2894                }),
2895                SettingsPageItem::SettingItem(SettingItem {
2896                    title: "Indent Size",
2897                    description: "Amount of indentation for nested items",
2898                    field: Box::new(SettingField {
2899                        pick: |settings_content| {
2900                            if let Some(outline_panel) = &settings_content.outline_panel {
2901                                &outline_panel.indent_size
2902                            } else {
2903                                &None
2904                            }
2905                        },
2906                        pick_mut: |settings_content| {
2907                            &mut settings_content
2908                                .outline_panel
2909                                .get_or_insert_default()
2910                                .indent_size
2911                        },
2912                    }),
2913                    metadata: None,
2914                }),
2915                SettingsPageItem::SettingItem(SettingItem {
2916                    title: "Auto Reveal Entries",
2917                    description: "Whether to reveal when a corresponding outline entry becomes active",
2918                    field: Box::new(SettingField {
2919                        pick: |settings_content| {
2920                            if let Some(outline_panel) = &settings_content.outline_panel {
2921                                &outline_panel.auto_reveal_entries
2922                            } else {
2923                                &None
2924                            }
2925                        },
2926                        pick_mut: |settings_content| {
2927                            &mut settings_content
2928                                .outline_panel
2929                                .get_or_insert_default()
2930                                .auto_reveal_entries
2931                        },
2932                    }),
2933                    metadata: None,
2934                }),
2935                SettingsPageItem::SettingItem(SettingItem {
2936                    title: "Auto Fold Directories",
2937                    description: "Whether to fold directories automatically when a directory has only one directory inside",
2938                    field: Box::new(SettingField {
2939                        pick: |settings_content| {
2940                            if let Some(outline_panel) = &settings_content.outline_panel {
2941                                &outline_panel.auto_fold_dirs
2942                            } else {
2943                                &None
2944                            }
2945                        },
2946                        pick_mut: |settings_content| {
2947                            &mut settings_content
2948                                .outline_panel
2949                                .get_or_insert_default()
2950                                .auto_fold_dirs
2951                        },
2952                    }),
2953                    metadata: None,
2954                }),
2955                // SettingsPageItem::SettingItem(SettingItem {
2956                //     title: "Indent Guides Show",
2957                //     description: "When to show indent guides in the outline panel",
2958                //     field: Box::new(SettingField {
2959                //         pick: |settings_content| {
2960                //             if let Some(outline_panel) = &settings_content.outline_panel {
2961                //                 if let Some(indent_guides) = &outline_panel.indent_guides {
2962                //                     &indent_guides.show
2963                //                 } else {
2964                //                     &None
2965                //                 }
2966                //             } else {
2967                //                 &None
2968                //             }
2969                //         },
2970                //         pick_mut: |settings_content| {
2971                //             &mut settings_content
2972                //                 .outline_panel
2973                //                 .get_or_insert_default()
2974                //                 .indent_guides
2975                //                 .get_or_insert_default()
2976                //                 .show
2977                //         },
2978                //     }),
2979                //     metadata: None,
2980                // }),
2981                SettingsPageItem::SectionHeader("Git Panel"),
2982                SettingsPageItem::SettingItem(SettingItem {
2983                    title: "Button",
2984                    description: "Whether to show the git panel button in the status bar",
2985                    field: Box::new(SettingField {
2986                        pick: |settings_content| {
2987                            if let Some(git_panel) = &settings_content.git_panel {
2988                                &git_panel.button
2989                            } else {
2990                                &None
2991                            }
2992                        },
2993                        pick_mut: |settings_content| {
2994                            &mut settings_content.git_panel.get_or_insert_default().button
2995                        },
2996                    }),
2997                    metadata: None,
2998                }),
2999                SettingsPageItem::SettingItem(SettingItem {
3000                    title: "Dock",
3001                    description: "Where to dock the git panel",
3002                    field: Box::new(SettingField {
3003                        pick: |settings_content| {
3004                            if let Some(git_panel) = &settings_content.git_panel {
3005                                &git_panel.dock
3006                            } else {
3007                                &None
3008                            }
3009                        },
3010                        pick_mut: |settings_content| {
3011                            &mut settings_content.git_panel.get_or_insert_default().dock
3012                        },
3013                    }),
3014                    metadata: None,
3015                }),
3016                SettingsPageItem::SettingItem(SettingItem {
3017                    title: "Default Width",
3018                    description: "Default width of the git panel in pixels",
3019                    field: Box::new(SettingField {
3020                        pick: |settings_content| {
3021                            if let Some(git_panel) = &settings_content.git_panel {
3022                                &git_panel.default_width
3023                            } else {
3024                                &None
3025                            }
3026                        },
3027                        pick_mut: |settings_content| {
3028                            &mut settings_content
3029                                .git_panel
3030                                .get_or_insert_default()
3031                                .default_width
3032                        },
3033                    }),
3034                    metadata: None,
3035                }),
3036                SettingsPageItem::SectionHeader("Notification Panel"),
3037                SettingsPageItem::SettingItem(SettingItem {
3038                    title: "Notification Panel Button",
3039                    description: "Whether to show the notification panel button in the status bar",
3040                    field: Box::new(SettingField {
3041                        pick: |settings_content| {
3042                            if let Some(notification_panel) = &settings_content.notification_panel {
3043                                &notification_panel.button
3044                            } else {
3045                                &None
3046                            }
3047                        },
3048                        pick_mut: |settings_content| {
3049                            &mut settings_content
3050                                .notification_panel
3051                                .get_or_insert_default()
3052                                .button
3053                        },
3054                    }),
3055                    metadata: None,
3056                }),
3057                SettingsPageItem::SettingItem(SettingItem {
3058                    title: "Notification Panel Dock",
3059                    description: "Where to dock the notification panel",
3060                    field: Box::new(SettingField {
3061                        pick: |settings_content| {
3062                            if let Some(notification_panel) = &settings_content.notification_panel {
3063                                &notification_panel.dock
3064                            } else {
3065                                &None
3066                            }
3067                        },
3068                        pick_mut: |settings_content| {
3069                            &mut settings_content
3070                                .notification_panel
3071                                .get_or_insert_default()
3072                                .dock
3073                        },
3074                    }),
3075                    metadata: None,
3076                }),
3077                SettingsPageItem::SettingItem(SettingItem {
3078                    title: "Notification Panel Default Width",
3079                    description: "Default width of the notification panel in pixels",
3080                    field: Box::new(SettingField {
3081                        pick: |settings_content| {
3082                            if let Some(notification_panel) = &settings_content.notification_panel {
3083                                &notification_panel.default_width
3084                            } else {
3085                                &None
3086                            }
3087                        },
3088                        pick_mut: |settings_content| {
3089                            &mut settings_content
3090                                .notification_panel
3091                                .get_or_insert_default()
3092                                .default_width
3093                        },
3094                    }),
3095                    metadata: None,
3096                }),
3097                SettingsPageItem::SectionHeader("Collaboration Panel"),
3098                SettingsPageItem::SettingItem(SettingItem {
3099                    title: "Collaboration Panel Button",
3100                    description: "Whether to show the collaboration panel button in the status bar",
3101                    field: Box::new(SettingField {
3102                        pick: |settings_content| {
3103                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3104                            {
3105                                &collaboration_panel.button
3106                            } else {
3107                                &None
3108                            }
3109                        },
3110                        pick_mut: |settings_content| {
3111                            &mut settings_content
3112                                .collaboration_panel
3113                                .get_or_insert_default()
3114                                .button
3115                        },
3116                    }),
3117                    metadata: None,
3118                }),
3119                SettingsPageItem::SettingItem(SettingItem {
3120                    title: "Collaboration Panel Dock",
3121                    description: "Where to dock the collaboration panel",
3122                    field: Box::new(SettingField {
3123                        pick: |settings_content| {
3124                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3125                            {
3126                                &collaboration_panel.dock
3127                            } else {
3128                                &None
3129                            }
3130                        },
3131                        pick_mut: |settings_content| {
3132                            &mut settings_content
3133                                .collaboration_panel
3134                                .get_or_insert_default()
3135                                .dock
3136                        },
3137                    }),
3138                    metadata: None,
3139                }),
3140                SettingsPageItem::SettingItem(SettingItem {
3141                    title: "Collaboration Panel Default Width",
3142                    description: "Default width of the collaboration panel in pixels",
3143                    field: Box::new(SettingField {
3144                        pick: |settings_content| {
3145                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3146                            {
3147                                &collaboration_panel.default_width
3148                            } else {
3149                                &None
3150                            }
3151                        },
3152                        pick_mut: |settings_content| {
3153                            &mut settings_content
3154                                .collaboration_panel
3155                                .get_or_insert_default()
3156                                .default_width
3157                        },
3158                    }),
3159                    metadata: None,
3160                }),
3161            ],
3162        },
3163        SettingsPage {
3164            title: "Version Control",
3165            items: vec![
3166                SettingsPageItem::SectionHeader("Git"),
3167                SettingsPageItem::SettingItem(SettingItem {
3168                    title: "Git Gutter",
3169                    description: "Control whether git status is shown in the editor's gutter",
3170                    field: Box::new(SettingField {
3171                        pick: |settings_content| {
3172                            if let Some(git) = &settings_content.git {
3173                                &git.git_gutter
3174                            } else {
3175                                &None
3176                            }
3177                        },
3178                        pick_mut: |settings_content| {
3179                            &mut settings_content.git.get_or_insert_default().git_gutter
3180                        },
3181                    }),
3182                    metadata: None,
3183                }),
3184                // todo(settings_ui): Figure out the right default for this value in default.json
3185                SettingsPageItem::SettingItem(SettingItem {
3186                    title: "Gutter Debounce",
3187                    description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
3188                    field: Box::new(SettingField {
3189                        pick: |settings_content| {
3190                            if let Some(git) = &settings_content.git {
3191                                &git.gutter_debounce
3192                            } else {
3193                                &None
3194                            }
3195                        },
3196                        pick_mut: |settings_content| {
3197                            &mut settings_content.git.get_or_insert_default().gutter_debounce
3198                        },
3199                    }),
3200                    metadata: None,
3201                }),
3202                SettingsPageItem::SettingItem(SettingItem {
3203                    title: "Inline Git Blame",
3204                    description: "Whether or not to show git blame data inline in the currently focused line",
3205                    field: Box::new(SettingField {
3206                        pick: |settings_content| {
3207                            if let Some(git) = &settings_content.git {
3208                                if let Some(inline_blame) = &git.inline_blame {
3209                                    &inline_blame.enabled
3210                                } else {
3211                                    &None
3212                                }
3213                            } else {
3214                                &None
3215                            }
3216                        },
3217                        pick_mut: |settings_content| {
3218                            &mut settings_content
3219                                .git
3220                                .get_or_insert_default()
3221                                .inline_blame
3222                                .get_or_insert_default()
3223                                .enabled
3224                        },
3225                    }),
3226                    metadata: None,
3227                }),
3228                SettingsPageItem::SettingItem(SettingItem {
3229                    title: "Inline Git Blame Delay",
3230                    description: "The delay after which the inline blame information is shown",
3231                    field: Box::new(SettingField {
3232                        pick: |settings_content| {
3233                            if let Some(git) = &settings_content.git {
3234                                if let Some(inline_blame) = &git.inline_blame {
3235                                    &inline_blame.delay_ms
3236                                } else {
3237                                    &None
3238                                }
3239                            } else {
3240                                &None
3241                            }
3242                        },
3243                        pick_mut: |settings_content| {
3244                            &mut settings_content
3245                                .git
3246                                .get_or_insert_default()
3247                                .inline_blame
3248                                .get_or_insert_default()
3249                                .delay_ms
3250                        },
3251                    }),
3252                    metadata: None,
3253                }),
3254                SettingsPageItem::SettingItem(SettingItem {
3255                    title: "Inline Git Blame Padding",
3256                    description: "Padding between the end of the source line and the start of the inline blame in columns",
3257                    field: Box::new(SettingField {
3258                        pick: |settings_content| {
3259                            if let Some(git) = &settings_content.git {
3260                                if let Some(inline_blame) = &git.inline_blame {
3261                                    &inline_blame.padding
3262                                } else {
3263                                    &None
3264                                }
3265                            } else {
3266                                &None
3267                            }
3268                        },
3269                        pick_mut: |settings_content| {
3270                            &mut settings_content
3271                                .git
3272                                .get_or_insert_default()
3273                                .inline_blame
3274                                .get_or_insert_default()
3275                                .padding
3276                        },
3277                    }),
3278                    metadata: None,
3279                }),
3280                SettingsPageItem::SettingItem(SettingItem {
3281                    title: "Inline Git Blame Min Column",
3282                    description: "The minimum column number to show the inline blame information at",
3283                    field: Box::new(SettingField {
3284                        pick: |settings_content| {
3285                            if let Some(git) = &settings_content.git {
3286                                if let Some(inline_blame) = &git.inline_blame {
3287                                    &inline_blame.min_column
3288                                } else {
3289                                    &None
3290                                }
3291                            } else {
3292                                &None
3293                            }
3294                        },
3295                        pick_mut: |settings_content| {
3296                            &mut settings_content
3297                                .git
3298                                .get_or_insert_default()
3299                                .inline_blame
3300                                .get_or_insert_default()
3301                                .min_column
3302                        },
3303                    }),
3304                    metadata: None,
3305                }),
3306                SettingsPageItem::SettingItem(SettingItem {
3307                    title: "Show Commit Summary",
3308                    description: "Whether to show commit summary as part of the inline blame",
3309                    field: Box::new(SettingField {
3310                        pick: |settings_content| {
3311                            if let Some(git) = &settings_content.git {
3312                                if let Some(inline_blame) = &git.inline_blame {
3313                                    &inline_blame.show_commit_summary
3314                                } else {
3315                                    &None
3316                                }
3317                            } else {
3318                                &None
3319                            }
3320                        },
3321                        pick_mut: |settings_content| {
3322                            &mut settings_content
3323                                .git
3324                                .get_or_insert_default()
3325                                .inline_blame
3326                                .get_or_insert_default()
3327                                .show_commit_summary
3328                        },
3329                    }),
3330                    metadata: None,
3331                }),
3332                SettingsPageItem::SettingItem(SettingItem {
3333                    title: "Show Avatar",
3334                    description: "Whether to show the avatar of the author of the commit",
3335                    field: Box::new(SettingField {
3336                        pick: |settings_content| {
3337                            if let Some(git) = &settings_content.git {
3338                                if let Some(blame) = &git.blame {
3339                                    &blame.show_avatar
3340                                } else {
3341                                    &None
3342                                }
3343                            } else {
3344                                &None
3345                            }
3346                        },
3347                        pick_mut: |settings_content| {
3348                            &mut settings_content
3349                                .git
3350                                .get_or_insert_default()
3351                                .blame
3352                                .get_or_insert_default()
3353                                .show_avatar
3354                        },
3355                    }),
3356                    metadata: None,
3357                }),
3358                SettingsPageItem::SettingItem(SettingItem {
3359                    title: "Show Author Name In Branch Picker",
3360                    description: "Whether to show author name as part of the commit information in branch picker",
3361                    field: Box::new(SettingField {
3362                        pick: |settings_content| {
3363                            if let Some(git) = &settings_content.git {
3364                                if let Some(branch_picker) = &git.branch_picker {
3365                                    &branch_picker.show_author_name
3366                                } else {
3367                                    &None
3368                                }
3369                            } else {
3370                                &None
3371                            }
3372                        },
3373                        pick_mut: |settings_content| {
3374                            &mut settings_content
3375                                .git
3376                                .get_or_insert_default()
3377                                .branch_picker
3378                                .get_or_insert_default()
3379                                .show_author_name
3380                        },
3381                    }),
3382                    metadata: None,
3383                }),
3384                SettingsPageItem::SettingItem(SettingItem {
3385                    title: "Hunk Style",
3386                    description: "How git hunks are displayed visually in the editor",
3387                    field: Box::new(SettingField {
3388                        pick: |settings_content| {
3389                            if let Some(git) = &settings_content.git {
3390                                &git.hunk_style
3391                            } else {
3392                                &None
3393                            }
3394                        },
3395                        pick_mut: |settings_content| {
3396                            &mut settings_content.git.get_or_insert_default().hunk_style
3397                        },
3398                    }),
3399                    metadata: None,
3400                }),
3401            ],
3402        },
3403        SettingsPage {
3404            title: "System & Network",
3405            items: vec![
3406                SettingsPageItem::SectionHeader("Network"),
3407                // todo(settings_ui): Proxy needs a default
3408                // SettingsPageItem::SettingItem(SettingItem {
3409                //     title: "Proxy",
3410                //     description: "The proxy to use for network requests",
3411                //     field: Box::new(SettingField {
3412                //         pick: |settings_content| &settings_content.proxy,
3413                //         pick_mut: |settings_content| &mut settings_content.proxy,
3414                //     }),
3415                //     metadata: Some(Box::new(SettingsFieldMetadata {
3416                //         placeholder: Some("socks5h://localhost:10808"),
3417                //     })),
3418                // }),
3419                SettingsPageItem::SettingItem(SettingItem {
3420                    title: "Server URL",
3421                    description: "The URL of the Zed server to connect to",
3422                    field: Box::new(SettingField {
3423                        pick: |settings_content| &settings_content.server_url,
3424                        pick_mut: |settings_content| &mut settings_content.server_url,
3425                    }),
3426                    metadata: Some(Box::new(SettingsFieldMetadata {
3427                        placeholder: Some("https://zed.dev"),
3428                    })),
3429                }),
3430                SettingsPageItem::SectionHeader("System"),
3431                SettingsPageItem::SettingItem(SettingItem {
3432                    title: "Auto Update",
3433                    description: "Whether or not to automatically check for updates",
3434                    field: Box::new(SettingField {
3435                        pick: |settings_content| &settings_content.auto_update,
3436                        pick_mut: |settings_content| &mut settings_content.auto_update,
3437                    }),
3438                    metadata: None,
3439                }),
3440            ],
3441        },
3442        SettingsPage {
3443            title: "Diagnostics & Errors",
3444            items: vec![
3445                SettingsPageItem::SectionHeader("Filtering"),
3446                SettingsPageItem::SettingItem(SettingItem {
3447                    title: "Max Severity",
3448                    description: "Which level to use to filter out diagnostics displayed in the editor",
3449                    field: Box::new(SettingField {
3450                        pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
3451                        pick_mut: |settings_content| {
3452                            &mut settings_content.editor.diagnostics_max_severity
3453                        },
3454                    }),
3455                    metadata: None,
3456                }),
3457                SettingsPageItem::SettingItem(SettingItem {
3458                    title: "Include Warnings",
3459                    description: "Whether to show warnings or not by default",
3460                    field: Box::new(SettingField {
3461                        pick: |settings_content| {
3462                            if let Some(diagnostics) = &settings_content.diagnostics {
3463                                &diagnostics.include_warnings
3464                            } else {
3465                                &None
3466                            }
3467                        },
3468                        pick_mut: |settings_content| {
3469                            &mut settings_content
3470                                .diagnostics
3471                                .get_or_insert_default()
3472                                .include_warnings
3473                        },
3474                    }),
3475                    metadata: None,
3476                }),
3477                SettingsPageItem::SectionHeader("Inline"),
3478                SettingsPageItem::SettingItem(SettingItem {
3479                    title: "Inline Diagnostics Enabled",
3480                    description: "Whether to show diagnostics inline or not",
3481                    field: Box::new(SettingField {
3482                        pick: |settings_content| {
3483                            if let Some(diagnostics) = &settings_content.diagnostics {
3484                                if let Some(inline) = &diagnostics.inline {
3485                                    &inline.enabled
3486                                } else {
3487                                    &None
3488                                }
3489                            } else {
3490                                &None
3491                            }
3492                        },
3493                        pick_mut: |settings_content| {
3494                            &mut settings_content
3495                                .diagnostics
3496                                .get_or_insert_default()
3497                                .inline
3498                                .get_or_insert_default()
3499                                .enabled
3500                        },
3501                    }),
3502                    metadata: None,
3503                }),
3504                SettingsPageItem::SettingItem(SettingItem {
3505                    title: "Inline Update Debounce",
3506                    description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
3507                    field: Box::new(SettingField {
3508                        pick: |settings_content| {
3509                            if let Some(diagnostics) = &settings_content.diagnostics {
3510                                if let Some(inline) = &diagnostics.inline {
3511                                    &inline.update_debounce_ms
3512                                } else {
3513                                    &None
3514                                }
3515                            } else {
3516                                &None
3517                            }
3518                        },
3519                        pick_mut: |settings_content| {
3520                            &mut settings_content
3521                                .diagnostics
3522                                .get_or_insert_default()
3523                                .inline
3524                                .get_or_insert_default()
3525                                .update_debounce_ms
3526                        },
3527                    }),
3528                    metadata: None,
3529                }),
3530                SettingsPageItem::SettingItem(SettingItem {
3531                    title: "Inline Padding",
3532                    description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
3533                    field: Box::new(SettingField {
3534                        pick: |settings_content| {
3535                            if let Some(diagnostics) = &settings_content.diagnostics {
3536                                if let Some(inline) = &diagnostics.inline {
3537                                    &inline.padding
3538                                } else {
3539                                    &None
3540                                }
3541                            } else {
3542                                &None
3543                            }
3544                        },
3545                        pick_mut: |settings_content| {
3546                            &mut settings_content
3547                                .diagnostics
3548                                .get_or_insert_default()
3549                                .inline
3550                                .get_or_insert_default()
3551                                .padding
3552                        },
3553                    }),
3554                    metadata: None,
3555                }),
3556                SettingsPageItem::SettingItem(SettingItem {
3557                    title: "Inline Min Column",
3558                    description: "The minimum column to display inline diagnostics",
3559                    field: Box::new(SettingField {
3560                        pick: |settings_content| {
3561                            if let Some(diagnostics) = &settings_content.diagnostics {
3562                                if let Some(inline) = &diagnostics.inline {
3563                                    &inline.min_column
3564                                } else {
3565                                    &None
3566                                }
3567                            } else {
3568                                &None
3569                            }
3570                        },
3571                        pick_mut: |settings_content| {
3572                            &mut settings_content
3573                                .diagnostics
3574                                .get_or_insert_default()
3575                                .inline
3576                                .get_or_insert_default()
3577                                .min_column
3578                        },
3579                    }),
3580                    metadata: None,
3581                }),
3582                SettingsPageItem::SectionHeader("Performance"),
3583                SettingsPageItem::SettingItem(SettingItem {
3584                    title: "LSP Pull Diagnostics Enabled",
3585                    description: "Whether to pull for language server-powered diagnostics or not",
3586                    field: Box::new(SettingField {
3587                        pick: |settings_content| {
3588                            if let Some(diagnostics) = &settings_content.diagnostics {
3589                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3590                                    &lsp_pull.enabled
3591                                } else {
3592                                    &None
3593                                }
3594                            } else {
3595                                &None
3596                            }
3597                        },
3598                        pick_mut: |settings_content| {
3599                            &mut settings_content
3600                                .diagnostics
3601                                .get_or_insert_default()
3602                                .lsp_pull_diagnostics
3603                                .get_or_insert_default()
3604                                .enabled
3605                        },
3606                    }),
3607                    metadata: None,
3608                }),
3609                // todo(settings_ui): Needs unit
3610                SettingsPageItem::SettingItem(SettingItem {
3611                    title: "LSP Pull Debounce",
3612                    description: "Minimum time to wait before pulling diagnostics from the language server(s)",
3613                    field: Box::new(SettingField {
3614                        pick: |settings_content| {
3615                            if let Some(diagnostics) = &settings_content.diagnostics {
3616                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3617                                    &lsp_pull.debounce_ms
3618                                } else {
3619                                    &None
3620                                }
3621                            } else {
3622                                &None
3623                            }
3624                        },
3625                        pick_mut: |settings_content| {
3626                            &mut settings_content
3627                                .diagnostics
3628                                .get_or_insert_default()
3629                                .lsp_pull_diagnostics
3630                                .get_or_insert_default()
3631                                .debounce_ms
3632                        },
3633                    }),
3634                    metadata: None,
3635                }),
3636            ],
3637        },
3638        SettingsPage {
3639            title: "Debugger",
3640            items: vec![
3641                SettingsPageItem::SectionHeader("General"),
3642                SettingsPageItem::SettingItem(SettingItem {
3643                    title: "Stepping Granularity",
3644                    description: "Determines the stepping granularity for debug operations",
3645                    field: Box::new(SettingField {
3646                        pick: |settings_content| {
3647                            if let Some(debugger) = &settings_content.debugger {
3648                                &debugger.stepping_granularity
3649                            } else {
3650                                &None
3651                            }
3652                        },
3653                        pick_mut: |settings_content| {
3654                            &mut settings_content
3655                                .debugger
3656                                .get_or_insert_default()
3657                                .stepping_granularity
3658                        },
3659                    }),
3660                    metadata: None,
3661                }),
3662                SettingsPageItem::SettingItem(SettingItem {
3663                    title: "Save Breakpoints",
3664                    description: "Whether breakpoints should be reused across Zed sessions",
3665                    field: Box::new(SettingField {
3666                        pick: |settings_content| {
3667                            if let Some(debugger) = &settings_content.debugger {
3668                                &debugger.save_breakpoints
3669                            } else {
3670                                &None
3671                            }
3672                        },
3673                        pick_mut: |settings_content| {
3674                            &mut settings_content
3675                                .debugger
3676                                .get_or_insert_default()
3677                                .save_breakpoints
3678                        },
3679                    }),
3680                    metadata: None,
3681                }),
3682                SettingsPageItem::SettingItem(SettingItem {
3683                    title: "Timeout",
3684                    description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter",
3685                    field: Box::new(SettingField {
3686                        pick: |settings_content| {
3687                            if let Some(debugger) = &settings_content.debugger {
3688                                &debugger.timeout
3689                            } else {
3690                                &None
3691                            }
3692                        },
3693                        pick_mut: |settings_content| {
3694                            &mut settings_content.debugger.get_or_insert_default().timeout
3695                        },
3696                    }),
3697                    metadata: None,
3698                }),
3699                SettingsPageItem::SettingItem(SettingItem {
3700                    title: "Dock",
3701                    description: "The dock position of the debug panel",
3702                    field: Box::new(SettingField {
3703                        pick: |settings_content| {
3704                            if let Some(debugger) = &settings_content.debugger {
3705                                &debugger.dock
3706                            } else {
3707                                &None
3708                            }
3709                        },
3710                        pick_mut: |settings_content| {
3711                            &mut settings_content.debugger.get_or_insert_default().dock
3712                        },
3713                    }),
3714                    metadata: None,
3715                }),
3716                SettingsPageItem::SettingItem(SettingItem {
3717                    title: "Log DAP Communications",
3718                    description: "Whether to log messages between active debug adapters and Zed",
3719                    field: Box::new(SettingField {
3720                        pick: |settings_content| {
3721                            if let Some(debugger) = &settings_content.debugger {
3722                                &debugger.log_dap_communications
3723                            } else {
3724                                &None
3725                            }
3726                        },
3727                        pick_mut: |settings_content| {
3728                            &mut settings_content
3729                                .debugger
3730                                .get_or_insert_default()
3731                                .log_dap_communications
3732                        },
3733                    }),
3734                    metadata: None,
3735                }),
3736                SettingsPageItem::SettingItem(SettingItem {
3737                    title: "Format DAP Log Messages",
3738                    description: "Whether to format DAP messages when adding them to debug adapter logger",
3739                    field: Box::new(SettingField {
3740                        pick: |settings_content| {
3741                            if let Some(debugger) = &settings_content.debugger {
3742                                &debugger.format_dap_log_messages
3743                            } else {
3744                                &None
3745                            }
3746                        },
3747                        pick_mut: |settings_content| {
3748                            &mut settings_content
3749                                .debugger
3750                                .get_or_insert_default()
3751                                .format_dap_log_messages
3752                        },
3753                    }),
3754                    metadata: None,
3755                }),
3756                SettingsPageItem::SettingItem(SettingItem {
3757                    title: "Button",
3758                    description: "Whether to show the debug button in the status bar",
3759                    field: Box::new(SettingField {
3760                        pick: |settings_content| {
3761                            if let Some(debugger) = &settings_content.debugger {
3762                                &debugger.button
3763                            } else {
3764                                &None
3765                            }
3766                        },
3767                        pick_mut: |settings_content| {
3768                            &mut settings_content.debugger.get_or_insert_default().button
3769                        },
3770                    }),
3771                    metadata: None,
3772                }),
3773            ],
3774        },
3775        SettingsPage {
3776            title: "Collaboration",
3777            items: vec![
3778                SettingsPageItem::SectionHeader("Calls"),
3779                SettingsPageItem::SettingItem(SettingItem {
3780                    title: "Mute On Join",
3781                    description: "Whether the microphone should be muted when joining a channel or a call",
3782                    field: Box::new(SettingField {
3783                        pick: |settings_content| {
3784                            if let Some(calls) = &settings_content.calls {
3785                                &calls.mute_on_join
3786                            } else {
3787                                &None
3788                            }
3789                        },
3790                        pick_mut: |settings_content| {
3791                            &mut settings_content.calls.get_or_insert_default().mute_on_join
3792                        },
3793                    }),
3794                    metadata: None,
3795                }),
3796                SettingsPageItem::SettingItem(SettingItem {
3797                    title: "Share On Join",
3798                    description: "Whether your current project should be shared when joining an empty channel",
3799                    field: Box::new(SettingField {
3800                        pick: |settings_content| {
3801                            if let Some(calls) = &settings_content.calls {
3802                                &calls.share_on_join
3803                            } else {
3804                                &None
3805                            }
3806                        },
3807                        pick_mut: |settings_content| {
3808                            &mut settings_content.calls.get_or_insert_default().share_on_join
3809                        },
3810                    }),
3811                    metadata: None,
3812                }),
3813                SettingsPageItem::SectionHeader("Experimental"),
3814                SettingsPageItem::SettingItem(SettingItem {
3815                    title: "Rodio Audio",
3816                    description: "Opt into the new audio system",
3817                    field: Box::new(SettingField {
3818                        pick: |settings_content| {
3819                            if let Some(audio) = &settings_content.audio {
3820                                &audio.rodio_audio
3821                            } else {
3822                                &None
3823                            }
3824                        },
3825                        pick_mut: |settings_content| {
3826                            &mut settings_content.audio.get_or_insert_default().rodio_audio
3827                        },
3828                    }),
3829                    metadata: None,
3830                }),
3831                SettingsPageItem::SettingItem(SettingItem {
3832                    title: "Auto Microphone Volume",
3833                    description: "Automatically adjust microphone volume (requires Rodio Audio)",
3834                    field: Box::new(SettingField {
3835                        pick: |settings_content| {
3836                            if let Some(audio) = &settings_content.audio {
3837                                &audio.auto_microphone_volume
3838                            } else {
3839                                &None
3840                            }
3841                        },
3842                        pick_mut: |settings_content| {
3843                            &mut settings_content
3844                                .audio
3845                                .get_or_insert_default()
3846                                .auto_microphone_volume
3847                        },
3848                    }),
3849                    metadata: None,
3850                }),
3851                SettingsPageItem::SettingItem(SettingItem {
3852                    title: "Auto Speaker Volume",
3853                    description: "Automatically adjust volume of other call members (requires Rodio Audio)",
3854                    field: Box::new(SettingField {
3855                        pick: |settings_content| {
3856                            if let Some(audio) = &settings_content.audio {
3857                                &audio.auto_speaker_volume
3858                            } else {
3859                                &None
3860                            }
3861                        },
3862                        pick_mut: |settings_content| {
3863                            &mut settings_content
3864                                .audio
3865                                .get_or_insert_default()
3866                                .auto_speaker_volume
3867                        },
3868                    }),
3869                    metadata: None,
3870                }),
3871                SettingsPageItem::SettingItem(SettingItem {
3872                    title: "Denoise",
3873                    description: "Remove background noises (requires Rodio Audio)",
3874                    field: Box::new(SettingField {
3875                        pick: |settings_content| {
3876                            if let Some(audio) = &settings_content.audio {
3877                                &audio.denoise
3878                            } else {
3879                                &None
3880                            }
3881                        },
3882                        pick_mut: |settings_content| {
3883                            &mut settings_content.audio.get_or_insert_default().denoise
3884                        },
3885                    }),
3886                    metadata: None,
3887                }),
3888                SettingsPageItem::SettingItem(SettingItem {
3889                    title: "Legacy Audio Compatible",
3890                    description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
3891                    field: Box::new(SettingField {
3892                        pick: |settings_content| {
3893                            if let Some(audio) = &settings_content.audio {
3894                                &audio.legacy_audio_compatible
3895                            } else {
3896                                &None
3897                            }
3898                        },
3899                        pick_mut: |settings_content| {
3900                            &mut settings_content
3901                                .audio
3902                                .get_or_insert_default()
3903                                .legacy_audio_compatible
3904                        },
3905                    }),
3906                    metadata: None,
3907                }),
3908            ],
3909        },
3910        SettingsPage {
3911            title: "AI",
3912            items: vec![
3913                SettingsPageItem::SectionHeader("General"),
3914                SettingsPageItem::SettingItem(SettingItem {
3915                    title: "Disable AI",
3916                    description: "Whether to disable all AI features in Zed",
3917                    field: Box::new(SettingField {
3918                        pick: |settings_content| &settings_content.disable_ai,
3919                        pick_mut: |settings_content| &mut settings_content.disable_ai,
3920                    }),
3921                    metadata: None,
3922                }),
3923            ],
3924        },
3925    ]
3926}
3927
3928pub(crate) fn project_settings_data() -> Vec<SettingsPage> {
3929    vec![
3930        SettingsPage {
3931            title: "Project",
3932            items: vec![
3933                SettingsPageItem::SectionHeader("Worktree Settings Content"),
3934                SettingsPageItem::SettingItem(SettingItem {
3935                    title: "Project Name",
3936                    description: "The displayed name of this project. If not set, the root directory name",
3937                    field: Box::new(SettingField {
3938                        pick: |settings_content| &settings_content.project.worktree.project_name,
3939                        pick_mut: |settings_content| {
3940                            &mut settings_content.project.worktree.project_name
3941                        },
3942                    }),
3943                    metadata: Some(Box::new(SettingsFieldMetadata {
3944                        placeholder: Some("A new name"),
3945                    })),
3946                }),
3947            ],
3948        },
3949        SettingsPage {
3950            title: "Appearance & Behavior",
3951            items: vec![
3952                SettingsPageItem::SectionHeader("Guides"),
3953                SettingsPageItem::SettingItem(SettingItem {
3954                    title: "Show Wrap Guides",
3955                    description: "Whether to show wrap guides (vertical rulers)",
3956                    field: Box::new(SettingField {
3957                        pick: |settings_content| {
3958                            &settings_content
3959                                .project
3960                                .all_languages
3961                                .defaults
3962                                .show_wrap_guides
3963                        },
3964                        pick_mut: |settings_content| {
3965                            &mut settings_content
3966                                .project
3967                                .all_languages
3968                                .defaults
3969                                .show_wrap_guides
3970                        },
3971                    }),
3972                    metadata: None,
3973                }),
3974                // todo(settings_ui): This needs a custom component
3975                // SettingsPageItem::SettingItem(SettingItem {
3976                //     title: "Wrap Guides",
3977                //     description: "Character counts at which to show wrap guides",
3978                //     field: Box::new(SettingField {
3979                //         pick: |settings_content| {
3980                //             &settings_content
3981                //                 .project
3982                //                 .all_languages
3983                //                 .defaults
3984                //                 .wrap_guides
3985                //         },
3986                //         pick_mut: |settings_content| {
3987                //             &mut settings_content
3988                //                 .project
3989                //                 .all_languages
3990                //                 .defaults
3991                //                 .wrap_guides
3992                //         },
3993                //     }),
3994                //     metadata: None,
3995                // }),
3996                SettingsPageItem::SectionHeader("Whitespace"),
3997                SettingsPageItem::SettingItem(SettingItem {
3998                    title: "Show Whitespace",
3999                    description: "Whether to show tabs and spaces",
4000                    field: Box::new(SettingField {
4001                        pick: |settings_content| {
4002                            &settings_content
4003                                .project
4004                                .all_languages
4005                                .defaults
4006                                .show_whitespaces
4007                        },
4008                        pick_mut: |settings_content| {
4009                            &mut settings_content
4010                                .project
4011                                .all_languages
4012                                .defaults
4013                                .show_whitespaces
4014                        },
4015                    }),
4016                    metadata: None,
4017                }),
4018            ],
4019        },
4020        SettingsPage {
4021            title: "Editing",
4022            items: vec![
4023                SettingsPageItem::SectionHeader("Indentation"),
4024                // todo(settings_ui): Needs numeric stepper
4025                // SettingsPageItem::SettingItem(SettingItem {
4026                //     title: "Tab Size",
4027                //     description: "How many columns a tab should occupy",
4028                //     field: Box::new(SettingField {
4029                //         pick: |settings_content| &settings_content.project.all_languages.defaults.tab_size,
4030                //         pick_mut: |settings_content| &mut settings_content.project.all_languages.defaults.tab_size,
4031                //     }),
4032                //     metadata: None,
4033                // }),
4034                SettingsPageItem::SettingItem(SettingItem {
4035                    title: "Hard Tabs",
4036                    description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
4037                    field: Box::new(SettingField {
4038                        pick: |settings_content| {
4039                            &settings_content.project.all_languages.defaults.hard_tabs
4040                        },
4041                        pick_mut: |settings_content| {
4042                            &mut settings_content.project.all_languages.defaults.hard_tabs
4043                        },
4044                    }),
4045                    metadata: None,
4046                }),
4047                SettingsPageItem::SettingItem(SettingItem {
4048                    title: "Auto Indent",
4049                    description: "Whether indentation should be adjusted based on the context whilst typing",
4050                    field: Box::new(SettingField {
4051                        pick: |settings_content| {
4052                            &settings_content.project.all_languages.defaults.auto_indent
4053                        },
4054                        pick_mut: |settings_content| {
4055                            &mut settings_content.project.all_languages.defaults.auto_indent
4056                        },
4057                    }),
4058                    metadata: None,
4059                }),
4060                SettingsPageItem::SettingItem(SettingItem {
4061                    title: "Auto Indent On Paste",
4062                    description: "Whether indentation of pasted content should be adjusted based on the context",
4063                    field: Box::new(SettingField {
4064                        pick: |settings_content| {
4065                            &settings_content
4066                                .project
4067                                .all_languages
4068                                .defaults
4069                                .auto_indent_on_paste
4070                        },
4071                        pick_mut: |settings_content| {
4072                            &mut settings_content
4073                                .project
4074                                .all_languages
4075                                .defaults
4076                                .auto_indent_on_paste
4077                        },
4078                    }),
4079                    metadata: None,
4080                }),
4081                SettingsPageItem::SectionHeader("Wrapping"),
4082                // todo(settings_ui): Needs numeric stepper
4083                // SettingsPageItem::SettingItem(SettingItem {
4084                //     title: "Preferred Line Length",
4085                //     description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
4086                //     field: Box::new(SettingField {
4087                //         pick: |settings_content| &settings_content.project.all_languages.defaults.preferred_line_length,
4088                //         pick_mut: |settings_content| &mut settings_content.project.all_languages.defaults.preferred_line_length,
4089                //     }),
4090                //     metadata: None,
4091                // }),
4092                SettingsPageItem::SettingItem(SettingItem {
4093                    title: "Soft Wrap",
4094                    description: "How to soft-wrap long lines of text",
4095                    field: Box::new(SettingField {
4096                        pick: |settings_content| {
4097                            &settings_content.project.all_languages.defaults.soft_wrap
4098                        },
4099                        pick_mut: |settings_content| {
4100                            &mut settings_content.project.all_languages.defaults.soft_wrap
4101                        },
4102                    }),
4103                    metadata: None,
4104                }),
4105                SettingsPageItem::SectionHeader("Auto Actions"),
4106                SettingsPageItem::SettingItem(SettingItem {
4107                    title: "Use Autoclose",
4108                    description: "Whether to automatically type closing characters for you",
4109                    field: Box::new(SettingField {
4110                        pick: |settings_content| {
4111                            &settings_content
4112                                .project
4113                                .all_languages
4114                                .defaults
4115                                .use_autoclose
4116                        },
4117                        pick_mut: |settings_content| {
4118                            &mut settings_content
4119                                .project
4120                                .all_languages
4121                                .defaults
4122                                .use_autoclose
4123                        },
4124                    }),
4125                    metadata: None,
4126                }),
4127                SettingsPageItem::SettingItem(SettingItem {
4128                    title: "Use Auto Surround",
4129                    description: "Whether to automatically surround text with characters for you",
4130                    field: Box::new(SettingField {
4131                        pick: |settings_content| {
4132                            &settings_content
4133                                .project
4134                                .all_languages
4135                                .defaults
4136                                .use_auto_surround
4137                        },
4138                        pick_mut: |settings_content| {
4139                            &mut settings_content
4140                                .project
4141                                .all_languages
4142                                .defaults
4143                                .use_auto_surround
4144                        },
4145                    }),
4146                    metadata: None,
4147                }),
4148                SettingsPageItem::SettingItem(SettingItem {
4149                    title: "Use On Type Format",
4150                    description: "Whether to use additional LSP queries to format the code after every trigger symbol input",
4151                    field: Box::new(SettingField {
4152                        pick: |settings_content| {
4153                            &settings_content
4154                                .project
4155                                .all_languages
4156                                .defaults
4157                                .use_on_type_format
4158                        },
4159                        pick_mut: |settings_content| {
4160                            &mut settings_content
4161                                .project
4162                                .all_languages
4163                                .defaults
4164                                .use_on_type_format
4165                        },
4166                    }),
4167                    metadata: None,
4168                }),
4169                SettingsPageItem::SettingItem(SettingItem {
4170                    title: "Always Treat Brackets As Autoclosed",
4171                    description: "Controls how the editor handles the autoclosed characters",
4172                    field: Box::new(SettingField {
4173                        pick: |settings_content| {
4174                            &settings_content
4175                                .project
4176                                .all_languages
4177                                .defaults
4178                                .always_treat_brackets_as_autoclosed
4179                        },
4180                        pick_mut: |settings_content| {
4181                            &mut settings_content
4182                                .project
4183                                .all_languages
4184                                .defaults
4185                                .always_treat_brackets_as_autoclosed
4186                        },
4187                    }),
4188                    metadata: None,
4189                }),
4190                SettingsPageItem::SectionHeader("Formatting"),
4191                SettingsPageItem::SettingItem(SettingItem {
4192                    title: "Remove Trailing Whitespace On Save",
4193                    description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
4194                    field: Box::new(SettingField {
4195                        pick: |settings_content| {
4196                            &settings_content
4197                                .project
4198                                .all_languages
4199                                .defaults
4200                                .remove_trailing_whitespace_on_save
4201                        },
4202                        pick_mut: |settings_content| {
4203                            &mut settings_content
4204                                .project
4205                                .all_languages
4206                                .defaults
4207                                .remove_trailing_whitespace_on_save
4208                        },
4209                    }),
4210                    metadata: None,
4211                }),
4212                SettingsPageItem::SettingItem(SettingItem {
4213                    title: "Ensure Final Newline On Save",
4214                    description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
4215                    field: Box::new(SettingField {
4216                        pick: |settings_content| {
4217                            &settings_content
4218                                .project
4219                                .all_languages
4220                                .defaults
4221                                .ensure_final_newline_on_save
4222                        },
4223                        pick_mut: |settings_content| {
4224                            &mut settings_content
4225                                .project
4226                                .all_languages
4227                                .defaults
4228                                .ensure_final_newline_on_save
4229                        },
4230                    }),
4231                    metadata: None,
4232                }),
4233                SettingsPageItem::SettingItem(SettingItem {
4234                    title: "Extend Comment On Newline",
4235                    description: "Whether to start a new line with a comment when a previous line is a comment as well",
4236                    field: Box::new(SettingField {
4237                        pick: |settings_content| {
4238                            &settings_content
4239                                .project
4240                                .all_languages
4241                                .defaults
4242                                .extend_comment_on_newline
4243                        },
4244                        pick_mut: |settings_content| {
4245                            &mut settings_content
4246                                .project
4247                                .all_languages
4248                                .defaults
4249                                .extend_comment_on_newline
4250                        },
4251                    }),
4252                    metadata: None,
4253                }),
4254                SettingsPageItem::SectionHeader("Completions"),
4255                SettingsPageItem::SettingItem(SettingItem {
4256                    title: "Show Completions On Input",
4257                    description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
4258                    field: Box::new(SettingField {
4259                        pick: |settings_content| {
4260                            &settings_content
4261                                .project
4262                                .all_languages
4263                                .defaults
4264                                .show_completions_on_input
4265                        },
4266                        pick_mut: |settings_content| {
4267                            &mut settings_content
4268                                .project
4269                                .all_languages
4270                                .defaults
4271                                .show_completions_on_input
4272                        },
4273                    }),
4274                    metadata: None,
4275                }),
4276                SettingsPageItem::SettingItem(SettingItem {
4277                    title: "Show Completion Documentation",
4278                    description: "Whether to display inline and alongside documentation for items in the completions menu",
4279                    field: Box::new(SettingField {
4280                        pick: |settings_content| {
4281                            &settings_content
4282                                .project
4283                                .all_languages
4284                                .defaults
4285                                .show_completion_documentation
4286                        },
4287                        pick_mut: |settings_content| {
4288                            &mut settings_content
4289                                .project
4290                                .all_languages
4291                                .defaults
4292                                .show_completion_documentation
4293                        },
4294                    }),
4295                    metadata: None,
4296                }),
4297            ],
4298        },
4299    ]
4300}
4301
4302const LANGUAGES_SECTION_HEADER: &'static str = "Languages";
4303
4304fn language_settings_data() -> Vec<SettingsPageItem> {
4305    fn current_language() -> Option<SharedString> {
4306        sub_page_stack().iter().find_map(|page| {
4307            (page.section_header == LANGUAGES_SECTION_HEADER)
4308                .then(|| SharedString::new_static(page.link.title))
4309        })
4310    }
4311
4312    fn language_settings_field<T>(
4313        settings_content: &SettingsContent,
4314        get: fn(&LanguageSettingsContent) -> &Option<T>,
4315    ) -> &Option<T> {
4316        let all_languages = &settings_content.project.all_languages;
4317        let mut language_content = None;
4318        if let Some(current_language) = current_language() {
4319            language_content = all_languages.languages.0.get(&current_language);
4320        }
4321        let value = language_content
4322            .map(get)
4323            .unwrap_or_else(|| get(&all_languages.defaults));
4324        return value;
4325    }
4326
4327    fn language_settings_field_mut<T>(
4328        settings_content: &mut SettingsContent,
4329        get: fn(&mut LanguageSettingsContent) -> &mut Option<T>,
4330    ) -> &mut Option<T> {
4331        let all_languages = &mut settings_content.project.all_languages;
4332        let language_content = if let Some(current_language) = current_language() {
4333            all_languages
4334                .languages
4335                .0
4336                .entry(current_language)
4337                .or_default()
4338        } else {
4339            &mut all_languages.defaults
4340        };
4341        return get(language_content);
4342    }
4343
4344    vec![
4345        SettingsPageItem::SectionHeader("Indentation"),
4346        SettingsPageItem::SettingItem(SettingItem {
4347            title: "Tab Size",
4348            description: "How many columns a tab should occupy",
4349            field: Box::new(SettingField {
4350                pick: |settings_content| {
4351                    language_settings_field(settings_content, |language| &language.tab_size)
4352                },
4353                pick_mut: |settings_content| {
4354                    language_settings_field_mut(settings_content, |language| &mut language.tab_size)
4355                },
4356            }),
4357            metadata: None,
4358        }),
4359        SettingsPageItem::SettingItem(SettingItem {
4360            title: "Hard Tabs",
4361            description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
4362            field: Box::new(SettingField {
4363                pick: |settings_content| {
4364                    language_settings_field(settings_content, |language| &language.hard_tabs)
4365                },
4366                pick_mut: |settings_content| {
4367                    language_settings_field_mut(settings_content, |language| {
4368                        &mut language.hard_tabs
4369                    })
4370                },
4371            }),
4372            metadata: None,
4373        }),
4374        SettingsPageItem::SettingItem(SettingItem {
4375            title: "Auto Indent",
4376            description: "Whether indentation should be adjusted based on the context whilst typing",
4377            field: Box::new(SettingField {
4378                pick: |settings_content| {
4379                    language_settings_field(settings_content, |language| &language.auto_indent)
4380                },
4381                pick_mut: |settings_content| {
4382                    language_settings_field_mut(settings_content, |language| {
4383                        &mut language.auto_indent
4384                    })
4385                },
4386            }),
4387            metadata: None,
4388        }),
4389        SettingsPageItem::SettingItem(SettingItem {
4390            title: "Auto Indent On Paste",
4391            description: "Whether indentation of pasted content should be adjusted based on the context",
4392            field: Box::new(SettingField {
4393                pick: |settings_content| {
4394                    language_settings_field(settings_content, |language| {
4395                        &language.auto_indent_on_paste
4396                    })
4397                },
4398                pick_mut: |settings_content| {
4399                    language_settings_field_mut(settings_content, |language| {
4400                        &mut language.auto_indent_on_paste
4401                    })
4402                },
4403            }),
4404            metadata: None,
4405        }),
4406        SettingsPageItem::SectionHeader("Wrapping"),
4407        SettingsPageItem::SettingItem(SettingItem {
4408            title: "Soft Wrap",
4409            description: "How to soft-wrap long lines of text",
4410            field: Box::new(SettingField {
4411                pick: |settings_content| {
4412                    language_settings_field(settings_content, |language| &language.soft_wrap)
4413                },
4414                pick_mut: |settings_content| {
4415                    language_settings_field_mut(settings_content, |language| {
4416                        &mut language.soft_wrap
4417                    })
4418                },
4419            }),
4420            metadata: None,
4421        }),
4422        SettingsPageItem::SettingItem(SettingItem {
4423            title: "Show Wrap Guides",
4424            description: "Whether to show wrap guides in the editor. Setting this to true will show a guide at the 'preferred_line_length' value if softwrap is set to 'preferred_line_length', and will show any additional guides as specified by the 'wrap_guides' setting",
4425            field: Box::new(SettingField {
4426                pick: |settings_content| {
4427                    language_settings_field(settings_content, |language| &language.show_wrap_guides)
4428                },
4429                pick_mut: |settings_content| {
4430                    language_settings_field_mut(settings_content, |language| {
4431                        &mut language.show_wrap_guides
4432                    })
4433                },
4434            }),
4435            metadata: None,
4436        }),
4437        SettingsPageItem::SettingItem(SettingItem {
4438            title: "Preferred Line Length",
4439            description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
4440            field: Box::new(SettingField {
4441                pick: |settings_content| {
4442                    language_settings_field(settings_content, |language| {
4443                        &language.preferred_line_length
4444                    })
4445                },
4446                pick_mut: |settings_content| {
4447                    language_settings_field_mut(settings_content, |language| {
4448                        &mut language.preferred_line_length
4449                    })
4450                },
4451            }),
4452            metadata: None,
4453        }),
4454        SettingsPageItem::SettingItem(SettingItem {
4455            title: "Wrap Guides",
4456            description: "Character counts at which to show wrap guides in the editor",
4457            field: Box::new(
4458                SettingField {
4459                    pick: |settings_content| {
4460                        language_settings_field(settings_content, |language| &language.wrap_guides)
4461                    },
4462                    pick_mut: |settings_content| {
4463                        language_settings_field_mut(settings_content, |language| {
4464                            &mut language.wrap_guides
4465                        })
4466                    },
4467                }
4468                .unimplemented(),
4469            ),
4470            metadata: None,
4471        }),
4472        SettingsPageItem::SettingItem(SettingItem {
4473            title: "Allow Rewrap",
4474            description: "Controls where the `editor::Rewrap` action is allowed for this language",
4475            field: Box::new(SettingField {
4476                pick: |settings_content| {
4477                    language_settings_field(settings_content, |language| &language.allow_rewrap)
4478                },
4479                pick_mut: |settings_content| {
4480                    language_settings_field_mut(settings_content, |language| {
4481                        &mut language.allow_rewrap
4482                    })
4483                },
4484            }),
4485            metadata: None,
4486        }),
4487        SettingsPageItem::SectionHeader("Indent Guides"),
4488        SettingsPageItem::SettingItem(SettingItem {
4489            title: "Enabled",
4490            description: "Whether to display indent guides in the editor",
4491            field: Box::new(SettingField {
4492                pick: |settings_content| {
4493                    language_settings_field(settings_content, |language| {
4494                        if let Some(indent_guides) = &language.indent_guides {
4495                            &indent_guides.enabled
4496                        } else {
4497                            &None
4498                        }
4499                    })
4500                },
4501                pick_mut: |settings_content| {
4502                    language_settings_field_mut(settings_content, |language| {
4503                        &mut language.indent_guides.get_or_insert_default().enabled
4504                    })
4505                },
4506            }),
4507            metadata: None,
4508        }),
4509        SettingsPageItem::SettingItem(SettingItem {
4510            title: "Line Width",
4511            description: "The width of the indent guides in pixels, between 1 and 10",
4512            field: Box::new(SettingField {
4513                pick: |settings_content| {
4514                    language_settings_field(settings_content, |language| {
4515                        if let Some(indent_guides) = &language.indent_guides {
4516                            &indent_guides.line_width
4517                        } else {
4518                            &None
4519                        }
4520                    })
4521                },
4522                pick_mut: |settings_content| {
4523                    language_settings_field_mut(settings_content, |language| {
4524                        &mut language.indent_guides.get_or_insert_default().line_width
4525                    })
4526                },
4527            }),
4528            metadata: None,
4529        }),
4530        SettingsPageItem::SettingItem(SettingItem {
4531            title: "Active Line Width",
4532            description: "The width of the active indent guide in pixels, between 1 and 10",
4533            field: Box::new(SettingField {
4534                pick: |settings_content| {
4535                    language_settings_field(settings_content, |language| {
4536                        if let Some(indent_guides) = &language.indent_guides {
4537                            &indent_guides.active_line_width
4538                        } else {
4539                            &None
4540                        }
4541                    })
4542                },
4543                pick_mut: |settings_content| {
4544                    language_settings_field_mut(settings_content, |language| {
4545                        &mut language
4546                            .indent_guides
4547                            .get_or_insert_default()
4548                            .active_line_width
4549                    })
4550                },
4551            }),
4552            metadata: None,
4553        }),
4554        SettingsPageItem::SettingItem(SettingItem {
4555            title: "Coloring",
4556            description: "Determines how indent guides are colored",
4557            field: Box::new(SettingField {
4558                pick: |settings_content| {
4559                    language_settings_field(settings_content, |language| {
4560                        if let Some(indent_guides) = &language.indent_guides {
4561                            &indent_guides.coloring
4562                        } else {
4563                            &None
4564                        }
4565                    })
4566                },
4567                pick_mut: |settings_content| {
4568                    language_settings_field_mut(settings_content, |language| {
4569                        &mut language.indent_guides.get_or_insert_default().coloring
4570                    })
4571                },
4572            }),
4573            metadata: None,
4574        }),
4575        SettingsPageItem::SettingItem(SettingItem {
4576            title: "Background Coloring",
4577            description: "Determines how indent guide backgrounds are colored",
4578            field: Box::new(SettingField {
4579                pick: |settings_content| {
4580                    language_settings_field(settings_content, |language| {
4581                        if let Some(indent_guides) = &language.indent_guides {
4582                            &indent_guides.background_coloring
4583                        } else {
4584                            &None
4585                        }
4586                    })
4587                },
4588                pick_mut: |settings_content| {
4589                    language_settings_field_mut(settings_content, |language| {
4590                        &mut language
4591                            .indent_guides
4592                            .get_or_insert_default()
4593                            .background_coloring
4594                    })
4595                },
4596            }),
4597            metadata: None,
4598        }),
4599        SettingsPageItem::SectionHeader("Formatting"),
4600        SettingsPageItem::SettingItem(SettingItem {
4601            title: "Format On Save",
4602            description: "Whether or not to perform a buffer format before saving",
4603            field: Box::new(
4604                // TODO(settings_ui): this setting should just be a bool
4605                SettingField {
4606                    pick: |settings_content| {
4607                        language_settings_field(settings_content, |language| {
4608                            &language.format_on_save
4609                        })
4610                    },
4611                    pick_mut: |settings_content| {
4612                        language_settings_field_mut(settings_content, |language| {
4613                            &mut language.format_on_save
4614                        })
4615                    },
4616                },
4617            ),
4618            metadata: None,
4619        }),
4620        SettingsPageItem::SettingItem(SettingItem {
4621            title: "Remove Trailing Whitespace On Save",
4622            description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
4623            field: Box::new(SettingField {
4624                pick: |settings_content| {
4625                    language_settings_field(settings_content, |language| {
4626                        &language.remove_trailing_whitespace_on_save
4627                    })
4628                },
4629                pick_mut: |settings_content| {
4630                    language_settings_field_mut(settings_content, |language| {
4631                        &mut language.remove_trailing_whitespace_on_save
4632                    })
4633                },
4634            }),
4635            metadata: None,
4636        }),
4637        SettingsPageItem::SettingItem(SettingItem {
4638            title: "Ensure Final Newline On Save",
4639            description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
4640            field: Box::new(SettingField {
4641                pick: |settings_content| {
4642                    language_settings_field(settings_content, |language| {
4643                        &language.ensure_final_newline_on_save
4644                    })
4645                },
4646                pick_mut: |settings_content| {
4647                    language_settings_field_mut(settings_content, |language| {
4648                        &mut language.ensure_final_newline_on_save
4649                    })
4650                },
4651            }),
4652            metadata: None,
4653        }),
4654        SettingsPageItem::SettingItem(SettingItem {
4655            title: "Formatter",
4656            description: "How to perform a buffer format",
4657            field: Box::new(
4658                SettingField {
4659                    pick: |settings_content| {
4660                        language_settings_field(settings_content, |language| &language.formatter)
4661                    },
4662                    pick_mut: |settings_content| {
4663                        language_settings_field_mut(settings_content, |language| {
4664                            &mut language.formatter
4665                        })
4666                    },
4667                }
4668                .unimplemented(),
4669            ),
4670            metadata: None,
4671        }),
4672        SettingsPageItem::SettingItem(SettingItem {
4673            title: "Use On Type Format",
4674            description: "Whether to use additional LSP queries to format (and amend) the code after every \"trigger\" symbol input, defined by LSP server capabilities",
4675            field: Box::new(SettingField {
4676                pick: |settings_content| {
4677                    language_settings_field(settings_content, |language| {
4678                        &language.use_on_type_format
4679                    })
4680                },
4681                pick_mut: |settings_content| {
4682                    language_settings_field_mut(settings_content, |language| {
4683                        &mut language.use_on_type_format
4684                    })
4685                },
4686            }),
4687            metadata: None,
4688        }),
4689        SettingsPageItem::SettingItem(SettingItem {
4690            title: "Code Actions On Format",
4691            description: "Which code actions to run on save after the formatter. These are not run if formatting is off",
4692            field: Box::new(
4693                SettingField {
4694                    pick: |settings_content| {
4695                        language_settings_field(settings_content, |language| {
4696                            &language.code_actions_on_format
4697                        })
4698                    },
4699                    pick_mut: |settings_content| {
4700                        language_settings_field_mut(settings_content, |language| {
4701                            &mut language.code_actions_on_format
4702                        })
4703                    },
4704                }
4705                .unimplemented(),
4706            ),
4707            metadata: None,
4708        }),
4709        SettingsPageItem::SectionHeader("Prettier"),
4710        SettingsPageItem::SettingItem(SettingItem {
4711            title: "Allowed",
4712            description: "Enables or disables formatting with Prettier for a given language",
4713            field: Box::new(SettingField {
4714                pick: |settings_content| {
4715                    language_settings_field(settings_content, |language| {
4716                        if let Some(prettier) = &language.prettier {
4717                            &prettier.allowed
4718                        } else {
4719                            &None
4720                        }
4721                    })
4722                },
4723                pick_mut: |settings_content| {
4724                    language_settings_field_mut(settings_content, |language| {
4725                        &mut language.prettier.get_or_insert_default().allowed
4726                    })
4727                },
4728            }),
4729            metadata: None,
4730        }),
4731        SettingsPageItem::SettingItem(SettingItem {
4732            title: "Parser",
4733            description: "Forces Prettier integration to use a specific parser name when formatting files with the language",
4734            field: Box::new(SettingField {
4735                pick: |settings_content| {
4736                    language_settings_field(settings_content, |language| {
4737                        if let Some(prettier) = &language.prettier {
4738                            &prettier.parser
4739                        } else {
4740                            &None
4741                        }
4742                    })
4743                },
4744                pick_mut: |settings_content| {
4745                    language_settings_field_mut(settings_content, |language| {
4746                        &mut language.prettier.get_or_insert_default().parser
4747                    })
4748                },
4749            }),
4750            metadata: None,
4751        }),
4752        SettingsPageItem::SettingItem(SettingItem {
4753            title: "Plugins",
4754            description: "Forces Prettier integration to use specific plugins when formatting files with the language",
4755            field: Box::new(
4756                SettingField {
4757                    pick: |settings_content| {
4758                        language_settings_field(settings_content, |language| {
4759                            if let Some(prettier) = &language.prettier {
4760                                &prettier.plugins
4761                            } else {
4762                                &None
4763                            }
4764                        })
4765                    },
4766                    pick_mut: |settings_content| {
4767                        language_settings_field_mut(settings_content, |language| {
4768                            &mut language.prettier.get_or_insert_default().plugins
4769                        })
4770                    },
4771                }
4772                .unimplemented(),
4773            ),
4774            metadata: None,
4775        }),
4776        SettingsPageItem::SettingItem(SettingItem {
4777            title: "Options",
4778            description: "Default Prettier options, in the format as in package.json section for Prettier",
4779            field: Box::new(
4780                SettingField {
4781                    pick: |settings_content| {
4782                        language_settings_field(settings_content, |language| {
4783                            if let Some(prettier) = &language.prettier {
4784                                &prettier.options
4785                            } else {
4786                                &None
4787                            }
4788                        })
4789                    },
4790                    pick_mut: |settings_content| {
4791                        language_settings_field_mut(settings_content, |language| {
4792                            &mut language.prettier.get_or_insert_default().options
4793                        })
4794                    },
4795                }
4796                .unimplemented(),
4797            ),
4798            metadata: None,
4799        }),
4800        SettingsPageItem::SectionHeader("Autoclose"),
4801        SettingsPageItem::SettingItem(SettingItem {
4802            title: "Use Autoclose",
4803            description: "Whether to automatically type closing characters for you. For example, when you type (, Zed will automatically add a closing ) at the correct position",
4804            field: Box::new(SettingField {
4805                pick: |settings_content| {
4806                    language_settings_field(settings_content, |language| &language.use_autoclose)
4807                },
4808                pick_mut: |settings_content| {
4809                    language_settings_field_mut(settings_content, |language| {
4810                        &mut language.use_autoclose
4811                    })
4812                },
4813            }),
4814            metadata: None,
4815        }),
4816        SettingsPageItem::SettingItem(SettingItem {
4817            title: "Use Auto Surround",
4818            description: "Whether to automatically surround text with characters for you. For example, when you select text and type (, Zed will automatically surround text with ()",
4819            field: Box::new(SettingField {
4820                pick: |settings_content| {
4821                    language_settings_field(settings_content, |language| {
4822                        &language.use_auto_surround
4823                    })
4824                },
4825                pick_mut: |settings_content| {
4826                    language_settings_field_mut(settings_content, |language| {
4827                        &mut language.use_auto_surround
4828                    })
4829                },
4830            }),
4831            metadata: None,
4832        }),
4833        SettingsPageItem::SettingItem(SettingItem {
4834            title: "Always Treat Brackets As Autoclosed",
4835            description: "Controls how the editor handles the autoclosed characters. When set to `false`(default), skipping over and auto-removing of the closing characters happen only for auto-inserted characters. Otherwise(when `true`), the closing characters are always skipped over and auto-removed no matter how they were inserted",
4836            field: Box::new(SettingField {
4837                pick: |settings_content| {
4838                    language_settings_field(settings_content, |language| {
4839                        &language.always_treat_brackets_as_autoclosed
4840                    })
4841                },
4842                pick_mut: |settings_content| {
4843                    language_settings_field_mut(settings_content, |language| {
4844                        &mut language.always_treat_brackets_as_autoclosed
4845                    })
4846                },
4847            }),
4848            metadata: None,
4849        }),
4850        SettingsPageItem::SettingItem(SettingItem {
4851            title: "Jsx Tag Auto Close",
4852            description: "Whether to automatically close JSX tags",
4853            field: Box::new(SettingField {
4854                // TODO(settings_ui): this setting should just be a bool
4855                pick: |settings_content| {
4856                    language_settings_field(settings_content, |language| {
4857                        match language.jsx_tag_auto_close.as_ref() {
4858                            Some(s) => &s.enabled,
4859                            None => &None,
4860                        }
4861                    })
4862                },
4863                pick_mut: |settings_content| {
4864                    language_settings_field_mut(settings_content, |language| {
4865                        &mut language.jsx_tag_auto_close.get_or_insert_default().enabled
4866                    })
4867                },
4868            }),
4869            metadata: None,
4870        }),
4871        SettingsPageItem::SectionHeader("LSP"),
4872        SettingsPageItem::SettingItem(SettingItem {
4873            title: "Enable Language Server",
4874            description: "Whether to use language servers to provide code intelligence",
4875            field: Box::new(SettingField {
4876                pick: |settings_content| {
4877                    language_settings_field(settings_content, |language| {
4878                        &language.enable_language_server
4879                    })
4880                },
4881                pick_mut: |settings_content| {
4882                    language_settings_field_mut(settings_content, |language| {
4883                        &mut language.enable_language_server
4884                    })
4885                },
4886            }),
4887            metadata: None,
4888        }),
4889        SettingsPageItem::SettingItem(SettingItem {
4890            title: "Language Servers",
4891            description: "The list of language servers to use (or disable) for this language",
4892            field: Box::new(
4893                SettingField {
4894                    pick: |settings_content| {
4895                        language_settings_field(settings_content, |language| {
4896                            &language.language_servers
4897                        })
4898                    },
4899                    pick_mut: |settings_content| {
4900                        language_settings_field_mut(settings_content, |language| {
4901                            &mut language.language_servers
4902                        })
4903                    },
4904                }
4905                .unimplemented(),
4906            ),
4907            metadata: None,
4908        }),
4909        SettingsPageItem::SettingItem(SettingItem {
4910            title: "Linked Edits",
4911            description: "Whether to perform linked edits of associated ranges, if the language server supports it. For example, when editing opening <html> tag, the contents of the closing </html> tag will be edited as well",
4912            field: Box::new(SettingField {
4913                pick: |settings_content| {
4914                    language_settings_field(settings_content, |language| &language.linked_edits)
4915                },
4916                pick_mut: |settings_content| {
4917                    language_settings_field_mut(settings_content, |language| {
4918                        &mut language.linked_edits
4919                    })
4920                },
4921            }),
4922            metadata: None,
4923        }),
4924        SettingsPageItem::SectionHeader("Edit Predictions"),
4925        SettingsPageItem::SettingItem(SettingItem {
4926            title: "Show Edit Predictions",
4927            description: "Controls whether edit predictions are shown immediately (true) or manually by triggering `editor::ShowEditPrediction` (false)",
4928            field: Box::new(SettingField {
4929                pick: |settings_content| {
4930                    language_settings_field(settings_content, |language| {
4931                        &language.show_edit_predictions
4932                    })
4933                },
4934                pick_mut: |settings_content| {
4935                    language_settings_field_mut(settings_content, |language| {
4936                        &mut language.show_edit_predictions
4937                    })
4938                },
4939            }),
4940            metadata: None,
4941        }),
4942        SettingsPageItem::SettingItem(SettingItem {
4943            title: "Edit Predictions Disabled In",
4944            description: "Controls whether edit predictions are shown in the given language scopes",
4945            field: Box::new(
4946                SettingField {
4947                    pick: |settings_content| {
4948                        language_settings_field(settings_content, |language| {
4949                            &language.edit_predictions_disabled_in
4950                        })
4951                    },
4952                    pick_mut: |settings_content| {
4953                        language_settings_field_mut(settings_content, |language| {
4954                            &mut language.edit_predictions_disabled_in
4955                        })
4956                    },
4957                }
4958                .unimplemented(),
4959            ),
4960            metadata: None,
4961        }),
4962        SettingsPageItem::SectionHeader("Whitespace"),
4963        SettingsPageItem::SettingItem(SettingItem {
4964            title: "Show Whitespaces",
4965            description: "Whether to show tabs and spaces in the editor",
4966            field: Box::new(SettingField {
4967                pick: |settings_content| {
4968                    language_settings_field(settings_content, |language| &language.show_whitespaces)
4969                },
4970                pick_mut: |settings_content| {
4971                    language_settings_field_mut(settings_content, |language| {
4972                        &mut language.show_whitespaces
4973                    })
4974                },
4975            }),
4976            metadata: None,
4977        }),
4978        SettingsPageItem::SettingItem(SettingItem {
4979            title: "Space Whitespace Indicator",
4980            description: "Visible character used to render space characters when show_whitespaces is enabled (default: \"\")",
4981            field: Box::new(
4982                SettingField {
4983                    pick: |settings_content| {
4984                        language_settings_field(settings_content, |language| {
4985                            if let Some(whitespace_map) = &language.whitespace_map {
4986                                &whitespace_map.space
4987                            } else {
4988                                &None
4989                            }
4990                        })
4991                    },
4992                    pick_mut: |settings_content| {
4993                        language_settings_field_mut(settings_content, |language| {
4994                            &mut language.whitespace_map.get_or_insert_default().space
4995                        })
4996                    },
4997                }
4998                .unimplemented(),
4999            ),
5000            metadata: None,
5001        }),
5002        SettingsPageItem::SettingItem(SettingItem {
5003            title: "Tab Whitespace Indicator",
5004            description: "Visible character used to render tab characters when show_whitespaces is enabled (default: \"\")",
5005            field: Box::new(
5006                SettingField {
5007                    pick: |settings_content| {
5008                        language_settings_field(settings_content, |language| {
5009                            if let Some(whitespace_map) = &language.whitespace_map {
5010                                &whitespace_map.tab
5011                            } else {
5012                                &None
5013                            }
5014                        })
5015                    },
5016                    pick_mut: |settings_content| {
5017                        language_settings_field_mut(settings_content, |language| {
5018                            &mut language.whitespace_map.get_or_insert_default().tab
5019                        })
5020                    },
5021                }
5022                .unimplemented(),
5023            ),
5024            metadata: None,
5025        }),
5026        SettingsPageItem::SectionHeader("Completions"),
5027        SettingsPageItem::SettingItem(SettingItem {
5028            title: "Show Completions On Input",
5029            description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
5030            field: Box::new(SettingField {
5031                pick: |settings_content| {
5032                    language_settings_field(settings_content, |language| {
5033                        &language.show_completions_on_input
5034                    })
5035                },
5036                pick_mut: |settings_content| {
5037                    language_settings_field_mut(settings_content, |language| {
5038                        &mut language.show_completions_on_input
5039                    })
5040                },
5041            }),
5042            metadata: None,
5043        }),
5044        SettingsPageItem::SettingItem(SettingItem {
5045            title: "Show Completion Documentation",
5046            description: "Whether to display inline and alongside documentation for items in the completions menu",
5047            field: Box::new(SettingField {
5048                pick: |settings_content| {
5049                    language_settings_field(settings_content, |language| {
5050                        &language.show_completion_documentation
5051                    })
5052                },
5053                pick_mut: |settings_content| {
5054                    language_settings_field_mut(settings_content, |language| {
5055                        &mut language.show_completion_documentation
5056                    })
5057                },
5058            }),
5059            metadata: None,
5060        }),
5061        SettingsPageItem::SettingItem(SettingItem {
5062            title: "Words",
5063            description: "Controls how words are completed",
5064            field: Box::new(SettingField {
5065                pick: |settings_content| {
5066                    language_settings_field(settings_content, |language| {
5067                        if let Some(completions) = &language.completions {
5068                            &completions.words
5069                        } else {
5070                            &None
5071                        }
5072                    })
5073                },
5074                pick_mut: |settings_content| {
5075                    language_settings_field_mut(settings_content, |language| {
5076                        &mut language.completions.get_or_insert_default().words
5077                    })
5078                },
5079            }),
5080            metadata: None,
5081        }),
5082        SettingsPageItem::SettingItem(SettingItem {
5083            title: "Words Min Length",
5084            description: "How many characters has to be in the completions query to automatically show the words-based completions",
5085            field: Box::new(SettingField {
5086                pick: |settings_content| {
5087                    language_settings_field(settings_content, |language| {
5088                        if let Some(completions) = &language.completions {
5089                            &completions.words_min_length
5090                        } else {
5091                            &None
5092                        }
5093                    })
5094                },
5095                pick_mut: |settings_content| {
5096                    language_settings_field_mut(settings_content, |language| {
5097                        &mut language
5098                            .completions
5099                            .get_or_insert_default()
5100                            .words_min_length
5101                    })
5102                },
5103            }),
5104            metadata: None,
5105        }),
5106        SettingsPageItem::SettingItem(SettingItem {
5107            title: "Lsp",
5108            description: "Whether to fetch LSP completions or not",
5109            field: Box::new(SettingField {
5110                pick: |settings_content| {
5111                    language_settings_field(settings_content, |language| {
5112                        if let Some(completions) = &language.completions {
5113                            &completions.lsp
5114                        } else {
5115                            &None
5116                        }
5117                    })
5118                },
5119                pick_mut: |settings_content| {
5120                    language_settings_field_mut(settings_content, |language| {
5121                        &mut language.completions.get_or_insert_default().lsp
5122                    })
5123                },
5124            }),
5125            metadata: None,
5126        }),
5127        SettingsPageItem::SettingItem(SettingItem {
5128            title: "Lsp Fetch Timeout Ms",
5129            description: "When fetching LSP completions, determines how long to wait for a response of a particular server (set to 0 to wait indefinitely)",
5130            field: Box::new(SettingField {
5131                pick: |settings_content| {
5132                    language_settings_field(settings_content, |language| {
5133                        if let Some(completions) = &language.completions {
5134                            &completions.lsp_fetch_timeout_ms
5135                        } else {
5136                            &None
5137                        }
5138                    })
5139                },
5140                pick_mut: |settings_content| {
5141                    language_settings_field_mut(settings_content, |language| {
5142                        &mut language
5143                            .completions
5144                            .get_or_insert_default()
5145                            .lsp_fetch_timeout_ms
5146                    })
5147                },
5148            }),
5149            metadata: None,
5150        }),
5151        SettingsPageItem::SettingItem(SettingItem {
5152            title: "Lsp Insert Mode",
5153            description: "Controls how LSP completions are inserted",
5154            field: Box::new(SettingField {
5155                pick: |settings_content| {
5156                    language_settings_field(settings_content, |language| {
5157                        if let Some(completions) = &language.completions {
5158                            &completions.lsp_insert_mode
5159                        } else {
5160                            &None
5161                        }
5162                    })
5163                },
5164                pick_mut: |settings_content| {
5165                    language_settings_field_mut(settings_content, |language| {
5166                        &mut language.completions.get_or_insert_default().lsp_insert_mode
5167                    })
5168                },
5169            }),
5170            metadata: None,
5171        }),
5172        SettingsPageItem::SectionHeader("Inlay Hints"),
5173        SettingsPageItem::SettingItem(SettingItem {
5174            title: "Enabled",
5175            description: "Global switch to toggle hints on and off",
5176            field: Box::new(SettingField {
5177                pick: |settings_content| {
5178                    language_settings_field(settings_content, |language| {
5179                        if let Some(inlay_hints) = &language.inlay_hints {
5180                            &inlay_hints.enabled
5181                        } else {
5182                            &None
5183                        }
5184                    })
5185                },
5186                pick_mut: |settings_content| {
5187                    language_settings_field_mut(settings_content, |language| {
5188                        &mut language.inlay_hints.get_or_insert_default().enabled
5189                    })
5190                },
5191            }),
5192            metadata: None,
5193        }),
5194        SettingsPageItem::SettingItem(SettingItem {
5195            title: "Show Value Hints",
5196            description: "Global switch to toggle inline values on and off when debugging",
5197            field: Box::new(SettingField {
5198                pick: |settings_content| {
5199                    language_settings_field(settings_content, |language| {
5200                        if let Some(inlay_hints) = &language.inlay_hints {
5201                            &inlay_hints.show_value_hints
5202                        } else {
5203                            &None
5204                        }
5205                    })
5206                },
5207                pick_mut: |settings_content| {
5208                    language_settings_field_mut(settings_content, |language| {
5209                        &mut language
5210                            .inlay_hints
5211                            .get_or_insert_default()
5212                            .show_value_hints
5213                    })
5214                },
5215            }),
5216            metadata: None,
5217        }),
5218        SettingsPageItem::SettingItem(SettingItem {
5219            title: "Show Type Hints",
5220            description: "Whether type hints should be shown",
5221            field: Box::new(SettingField {
5222                pick: |settings_content| {
5223                    language_settings_field(settings_content, |language| {
5224                        if let Some(inlay_hints) = &language.inlay_hints {
5225                            &inlay_hints.show_type_hints
5226                        } else {
5227                            &None
5228                        }
5229                    })
5230                },
5231                pick_mut: |settings_content| {
5232                    language_settings_field_mut(settings_content, |language| {
5233                        &mut language.inlay_hints.get_or_insert_default().show_type_hints
5234                    })
5235                },
5236            }),
5237            metadata: None,
5238        }),
5239        SettingsPageItem::SettingItem(SettingItem {
5240            title: "Show Parameter Hints",
5241            description: "Whether parameter hints should be shown",
5242            field: Box::new(SettingField {
5243                pick: |settings_content| {
5244                    language_settings_field(settings_content, |language| {
5245                        if let Some(inlay_hints) = &language.inlay_hints {
5246                            &inlay_hints.show_parameter_hints
5247                        } else {
5248                            &None
5249                        }
5250                    })
5251                },
5252                pick_mut: |settings_content| {
5253                    language_settings_field_mut(settings_content, |language| {
5254                        &mut language
5255                            .inlay_hints
5256                            .get_or_insert_default()
5257                            .show_parameter_hints
5258                    })
5259                },
5260            }),
5261            metadata: None,
5262        }),
5263        SettingsPageItem::SettingItem(SettingItem {
5264            title: "Show Other Hints",
5265            description: "Whether other hints should be shown",
5266            field: Box::new(SettingField {
5267                pick: |settings_content| {
5268                    language_settings_field(settings_content, |language| {
5269                        if let Some(inlay_hints) = &language.inlay_hints {
5270                            &inlay_hints.show_other_hints
5271                        } else {
5272                            &None
5273                        }
5274                    })
5275                },
5276                pick_mut: |settings_content| {
5277                    language_settings_field_mut(settings_content, |language| {
5278                        &mut language
5279                            .inlay_hints
5280                            .get_or_insert_default()
5281                            .show_other_hints
5282                    })
5283                },
5284            }),
5285            metadata: None,
5286        }),
5287        SettingsPageItem::SettingItem(SettingItem {
5288            title: "Show Background",
5289            description: "Whether to show a background for inlay hints",
5290            field: Box::new(SettingField {
5291                pick: |settings_content| {
5292                    language_settings_field(settings_content, |language| {
5293                        if let Some(inlay_hints) = &language.inlay_hints {
5294                            &inlay_hints.show_background
5295                        } else {
5296                            &None
5297                        }
5298                    })
5299                },
5300                pick_mut: |settings_content| {
5301                    language_settings_field_mut(settings_content, |language| {
5302                        &mut language.inlay_hints.get_or_insert_default().show_background
5303                    })
5304                },
5305            }),
5306            metadata: None,
5307        }),
5308        SettingsPageItem::SettingItem(SettingItem {
5309            title: "Edit Debounce Ms",
5310            description: "Whether or not to debounce inlay hints updates after buffer edits (set to 0 to disable debouncing)",
5311            field: Box::new(SettingField {
5312                pick: |settings_content| {
5313                    language_settings_field(settings_content, |language| {
5314                        if let Some(inlay_hints) = &language.inlay_hints {
5315                            &inlay_hints.edit_debounce_ms
5316                        } else {
5317                            &None
5318                        }
5319                    })
5320                },
5321                pick_mut: |settings_content| {
5322                    language_settings_field_mut(settings_content, |language| {
5323                        &mut language
5324                            .inlay_hints
5325                            .get_or_insert_default()
5326                            .edit_debounce_ms
5327                    })
5328                },
5329            }),
5330            metadata: None,
5331        }),
5332        SettingsPageItem::SettingItem(SettingItem {
5333            title: "Scroll Debounce Ms",
5334            description: "Whether or not to debounce inlay hints updates after buffer scrolls (set to 0 to disable debouncing)",
5335            field: Box::new(SettingField {
5336                pick: |settings_content| {
5337                    language_settings_field(settings_content, |language| {
5338                        if let Some(inlay_hints) = &language.inlay_hints {
5339                            &inlay_hints.scroll_debounce_ms
5340                        } else {
5341                            &None
5342                        }
5343                    })
5344                },
5345                pick_mut: |settings_content| {
5346                    language_settings_field_mut(settings_content, |language| {
5347                        &mut language
5348                            .inlay_hints
5349                            .get_or_insert_default()
5350                            .scroll_debounce_ms
5351                    })
5352                },
5353            }),
5354            metadata: None,
5355        }),
5356        SettingsPageItem::SettingItem(SettingItem {
5357            title: "Toggle On Modifiers Press",
5358            description: "Toggles inlay hints (hides or shows) when the user presses the modifiers specified",
5359            field: Box::new(
5360                SettingField {
5361                    pick: |settings_content| {
5362                        language_settings_field(settings_content, |language| {
5363                            if let Some(inlay_hints) = &language.inlay_hints {
5364                                &inlay_hints.toggle_on_modifiers_press
5365                            } else {
5366                                &None
5367                            }
5368                        })
5369                    },
5370                    pick_mut: |settings_content| {
5371                        language_settings_field_mut(settings_content, |language| {
5372                            &mut language
5373                                .inlay_hints
5374                                .get_or_insert_default()
5375                                .toggle_on_modifiers_press
5376                        })
5377                    },
5378                }
5379                .unimplemented(),
5380            ),
5381            metadata: None,
5382        }),
5383        SettingsPageItem::SectionHeader("Tasks"),
5384        SettingsPageItem::SettingItem(SettingItem {
5385            title: "Enabled",
5386            description: "Whether tasks are enabled for this language",
5387            field: Box::new(SettingField {
5388                pick: |settings_content| {
5389                    language_settings_field(settings_content, |language| {
5390                        if let Some(tasks) = &language.tasks {
5391                            &tasks.enabled
5392                        } else {
5393                            &None
5394                        }
5395                    })
5396                },
5397                pick_mut: |settings_content| {
5398                    language_settings_field_mut(settings_content, |language| {
5399                        &mut language.tasks.get_or_insert_default().enabled
5400                    })
5401                },
5402            }),
5403            metadata: None,
5404        }),
5405        SettingsPageItem::SettingItem(SettingItem {
5406            title: "Variables",
5407            description: "Extra task variables to set for a particular language",
5408            field: Box::new(
5409                SettingField {
5410                    pick: |settings_content| {
5411                        language_settings_field(settings_content, |language| {
5412                            if let Some(tasks) = &language.tasks {
5413                                &tasks.variables
5414                            } else {
5415                                &None
5416                            }
5417                        })
5418                    },
5419                    pick_mut: |settings_content| {
5420                        language_settings_field_mut(settings_content, |language| {
5421                            &mut language.tasks.get_or_insert_default().variables
5422                        })
5423                    },
5424                }
5425                .unimplemented(),
5426            ),
5427            metadata: None,
5428        }),
5429        SettingsPageItem::SettingItem(SettingItem {
5430            title: "Prefer Lsp",
5431            description: "Use LSP tasks over Zed language extension ones",
5432            field: Box::new(SettingField {
5433                pick: |settings_content| {
5434                    language_settings_field(settings_content, |language| {
5435                        if let Some(tasks) = &language.tasks {
5436                            &tasks.prefer_lsp
5437                        } else {
5438                            &None
5439                        }
5440                    })
5441                },
5442                pick_mut: |settings_content| {
5443                    language_settings_field_mut(settings_content, |language| {
5444                        &mut language.tasks.get_or_insert_default().prefer_lsp
5445                    })
5446                },
5447            }),
5448            metadata: None,
5449        }),
5450        SettingsPageItem::SectionHeader("Miscellaneous"),
5451        SettingsPageItem::SettingItem(SettingItem {
5452            title: "Debuggers",
5453            description: "Preferred debuggers for this language",
5454            field: Box::new(
5455                SettingField {
5456                    pick: |settings_content| {
5457                        language_settings_field(settings_content, |language| &language.debuggers)
5458                    },
5459                    pick_mut: |settings_content| {
5460                        language_settings_field_mut(settings_content, |language| {
5461                            &mut language.debuggers
5462                        })
5463                    },
5464                }
5465                .unimplemented(),
5466            ),
5467            metadata: None,
5468        }),
5469        SettingsPageItem::SettingItem(SettingItem {
5470            title: "Extend Comment On Newline",
5471            description: "Whether to start a new line with a comment when a previous line is a comment as well",
5472            field: Box::new(SettingField {
5473                pick: |settings_content| {
5474                    language_settings_field(settings_content, |language| {
5475                        &language.extend_comment_on_newline
5476                    })
5477                },
5478                pick_mut: |settings_content| {
5479                    language_settings_field_mut(settings_content, |language| {
5480                        &mut language.extend_comment_on_newline
5481                    })
5482                },
5483            }),
5484            metadata: None,
5485        }),
5486    ]
5487}