page_data.rs

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