page_data.rs

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