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::SettingItem(SettingItem {
2620                    title: "Hide Hidden",
2621                    description: "Whether to hide the hidden entries in the project panel",
2622                    field: Box::new(SettingField {
2623                        pick: |settings_content| {
2624                            if let Some(project_panel) = &settings_content.project_panel {
2625                                &project_panel.hide_hidden
2626                            } else {
2627                                &None
2628                            }
2629                        },
2630                        pick_mut: |settings_content| {
2631                            &mut settings_content
2632                                .project_panel
2633                                .get_or_insert_default()
2634                                .hide_hidden
2635                        },
2636                    }),
2637                    metadata: None,
2638                    files: USER,
2639                }),
2640                SettingsPageItem::SectionHeader("Terminal Panel"),
2641                SettingsPageItem::SettingItem(SettingItem {
2642                    title: "Terminal Dock",
2643                    description: "Where to dock the terminal panel",
2644                    field: Box::new(SettingField {
2645                        pick: |settings_content| {
2646                            if let Some(terminal) = &settings_content.terminal {
2647                                &terminal.dock
2648                            } else {
2649                                &None
2650                            }
2651                        },
2652                        pick_mut: |settings_content| {
2653                            &mut settings_content.terminal.get_or_insert_default().dock
2654                        },
2655                    }),
2656                    metadata: None,
2657                    files: USER,
2658                }),
2659                SettingsPageItem::SectionHeader("Outline Panel"),
2660                SettingsPageItem::SettingItem(SettingItem {
2661                    title: "Outline Panel Button",
2662                    description: "Show the outline panel button in the status bar",
2663                    field: Box::new(SettingField {
2664                        pick: |settings_content| {
2665                            if let Some(outline_panel) = &settings_content.outline_panel {
2666                                &outline_panel.button
2667                            } else {
2668                                &None
2669                            }
2670                        },
2671                        pick_mut: |settings_content| {
2672                            &mut settings_content
2673                                .outline_panel
2674                                .get_or_insert_default()
2675                                .button
2676                        },
2677                    }),
2678                    metadata: None,
2679                    files: USER,
2680                }),
2681                SettingsPageItem::SettingItem(SettingItem {
2682                    title: "Outline Panel Dock",
2683                    description: "Where to dock the outline panel",
2684                    field: Box::new(SettingField {
2685                        pick: |settings_content| {
2686                            if let Some(outline_panel) = &settings_content.outline_panel {
2687                                &outline_panel.dock
2688                            } else {
2689                                &None
2690                            }
2691                        },
2692                        pick_mut: |settings_content| {
2693                            &mut settings_content.outline_panel.get_or_insert_default().dock
2694                        },
2695                    }),
2696                    metadata: None,
2697                    files: USER,
2698                }),
2699                SettingsPageItem::SettingItem(SettingItem {
2700                    title: "Outline Panel Default Width",
2701                    description: "Default width of the outline panel in pixels",
2702                    field: Box::new(SettingField {
2703                        pick: |settings_content| {
2704                            if let Some(outline_panel) = &settings_content.outline_panel {
2705                                &outline_panel.default_width
2706                            } else {
2707                                &None
2708                            }
2709                        },
2710                        pick_mut: |settings_content| {
2711                            &mut settings_content
2712                                .outline_panel
2713                                .get_or_insert_default()
2714                                .default_width
2715                        },
2716                    }),
2717                    metadata: None,
2718                    files: USER,
2719                }),
2720                SettingsPageItem::SettingItem(SettingItem {
2721                    title: "File Icons",
2722                    description: "Show file icons 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.file_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                                .file_icons
2736                        },
2737                    }),
2738                    metadata: None,
2739                    files: USER,
2740                }),
2741                SettingsPageItem::SettingItem(SettingItem {
2742                    title: "Folder Icons",
2743                    description: "Whether to show folder icons or chevrons for directories 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.folder_icons
2748                            } else {
2749                                &None
2750                            }
2751                        },
2752                        pick_mut: |settings_content| {
2753                            &mut settings_content
2754                                .outline_panel
2755                                .get_or_insert_default()
2756                                .folder_icons
2757                        },
2758                    }),
2759                    metadata: None,
2760                    files: USER,
2761                }),
2762                SettingsPageItem::SettingItem(SettingItem {
2763                    title: "Git Status",
2764                    description: "Show the git status in the outline panel",
2765                    field: Box::new(SettingField {
2766                        pick: |settings_content| {
2767                            if let Some(outline_panel) = &settings_content.outline_panel {
2768                                &outline_panel.git_status
2769                            } else {
2770                                &None
2771                            }
2772                        },
2773                        pick_mut: |settings_content| {
2774                            &mut settings_content
2775                                .outline_panel
2776                                .get_or_insert_default()
2777                                .git_status
2778                        },
2779                    }),
2780                    metadata: None,
2781                    files: USER,
2782                }),
2783                SettingsPageItem::SettingItem(SettingItem {
2784                    title: "Indent Size",
2785                    description: "Amount of indentation for nested items",
2786                    field: Box::new(SettingField {
2787                        pick: |settings_content| {
2788                            if let Some(outline_panel) = &settings_content.outline_panel {
2789                                &outline_panel.indent_size
2790                            } else {
2791                                &None
2792                            }
2793                        },
2794                        pick_mut: |settings_content| {
2795                            &mut settings_content
2796                                .outline_panel
2797                                .get_or_insert_default()
2798                                .indent_size
2799                        },
2800                    }),
2801                    metadata: None,
2802                    files: USER,
2803                }),
2804                SettingsPageItem::SettingItem(SettingItem {
2805                    title: "Auto Reveal Entries",
2806                    description: "Whether to reveal when a corresponding outline entry becomes active",
2807                    field: Box::new(SettingField {
2808                        pick: |settings_content| {
2809                            if let Some(outline_panel) = &settings_content.outline_panel {
2810                                &outline_panel.auto_reveal_entries
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_reveal_entries
2820                        },
2821                    }),
2822                    metadata: None,
2823                    files: USER,
2824                }),
2825                SettingsPageItem::SettingItem(SettingItem {
2826                    title: "Auto Fold Directories",
2827                    description: "Whether to fold directories automatically when a directory contains only one subdirectory",
2828                    field: Box::new(SettingField {
2829                        pick: |settings_content| {
2830                            if let Some(outline_panel) = &settings_content.outline_panel {
2831                                &outline_panel.auto_fold_dirs
2832                            } else {
2833                                &None
2834                            }
2835                        },
2836                        pick_mut: |settings_content| {
2837                            &mut settings_content
2838                                .outline_panel
2839                                .get_or_insert_default()
2840                                .auto_fold_dirs
2841                        },
2842                    }),
2843                    metadata: None,
2844                    files: USER,
2845                }),
2846                SettingsPageItem::SettingItem(SettingItem {
2847                    files: USER,
2848                    title: "Indent Guides Show",
2849                    description: "When to show indent guides in the outline panel",
2850                    field: Box::new(
2851                        SettingField {
2852                            pick: |settings_content| {
2853                                if let Some(outline_panel) = &settings_content.outline_panel {
2854                                    if let Some(indent_guides) = &outline_panel.indent_guides {
2855                                        &indent_guides.show
2856                                    } else {
2857                                        &None
2858                                    }
2859                                } else {
2860                                    &None
2861                                }
2862                            },
2863                            pick_mut: |settings_content| {
2864                                &mut settings_content
2865                                    .outline_panel
2866                                    .get_or_insert_default()
2867                                    .indent_guides
2868                                    .get_or_insert_default()
2869                                    .show
2870                            },
2871                        }
2872                        .unimplemented(),
2873                    ),
2874                    metadata: None,
2875                }),
2876                SettingsPageItem::SectionHeader("Git Panel"),
2877                SettingsPageItem::SettingItem(SettingItem {
2878                    title: "Git Panel Button",
2879                    description: "Show the Git panel button in the status bar",
2880                    field: Box::new(SettingField {
2881                        pick: |settings_content| {
2882                            if let Some(git_panel) = &settings_content.git_panel {
2883                                &git_panel.button
2884                            } else {
2885                                &None
2886                            }
2887                        },
2888                        pick_mut: |settings_content| {
2889                            &mut settings_content.git_panel.get_or_insert_default().button
2890                        },
2891                    }),
2892                    metadata: None,
2893                    files: USER,
2894                }),
2895                SettingsPageItem::SettingItem(SettingItem {
2896                    title: "Git Panel Dock",
2897                    description: "Where to dock the Git panel",
2898                    field: Box::new(SettingField {
2899                        pick: |settings_content| {
2900                            if let Some(git_panel) = &settings_content.git_panel {
2901                                &git_panel.dock
2902                            } else {
2903                                &None
2904                            }
2905                        },
2906                        pick_mut: |settings_content| {
2907                            &mut settings_content.git_panel.get_or_insert_default().dock
2908                        },
2909                    }),
2910                    metadata: None,
2911                    files: USER,
2912                }),
2913                SettingsPageItem::SettingItem(SettingItem {
2914                    title: "Git Panel Default Width",
2915                    description: "Default width of the Git panel in pixels",
2916                    field: Box::new(SettingField {
2917                        pick: |settings_content| {
2918                            if let Some(git_panel) = &settings_content.git_panel {
2919                                &git_panel.default_width
2920                            } else {
2921                                &None
2922                            }
2923                        },
2924                        pick_mut: |settings_content| {
2925                            &mut settings_content
2926                                .git_panel
2927                                .get_or_insert_default()
2928                                .default_width
2929                        },
2930                    }),
2931                    metadata: None,
2932                    files: USER,
2933                }),
2934                SettingsPageItem::SectionHeader("Debugger Panel"),
2935                SettingsPageItem::SettingItem(SettingItem {
2936                    title: "Debugger Panel Dock",
2937                    description: "The dock position of the debug panel",
2938                    field: Box::new(SettingField {
2939                        pick: |settings_content| {
2940                            if let Some(debugger) = &settings_content.debugger {
2941                                &debugger.dock
2942                            } else {
2943                                &None
2944                            }
2945                        },
2946                        pick_mut: |settings_content| {
2947                            &mut settings_content.debugger.get_or_insert_default().dock
2948                        },
2949                    }),
2950                    metadata: None,
2951                    files: USER,
2952                }),
2953                SettingsPageItem::SectionHeader("Notification Panel"),
2954                SettingsPageItem::SettingItem(SettingItem {
2955                    title: "Notification Panel Button",
2956                    description: "Show the notification panel button in the status bar",
2957                    field: Box::new(SettingField {
2958                        pick: |settings_content| {
2959                            if let Some(notification_panel) = &settings_content.notification_panel {
2960                                &notification_panel.button
2961                            } else {
2962                                &None
2963                            }
2964                        },
2965                        pick_mut: |settings_content| {
2966                            &mut settings_content
2967                                .notification_panel
2968                                .get_or_insert_default()
2969                                .button
2970                        },
2971                    }),
2972                    metadata: None,
2973                    files: USER,
2974                }),
2975                SettingsPageItem::SettingItem(SettingItem {
2976                    title: "Notification Panel Dock",
2977                    description: "Where to dock the notification panel",
2978                    field: Box::new(SettingField {
2979                        pick: |settings_content| {
2980                            if let Some(notification_panel) = &settings_content.notification_panel {
2981                                &notification_panel.dock
2982                            } else {
2983                                &None
2984                            }
2985                        },
2986                        pick_mut: |settings_content| {
2987                            &mut settings_content
2988                                .notification_panel
2989                                .get_or_insert_default()
2990                                .dock
2991                        },
2992                    }),
2993                    metadata: None,
2994                    files: USER,
2995                }),
2996                SettingsPageItem::SettingItem(SettingItem {
2997                    title: "Notification Panel Default Width",
2998                    description: "Default width of the notification panel in pixels",
2999                    field: Box::new(SettingField {
3000                        pick: |settings_content| {
3001                            if let Some(notification_panel) = &settings_content.notification_panel {
3002                                &notification_panel.default_width
3003                            } else {
3004                                &None
3005                            }
3006                        },
3007                        pick_mut: |settings_content| {
3008                            &mut settings_content
3009                                .notification_panel
3010                                .get_or_insert_default()
3011                                .default_width
3012                        },
3013                    }),
3014                    metadata: None,
3015                    files: USER,
3016                }),
3017                SettingsPageItem::SectionHeader("Collaboration Panel"),
3018                SettingsPageItem::SettingItem(SettingItem {
3019                    title: "Collaboration Panel Button",
3020                    description: "Show the collaboration panel button in the status bar",
3021                    field: Box::new(SettingField {
3022                        pick: |settings_content| {
3023                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3024                            {
3025                                &collaboration_panel.button
3026                            } else {
3027                                &None
3028                            }
3029                        },
3030                        pick_mut: |settings_content| {
3031                            &mut settings_content
3032                                .collaboration_panel
3033                                .get_or_insert_default()
3034                                .button
3035                        },
3036                    }),
3037                    metadata: None,
3038                    files: USER,
3039                }),
3040                SettingsPageItem::SettingItem(SettingItem {
3041                    title: "Collaboration Panel Dock",
3042                    description: "Where to dock the collaboration panel",
3043                    field: Box::new(SettingField {
3044                        pick: |settings_content| {
3045                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3046                            {
3047                                &collaboration_panel.dock
3048                            } else {
3049                                &None
3050                            }
3051                        },
3052                        pick_mut: |settings_content| {
3053                            &mut settings_content
3054                                .collaboration_panel
3055                                .get_or_insert_default()
3056                                .dock
3057                        },
3058                    }),
3059                    metadata: None,
3060                    files: USER,
3061                }),
3062                SettingsPageItem::SettingItem(SettingItem {
3063                    title: "Collaboration Panel Default Width",
3064                    description: "Default width of the collaboration panel in pixels",
3065                    field: Box::new(SettingField {
3066                        pick: |settings_content| {
3067                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3068                            {
3069                                &collaboration_panel.default_width
3070                            } else {
3071                                &None
3072                            }
3073                        },
3074                        pick_mut: |settings_content| {
3075                            &mut settings_content
3076                                .collaboration_panel
3077                                .get_or_insert_default()
3078                                .default_width
3079                        },
3080                    }),
3081                    metadata: None,
3082                    files: USER,
3083                }),
3084                SettingsPageItem::SectionHeader("Agent Panel"),
3085                SettingsPageItem::SettingItem(SettingItem {
3086                    title: "Agent Panel Button",
3087                    description: "Whether to show the agent panel button in the status bar",
3088                    field: Box::new(SettingField {
3089                        pick: |settings_content| {
3090                            if let Some(agent) = &settings_content.agent {
3091                                &agent.button
3092                            } else {
3093                                &None
3094                            }
3095                        },
3096                        pick_mut: |settings_content| {
3097                            &mut settings_content.agent.get_or_insert_default().button
3098                        },
3099                    }),
3100                    metadata: None,
3101                    files: USER,
3102                }),
3103                SettingsPageItem::SettingItem(SettingItem {
3104                    title: "Agent Panel Dock",
3105                    description: "Where to dock the agent panel.",
3106                    field: Box::new(SettingField {
3107                        pick: |settings_content| {
3108                            if let Some(agent) = &settings_content.agent {
3109                                &agent.dock
3110                            } else {
3111                                &None
3112                            }
3113                        },
3114                        pick_mut: |settings_content| {
3115                            &mut settings_content.agent.get_or_insert_default().dock
3116                        },
3117                    }),
3118                    metadata: None,
3119                    files: USER,
3120                }),
3121                SettingsPageItem::SettingItem(SettingItem {
3122                    title: "Agent Panel Default Width",
3123                    description: "Default width when the agent panel is docked to the left or right",
3124                    field: Box::new(SettingField {
3125                        pick: |settings_content| {
3126                            if let Some(agent) = &settings_content.agent {
3127                                &agent.default_width
3128                            } else {
3129                                &None
3130                            }
3131                        },
3132                        pick_mut: |settings_content| {
3133                            &mut settings_content.agent.get_or_insert_default().default_width
3134                        },
3135                    }),
3136                    metadata: None,
3137                    files: USER,
3138                }),
3139                SettingsPageItem::SettingItem(SettingItem {
3140                    title: "Agent Panel Default Height",
3141                    description: "Default height when the agent panel is docked to the bottom",
3142                    field: Box::new(SettingField {
3143                        pick: |settings_content| {
3144                            if let Some(agent) = &settings_content.agent {
3145                                &agent.default_height
3146                            } else {
3147                                &None
3148                            }
3149                        },
3150                        pick_mut: |settings_content| {
3151                            &mut settings_content
3152                                .agent
3153                                .get_or_insert_default()
3154                                .default_height
3155                        },
3156                    }),
3157                    metadata: None,
3158                    files: USER,
3159                }),
3160            ],
3161        },
3162        SettingsPage {
3163            title: "Debugger",
3164            items: vec![
3165                SettingsPageItem::SectionHeader("General"),
3166                SettingsPageItem::SettingItem(SettingItem {
3167                    title: "Stepping Granularity",
3168                    description: "Determines the stepping granularity for debug operations",
3169                    field: Box::new(SettingField {
3170                        pick: |settings_content| {
3171                            if let Some(debugger) = &settings_content.debugger {
3172                                &debugger.stepping_granularity
3173                            } else {
3174                                &None
3175                            }
3176                        },
3177                        pick_mut: |settings_content| {
3178                            &mut settings_content
3179                                .debugger
3180                                .get_or_insert_default()
3181                                .stepping_granularity
3182                        },
3183                    }),
3184                    metadata: None,
3185                    files: USER,
3186                }),
3187                SettingsPageItem::SettingItem(SettingItem {
3188                    title: "Save Breakpoints",
3189                    description: "Whether breakpoints should be reused across Zed sessions",
3190                    field: Box::new(SettingField {
3191                        pick: |settings_content| {
3192                            if let Some(debugger) = &settings_content.debugger {
3193                                &debugger.save_breakpoints
3194                            } else {
3195                                &None
3196                            }
3197                        },
3198                        pick_mut: |settings_content| {
3199                            &mut settings_content
3200                                .debugger
3201                                .get_or_insert_default()
3202                                .save_breakpoints
3203                        },
3204                    }),
3205                    metadata: None,
3206                    files: USER,
3207                }),
3208                SettingsPageItem::SettingItem(SettingItem {
3209                    title: "Timeout",
3210                    description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter",
3211                    field: Box::new(SettingField {
3212                        pick: |settings_content| {
3213                            if let Some(debugger) = &settings_content.debugger {
3214                                &debugger.timeout
3215                            } else {
3216                                &None
3217                            }
3218                        },
3219                        pick_mut: |settings_content| {
3220                            &mut settings_content.debugger.get_or_insert_default().timeout
3221                        },
3222                    }),
3223                    metadata: None,
3224                    files: USER,
3225                }),
3226                SettingsPageItem::SettingItem(SettingItem {
3227                    title: "Log DAP Communications",
3228                    description: "Whether to log messages between active debug adapters and Zed",
3229                    field: Box::new(SettingField {
3230                        pick: |settings_content| {
3231                            if let Some(debugger) = &settings_content.debugger {
3232                                &debugger.log_dap_communications
3233                            } else {
3234                                &None
3235                            }
3236                        },
3237                        pick_mut: |settings_content| {
3238                            &mut settings_content
3239                                .debugger
3240                                .get_or_insert_default()
3241                                .log_dap_communications
3242                        },
3243                    }),
3244                    metadata: None,
3245                    files: USER,
3246                }),
3247                SettingsPageItem::SettingItem(SettingItem {
3248                    title: "Format DAP Log Messages",
3249                    description: "Whether to format DAP messages when adding them to debug adapter logger",
3250                    field: Box::new(SettingField {
3251                        pick: |settings_content| {
3252                            if let Some(debugger) = &settings_content.debugger {
3253                                &debugger.format_dap_log_messages
3254                            } else {
3255                                &None
3256                            }
3257                        },
3258                        pick_mut: |settings_content| {
3259                            &mut settings_content
3260                                .debugger
3261                                .get_or_insert_default()
3262                                .format_dap_log_messages
3263                        },
3264                    }),
3265                    metadata: None,
3266                    files: USER,
3267                }),
3268            ],
3269        },
3270        SettingsPage {
3271            title: "Terminal",
3272            items: vec![
3273                SettingsPageItem::SectionHeader("Environment"),
3274                SettingsPageItem::SettingItem(SettingItem {
3275                    title: "Shell",
3276                    description: "What shell to use when opening a terminal",
3277                    field: Box::new(
3278                        SettingField {
3279                            pick: |settings_content| {
3280                                if let Some(terminal) = &settings_content.terminal {
3281                                    &terminal.project.shell
3282                                } else {
3283                                    &None
3284                                }
3285                            },
3286                            pick_mut: |settings_content| {
3287                                &mut settings_content
3288                                    .terminal
3289                                    .get_or_insert_default()
3290                                    .project
3291                                    .shell
3292                            },
3293                        }
3294                        .unimplemented(),
3295                    ),
3296                    metadata: None,
3297                    files: USER | LOCAL,
3298                }),
3299                SettingsPageItem::SettingItem(SettingItem {
3300                    title: "Working Directory",
3301                    description: "What working directory to use when launching the terminal",
3302                    field: Box::new(
3303                        SettingField {
3304                            pick: |settings_content| {
3305                                if let Some(terminal) = &settings_content.terminal {
3306                                    &terminal.project.working_directory
3307                                } else {
3308                                    &None
3309                                }
3310                            },
3311                            pick_mut: |settings_content| {
3312                                &mut settings_content
3313                                    .terminal
3314                                    .get_or_insert_default()
3315                                    .project
3316                                    .working_directory
3317                            },
3318                        }
3319                        .unimplemented(),
3320                    ),
3321                    metadata: None,
3322                    files: USER | LOCAL,
3323                }),
3324                SettingsPageItem::SettingItem(SettingItem {
3325                    title: "Environment Variables",
3326                    description: "Key-value pairs to add to the terminal's environment",
3327                    field: Box::new(
3328                        SettingField {
3329                            pick: |settings_content| {
3330                                if let Some(terminal) = &settings_content.terminal {
3331                                    &terminal.project.env
3332                                } else {
3333                                    &None
3334                                }
3335                            },
3336                            pick_mut: |settings_content| {
3337                                &mut settings_content
3338                                    .terminal
3339                                    .get_or_insert_default()
3340                                    .project
3341                                    .env
3342                            },
3343                        }
3344                        .unimplemented(),
3345                    ),
3346                    metadata: None,
3347                    files: USER | LOCAL,
3348                }),
3349                SettingsPageItem::SettingItem(SettingItem {
3350                    title: "Detect Virtual Environment",
3351                    description: "Activates the python virtual environment, if one is found, in the terminal's working directory",
3352                    field: Box::new(
3353                        SettingField {
3354                            pick: |settings_content| {
3355                                if let Some(terminal) = &settings_content.terminal {
3356                                    &terminal.project.detect_venv
3357                                } else {
3358                                    &None
3359                                }
3360                            },
3361                            pick_mut: |settings_content| {
3362                                &mut settings_content
3363                                    .terminal
3364                                    .get_or_insert_default()
3365                                    .project
3366                                    .detect_venv
3367                            },
3368                        }
3369                        .unimplemented(),
3370                    ),
3371                    metadata: None,
3372                    files: USER | LOCAL,
3373                }),
3374                SettingsPageItem::SectionHeader("Font"),
3375                SettingsPageItem::SettingItem(SettingItem {
3376                    title: "Font Size",
3377                    description: "Font size for terminal text. If not set, defaults to buffer font size",
3378                    field: Box::new(SettingField {
3379                        pick: |settings_content| {
3380                            if let Some(terminal) = &settings_content.terminal
3381                                && terminal.font_size.is_some()
3382                            {
3383                                &terminal.font_size
3384                            } else if settings_content.theme.buffer_font_size.is_some() {
3385                                &settings_content.theme.buffer_font_size
3386                            } else {
3387                                &None
3388                            }
3389                        },
3390                        pick_mut: |settings_content| {
3391                            &mut settings_content.terminal.get_or_insert_default().font_size
3392                        },
3393                    }),
3394                    metadata: None,
3395                    files: USER,
3396                }),
3397                SettingsPageItem::SettingItem(SettingItem {
3398                    title: "Font Family",
3399                    description: "Font family for terminal text. If not set, defaults to buffer font family",
3400                    field: Box::new(SettingField {
3401                        pick: |settings_content| {
3402                            if let Some(terminal) = &settings_content.terminal
3403                                && terminal.font_family.is_some()
3404                            {
3405                                &terminal.font_family
3406                            } else if settings_content.theme.buffer_font_family.is_some() {
3407                                &settings_content.theme.buffer_font_family
3408                            } else {
3409                                &None
3410                            }
3411                        },
3412                        pick_mut: |settings_content| {
3413                            &mut settings_content
3414                                .terminal
3415                                .get_or_insert_default()
3416                                .font_family
3417                        },
3418                    }),
3419                    metadata: None,
3420                    files: USER,
3421                }),
3422                SettingsPageItem::SettingItem(SettingItem {
3423                    title: "Font Fallbacks",
3424                    description: "Font fallbacks for terminal text. If not set, defaults to buffer font fallbacks",
3425                    field: Box::new(
3426                        SettingField {
3427                            pick: |settings_content| {
3428                                if let Some(terminal) = &settings_content.terminal {
3429                                    &terminal.font_fallbacks
3430                                } else {
3431                                    &None
3432                                }
3433                            },
3434                            pick_mut: |settings_content| {
3435                                &mut settings_content
3436                                    .terminal
3437                                    .get_or_insert_default()
3438                                    .font_fallbacks
3439                            },
3440                        }
3441                        .unimplemented(),
3442                    ),
3443                    metadata: None,
3444                    files: USER,
3445                }),
3446                SettingsPageItem::SettingItem(SettingItem {
3447                    title: "Font Weight",
3448                    description: "Font weight for terminal text in CSS weight units (100-900)",
3449                    field: Box::new(SettingField {
3450                        pick: |settings_content| {
3451                            if let Some(terminal) = &settings_content.terminal {
3452                                &terminal.font_weight
3453                            } else {
3454                                &None
3455                            }
3456                        },
3457                        pick_mut: |settings_content| {
3458                            &mut settings_content
3459                                .terminal
3460                                .get_or_insert_default()
3461                                .font_weight
3462                        },
3463                    }),
3464                    metadata: None,
3465                    files: USER,
3466                }),
3467                SettingsPageItem::SettingItem(SettingItem {
3468                    title: "Font Features",
3469                    description: "Font features for terminal text",
3470                    field: Box::new(
3471                        SettingField {
3472                            pick: |settings_content| {
3473                                if let Some(terminal) = &settings_content.terminal {
3474                                    &terminal.font_features
3475                                } else {
3476                                    &None
3477                                }
3478                            },
3479                            pick_mut: |settings_content| {
3480                                &mut settings_content
3481                                    .terminal
3482                                    .get_or_insert_default()
3483                                    .font_features
3484                            },
3485                        }
3486                        .unimplemented(),
3487                    ),
3488                    metadata: None,
3489                    files: USER,
3490                }),
3491                SettingsPageItem::SectionHeader("Display Settings"),
3492                SettingsPageItem::SettingItem(SettingItem {
3493                    title: "Line Height",
3494                    description: "Line height for terminal text",
3495                    field: Box::new(
3496                        SettingField {
3497                            pick: |settings_content| {
3498                                if let Some(terminal) = &settings_content.terminal {
3499                                    &terminal.line_height
3500                                } else {
3501                                    &None
3502                                }
3503                            },
3504                            pick_mut: |settings_content| {
3505                                &mut settings_content
3506                                    .terminal
3507                                    .get_or_insert_default()
3508                                    .line_height
3509                            },
3510                        }
3511                        .unimplemented(),
3512                    ),
3513                    metadata: None,
3514                    files: USER,
3515                }),
3516                SettingsPageItem::SettingItem(SettingItem {
3517                    title: "Cursor Shape",
3518                    description: "Default cursor shape for the terminal (bar, block, underline, or hollow)",
3519                    field: Box::new(SettingField {
3520                        pick: |settings_content| {
3521                            if let Some(terminal) = &settings_content.terminal {
3522                                &terminal.cursor_shape
3523                            } else {
3524                                &None
3525                            }
3526                        },
3527                        pick_mut: |settings_content| {
3528                            &mut settings_content
3529                                .terminal
3530                                .get_or_insert_default()
3531                                .cursor_shape
3532                        },
3533                    }),
3534                    metadata: None,
3535                    files: USER,
3536                }),
3537                SettingsPageItem::SettingItem(SettingItem {
3538                    title: "Cursor Blinking",
3539                    description: "Sets the cursor blinking behavior in the terminal",
3540                    field: Box::new(SettingField {
3541                        pick: |settings_content| {
3542                            if let Some(terminal) = &settings_content.terminal {
3543                                &terminal.blinking
3544                            } else {
3545                                &None
3546                            }
3547                        },
3548                        pick_mut: |settings_content| {
3549                            &mut settings_content.terminal.get_or_insert_default().blinking
3550                        },
3551                    }),
3552                    metadata: None,
3553                    files: USER,
3554                }),
3555                SettingsPageItem::SettingItem(SettingItem {
3556                    title: "Alternate Scroll",
3557                    description: "Whether Alternate Scroll mode is active by default (converts mouse scroll to arrow keys in apps like vim)",
3558                    field: Box::new(SettingField {
3559                        pick: |settings_content| {
3560                            if let Some(terminal) = &settings_content.terminal {
3561                                &terminal.alternate_scroll
3562                            } else {
3563                                &None
3564                            }
3565                        },
3566                        pick_mut: |settings_content| {
3567                            &mut settings_content
3568                                .terminal
3569                                .get_or_insert_default()
3570                                .alternate_scroll
3571                        },
3572                    }),
3573                    metadata: None,
3574                    files: USER,
3575                }),
3576                SettingsPageItem::SettingItem(SettingItem {
3577                    title: "Minimum Contrast",
3578                    description: "The minimum APCA perceptual contrast between foreground and background colors (0-106)",
3579                    field: Box::new(SettingField {
3580                        pick: |settings_content| {
3581                            if let Some(terminal) = &settings_content.terminal {
3582                                &terminal.minimum_contrast
3583                            } else {
3584                                &None
3585                            }
3586                        },
3587                        pick_mut: |settings_content| {
3588                            &mut settings_content
3589                                .terminal
3590                                .get_or_insert_default()
3591                                .minimum_contrast
3592                        },
3593                    }),
3594                    metadata: None,
3595                    files: USER,
3596                }),
3597                SettingsPageItem::SectionHeader("Behavior Settings"),
3598                SettingsPageItem::SettingItem(SettingItem {
3599                    title: "Option As Meta",
3600                    description: "Whether the option key behaves as the meta key",
3601                    field: Box::new(SettingField {
3602                        pick: |settings_content| {
3603                            if let Some(terminal) = &settings_content.terminal {
3604                                &terminal.option_as_meta
3605                            } else {
3606                                &None
3607                            }
3608                        },
3609                        pick_mut: |settings_content| {
3610                            &mut settings_content
3611                                .terminal
3612                                .get_or_insert_default()
3613                                .option_as_meta
3614                        },
3615                    }),
3616                    metadata: None,
3617                    files: USER,
3618                }),
3619                SettingsPageItem::SettingItem(SettingItem {
3620                    title: "Copy On Select",
3621                    description: "Whether selecting text in the terminal automatically copies to the system clipboard",
3622                    field: Box::new(SettingField {
3623                        pick: |settings_content| {
3624                            if let Some(terminal) = &settings_content.terminal {
3625                                &terminal.copy_on_select
3626                            } else {
3627                                &None
3628                            }
3629                        },
3630                        pick_mut: |settings_content| {
3631                            &mut settings_content
3632                                .terminal
3633                                .get_or_insert_default()
3634                                .copy_on_select
3635                        },
3636                    }),
3637                    metadata: None,
3638                    files: USER,
3639                }),
3640                SettingsPageItem::SettingItem(SettingItem {
3641                    title: "Keep Selection On Copy",
3642                    description: "Whether to keep the text selection after copying it to the clipboard",
3643                    field: Box::new(SettingField {
3644                        pick: |settings_content| {
3645                            if let Some(terminal) = &settings_content.terminal {
3646                                &terminal.keep_selection_on_copy
3647                            } else {
3648                                &None
3649                            }
3650                        },
3651                        pick_mut: |settings_content| {
3652                            &mut settings_content
3653                                .terminal
3654                                .get_or_insert_default()
3655                                .keep_selection_on_copy
3656                        },
3657                    }),
3658                    metadata: None,
3659                    files: USER,
3660                }),
3661                SettingsPageItem::SectionHeader("Layout Settings"),
3662                SettingsPageItem::SettingItem(SettingItem {
3663                    title: "Default Width",
3664                    description: "Default width when the terminal is docked to the left or right (in pixels)",
3665                    field: Box::new(SettingField {
3666                        pick: |settings_content| {
3667                            if let Some(terminal) = &settings_content.terminal {
3668                                &terminal.default_width
3669                            } else {
3670                                &None
3671                            }
3672                        },
3673                        pick_mut: |settings_content| {
3674                            &mut settings_content
3675                                .terminal
3676                                .get_or_insert_default()
3677                                .default_width
3678                        },
3679                    }),
3680                    metadata: None,
3681                    files: USER,
3682                }),
3683                SettingsPageItem::SettingItem(SettingItem {
3684                    title: "Default Height",
3685                    description: "Default height when the terminal is docked to the bottom (in pixels)",
3686                    field: Box::new(SettingField {
3687                        pick: |settings_content| {
3688                            if let Some(terminal) = &settings_content.terminal {
3689                                &terminal.default_height
3690                            } else {
3691                                &None
3692                            }
3693                        },
3694                        pick_mut: |settings_content| {
3695                            &mut settings_content
3696                                .terminal
3697                                .get_or_insert_default()
3698                                .default_height
3699                        },
3700                    }),
3701                    metadata: None,
3702                    files: USER,
3703                }),
3704                SettingsPageItem::SectionHeader("Advanced Settings"),
3705                SettingsPageItem::SettingItem(SettingItem {
3706                    title: "Max Scroll History Lines",
3707                    description: "Maximum number of lines to keep in scrollback history (max: 100,000; 0 disables scrolling)",
3708                    field: Box::new(SettingField {
3709                        pick: |settings_content| {
3710                            if let Some(terminal) = &settings_content.terminal {
3711                                &terminal.max_scroll_history_lines
3712                            } else {
3713                                &None
3714                            }
3715                        },
3716                        pick_mut: |settings_content| {
3717                            &mut settings_content
3718                                .terminal
3719                                .get_or_insert_default()
3720                                .max_scroll_history_lines
3721                        },
3722                    }),
3723                    metadata: None,
3724                    files: USER,
3725                }),
3726                SettingsPageItem::SectionHeader("Toolbar"),
3727                SettingsPageItem::SettingItem(SettingItem {
3728                    title: "Breadcrumbs",
3729                    description: "Display the terminal title in breadcrumbs inside the terminal pane",
3730                    field: Box::new(SettingField {
3731                        pick: |settings_content| {
3732                            if let Some(terminal) = &settings_content.terminal {
3733                                if let Some(toolbar) = &terminal.toolbar {
3734                                    &toolbar.breadcrumbs
3735                                } else {
3736                                    &None
3737                                }
3738                            } else {
3739                                &None
3740                            }
3741                        },
3742                        pick_mut: |settings_content| {
3743                            &mut settings_content
3744                                .terminal
3745                                .get_or_insert_default()
3746                                .toolbar
3747                                .get_or_insert_default()
3748                                .breadcrumbs
3749                        },
3750                    }),
3751                    metadata: None,
3752                    files: USER,
3753                }),
3754                SettingsPageItem::SectionHeader("Scrollbar"),
3755                SettingsPageItem::SettingItem(SettingItem {
3756                    title: "Show Scrollbar",
3757                    description: "When to show the scrollbar in the terminal",
3758                    field: Box::new(SettingField {
3759                        pick: |settings_content| {
3760                            if let Some(terminal) = &settings_content.terminal
3761                                && let Some(scrollbar) = &terminal.scrollbar
3762                                && scrollbar.show.is_some()
3763                            {
3764                                &scrollbar.show
3765                            } else if let Some(scrollbar) = &settings_content.editor.scrollbar {
3766                                &scrollbar.show
3767                            } else {
3768                                &None
3769                            }
3770                        },
3771                        pick_mut: |settings_content| {
3772                            &mut settings_content
3773                                .terminal
3774                                .get_or_insert_default()
3775                                .scrollbar
3776                                .get_or_insert_default()
3777                                .show
3778                        },
3779                    }),
3780                    metadata: None,
3781                    files: USER,
3782                }),
3783            ],
3784        },
3785        SettingsPage {
3786            title: "Version Control",
3787            items: vec![
3788                SettingsPageItem::SectionHeader("Git"),
3789                SettingsPageItem::SettingItem(SettingItem {
3790                    title: "Git Gutter",
3791                    description: "Control whether git status is shown in the editor's gutter",
3792                    field: Box::new(SettingField {
3793                        pick: |settings_content| {
3794                            if let Some(git) = &settings_content.git {
3795                                &git.git_gutter
3796                            } else {
3797                                &None
3798                            }
3799                        },
3800                        pick_mut: |settings_content| {
3801                            &mut settings_content.git.get_or_insert_default().git_gutter
3802                        },
3803                    }),
3804                    metadata: None,
3805                    files: USER,
3806                }),
3807                // todo(settings_ui): Figure out the right default for this value in default.json
3808                SettingsPageItem::SettingItem(SettingItem {
3809                    title: "Gutter Debounce",
3810                    description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
3811                    field: Box::new(SettingField {
3812                        pick: |settings_content| {
3813                            if let Some(git) = &settings_content.git {
3814                                &git.gutter_debounce
3815                            } else {
3816                                &None
3817                            }
3818                        },
3819                        pick_mut: |settings_content| {
3820                            &mut settings_content.git.get_or_insert_default().gutter_debounce
3821                        },
3822                    }),
3823                    metadata: None,
3824                    files: USER,
3825                }),
3826                SettingsPageItem::SettingItem(SettingItem {
3827                    title: "Inline Git Blame",
3828                    description: "Whether or not to show git blame data inline in the currently focused line",
3829                    field: Box::new(SettingField {
3830                        pick: |settings_content| {
3831                            if let Some(git) = &settings_content.git {
3832                                if let Some(inline_blame) = &git.inline_blame {
3833                                    &inline_blame.enabled
3834                                } else {
3835                                    &None
3836                                }
3837                            } else {
3838                                &None
3839                            }
3840                        },
3841                        pick_mut: |settings_content| {
3842                            &mut settings_content
3843                                .git
3844                                .get_or_insert_default()
3845                                .inline_blame
3846                                .get_or_insert_default()
3847                                .enabled
3848                        },
3849                    }),
3850                    metadata: None,
3851                    files: USER,
3852                }),
3853                SettingsPageItem::SettingItem(SettingItem {
3854                    title: "Inline Git Blame Delay",
3855                    description: "The delay after which the inline blame information is shown",
3856                    field: Box::new(SettingField {
3857                        pick: |settings_content| {
3858                            if let Some(git) = &settings_content.git {
3859                                if let Some(inline_blame) = &git.inline_blame {
3860                                    &inline_blame.delay_ms
3861                                } else {
3862                                    &None
3863                                }
3864                            } else {
3865                                &None
3866                            }
3867                        },
3868                        pick_mut: |settings_content| {
3869                            &mut settings_content
3870                                .git
3871                                .get_or_insert_default()
3872                                .inline_blame
3873                                .get_or_insert_default()
3874                                .delay_ms
3875                        },
3876                    }),
3877                    metadata: None,
3878                    files: USER,
3879                }),
3880                SettingsPageItem::SettingItem(SettingItem {
3881                    title: "Inline Git Blame Padding",
3882                    description: "Padding between the end of the source line and the start of the inline blame in columns",
3883                    field: Box::new(SettingField {
3884                        pick: |settings_content| {
3885                            if let Some(git) = &settings_content.git {
3886                                if let Some(inline_blame) = &git.inline_blame {
3887                                    &inline_blame.padding
3888                                } else {
3889                                    &None
3890                                }
3891                            } else {
3892                                &None
3893                            }
3894                        },
3895                        pick_mut: |settings_content| {
3896                            &mut settings_content
3897                                .git
3898                                .get_or_insert_default()
3899                                .inline_blame
3900                                .get_or_insert_default()
3901                                .padding
3902                        },
3903                    }),
3904                    metadata: None,
3905                    files: USER,
3906                }),
3907                SettingsPageItem::SettingItem(SettingItem {
3908                    title: "Inline Git Blame Min Column",
3909                    description: "The minimum column number to show the inline blame information at",
3910                    field: Box::new(SettingField {
3911                        pick: |settings_content| {
3912                            if let Some(git) = &settings_content.git {
3913                                if let Some(inline_blame) = &git.inline_blame {
3914                                    &inline_blame.min_column
3915                                } else {
3916                                    &None
3917                                }
3918                            } else {
3919                                &None
3920                            }
3921                        },
3922                        pick_mut: |settings_content| {
3923                            &mut settings_content
3924                                .git
3925                                .get_or_insert_default()
3926                                .inline_blame
3927                                .get_or_insert_default()
3928                                .min_column
3929                        },
3930                    }),
3931                    metadata: None,
3932                    files: USER,
3933                }),
3934                SettingsPageItem::SettingItem(SettingItem {
3935                    title: "Show Commit Summary",
3936                    description: "Show commit summary as part of the inline blame",
3937                    field: Box::new(SettingField {
3938                        pick: |settings_content| {
3939                            if let Some(git) = &settings_content.git {
3940                                if let Some(inline_blame) = &git.inline_blame {
3941                                    &inline_blame.show_commit_summary
3942                                } else {
3943                                    &None
3944                                }
3945                            } else {
3946                                &None
3947                            }
3948                        },
3949                        pick_mut: |settings_content| {
3950                            &mut settings_content
3951                                .git
3952                                .get_or_insert_default()
3953                                .inline_blame
3954                                .get_or_insert_default()
3955                                .show_commit_summary
3956                        },
3957                    }),
3958                    metadata: None,
3959                    files: USER,
3960                }),
3961                SettingsPageItem::SettingItem(SettingItem {
3962                    title: "Show Avatar",
3963                    description: "Show the avatar of the author of the commit",
3964                    field: Box::new(SettingField {
3965                        pick: |settings_content| {
3966                            if let Some(git) = &settings_content.git {
3967                                if let Some(blame) = &git.blame {
3968                                    &blame.show_avatar
3969                                } else {
3970                                    &None
3971                                }
3972                            } else {
3973                                &None
3974                            }
3975                        },
3976                        pick_mut: |settings_content| {
3977                            &mut settings_content
3978                                .git
3979                                .get_or_insert_default()
3980                                .blame
3981                                .get_or_insert_default()
3982                                .show_avatar
3983                        },
3984                    }),
3985                    metadata: None,
3986                    files: USER,
3987                }),
3988                SettingsPageItem::SettingItem(SettingItem {
3989                    title: "Show Author Name In Branch Picker",
3990                    description: "Show author name as part of the commit information in branch picker",
3991                    field: Box::new(SettingField {
3992                        pick: |settings_content| {
3993                            if let Some(git) = &settings_content.git {
3994                                if let Some(branch_picker) = &git.branch_picker {
3995                                    &branch_picker.show_author_name
3996                                } else {
3997                                    &None
3998                                }
3999                            } else {
4000                                &None
4001                            }
4002                        },
4003                        pick_mut: |settings_content| {
4004                            &mut settings_content
4005                                .git
4006                                .get_or_insert_default()
4007                                .branch_picker
4008                                .get_or_insert_default()
4009                                .show_author_name
4010                        },
4011                    }),
4012                    metadata: None,
4013                    files: USER,
4014                }),
4015                SettingsPageItem::SettingItem(SettingItem {
4016                    title: "Hunk Style",
4017                    description: "How git hunks are displayed visually in the editor",
4018                    field: Box::new(SettingField {
4019                        pick: |settings_content| {
4020                            if let Some(git) = &settings_content.git {
4021                                &git.hunk_style
4022                            } else {
4023                                &None
4024                            }
4025                        },
4026                        pick_mut: |settings_content| {
4027                            &mut settings_content.git.get_or_insert_default().hunk_style
4028                        },
4029                    }),
4030                    metadata: None,
4031                    files: USER,
4032                }),
4033            ],
4034        },
4035        SettingsPage {
4036            title: "Diagnostics & Errors",
4037            items: vec![
4038                SettingsPageItem::SectionHeader("Filtering"),
4039                SettingsPageItem::SettingItem(SettingItem {
4040                    title: "Max Severity",
4041                    description: "Which level to use to filter out diagnostics displayed in the editor",
4042                    field: Box::new(SettingField {
4043                        pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
4044                        pick_mut: |settings_content| {
4045                            &mut settings_content.editor.diagnostics_max_severity
4046                        },
4047                    }),
4048                    metadata: None,
4049                    files: USER,
4050                }),
4051                SettingsPageItem::SettingItem(SettingItem {
4052                    title: "Include Warnings",
4053                    description: "Whether to show warnings or not by default",
4054                    field: Box::new(SettingField {
4055                        pick: |settings_content| {
4056                            if let Some(diagnostics) = &settings_content.diagnostics {
4057                                &diagnostics.include_warnings
4058                            } else {
4059                                &None
4060                            }
4061                        },
4062                        pick_mut: |settings_content| {
4063                            &mut settings_content
4064                                .diagnostics
4065                                .get_or_insert_default()
4066                                .include_warnings
4067                        },
4068                    }),
4069                    metadata: None,
4070                    files: USER,
4071                }),
4072                SettingsPageItem::SectionHeader("Inline"),
4073                SettingsPageItem::SettingItem(SettingItem {
4074                    title: "Inline Diagnostics Enabled",
4075                    description: "Whether to show diagnostics inline or not",
4076                    field: Box::new(SettingField {
4077                        pick: |settings_content| {
4078                            if let Some(diagnostics) = &settings_content.diagnostics {
4079                                if let Some(inline) = &diagnostics.inline {
4080                                    &inline.enabled
4081                                } else {
4082                                    &None
4083                                }
4084                            } else {
4085                                &None
4086                            }
4087                        },
4088                        pick_mut: |settings_content| {
4089                            &mut settings_content
4090                                .diagnostics
4091                                .get_or_insert_default()
4092                                .inline
4093                                .get_or_insert_default()
4094                                .enabled
4095                        },
4096                    }),
4097                    metadata: None,
4098                    files: USER,
4099                }),
4100                SettingsPageItem::SettingItem(SettingItem {
4101                    title: "Inline Update Debounce",
4102                    description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
4103                    field: Box::new(SettingField {
4104                        pick: |settings_content| {
4105                            if let Some(diagnostics) = &settings_content.diagnostics {
4106                                if let Some(inline) = &diagnostics.inline {
4107                                    &inline.update_debounce_ms
4108                                } else {
4109                                    &None
4110                                }
4111                            } else {
4112                                &None
4113                            }
4114                        },
4115                        pick_mut: |settings_content| {
4116                            &mut settings_content
4117                                .diagnostics
4118                                .get_or_insert_default()
4119                                .inline
4120                                .get_or_insert_default()
4121                                .update_debounce_ms
4122                        },
4123                    }),
4124                    metadata: None,
4125                    files: USER,
4126                }),
4127                SettingsPageItem::SettingItem(SettingItem {
4128                    title: "Inline Padding",
4129                    description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
4130                    field: Box::new(SettingField {
4131                        pick: |settings_content| {
4132                            if let Some(diagnostics) = &settings_content.diagnostics {
4133                                if let Some(inline) = &diagnostics.inline {
4134                                    &inline.padding
4135                                } else {
4136                                    &None
4137                                }
4138                            } else {
4139                                &None
4140                            }
4141                        },
4142                        pick_mut: |settings_content| {
4143                            &mut settings_content
4144                                .diagnostics
4145                                .get_or_insert_default()
4146                                .inline
4147                                .get_or_insert_default()
4148                                .padding
4149                        },
4150                    }),
4151                    metadata: None,
4152                    files: USER,
4153                }),
4154                SettingsPageItem::SettingItem(SettingItem {
4155                    title: "Inline Min Column",
4156                    description: "The minimum column to display inline diagnostics",
4157                    field: Box::new(SettingField {
4158                        pick: |settings_content| {
4159                            if let Some(diagnostics) = &settings_content.diagnostics {
4160                                if let Some(inline) = &diagnostics.inline {
4161                                    &inline.min_column
4162                                } else {
4163                                    &None
4164                                }
4165                            } else {
4166                                &None
4167                            }
4168                        },
4169                        pick_mut: |settings_content| {
4170                            &mut settings_content
4171                                .diagnostics
4172                                .get_or_insert_default()
4173                                .inline
4174                                .get_or_insert_default()
4175                                .min_column
4176                        },
4177                    }),
4178                    metadata: None,
4179                    files: USER,
4180                }),
4181                SettingsPageItem::SectionHeader("Performance"),
4182                SettingsPageItem::SettingItem(SettingItem {
4183                    title: "LSP Pull Diagnostics Enabled",
4184                    description: "Whether to pull for language server-powered diagnostics or not",
4185                    field: Box::new(SettingField {
4186                        pick: |settings_content| {
4187                            if let Some(diagnostics) = &settings_content.diagnostics {
4188                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
4189                                    &lsp_pull.enabled
4190                                } else {
4191                                    &None
4192                                }
4193                            } else {
4194                                &None
4195                            }
4196                        },
4197                        pick_mut: |settings_content| {
4198                            &mut settings_content
4199                                .diagnostics
4200                                .get_or_insert_default()
4201                                .lsp_pull_diagnostics
4202                                .get_or_insert_default()
4203                                .enabled
4204                        },
4205                    }),
4206                    metadata: None,
4207                    files: USER,
4208                }),
4209                // todo(settings_ui): Needs unit
4210                SettingsPageItem::SettingItem(SettingItem {
4211                    title: "LSP Pull Debounce",
4212                    description: "Minimum time to wait before pulling diagnostics from the language server(s)",
4213                    field: Box::new(SettingField {
4214                        pick: |settings_content| {
4215                            if let Some(diagnostics) = &settings_content.diagnostics {
4216                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
4217                                    &lsp_pull.debounce_ms
4218                                } else {
4219                                    &None
4220                                }
4221                            } else {
4222                                &None
4223                            }
4224                        },
4225                        pick_mut: |settings_content| {
4226                            &mut settings_content
4227                                .diagnostics
4228                                .get_or_insert_default()
4229                                .lsp_pull_diagnostics
4230                                .get_or_insert_default()
4231                                .debounce_ms
4232                        },
4233                    }),
4234                    metadata: None,
4235                    files: USER,
4236                }),
4237            ],
4238        },
4239        SettingsPage {
4240            title: "Collaboration",
4241            items: vec![
4242                SettingsPageItem::SectionHeader("Calls"),
4243                SettingsPageItem::SettingItem(SettingItem {
4244                    title: "Mute On Join",
4245                    description: "Whether the microphone should be muted when joining a channel or a call",
4246                    field: Box::new(SettingField {
4247                        pick: |settings_content| {
4248                            if let Some(calls) = &settings_content.calls {
4249                                &calls.mute_on_join
4250                            } else {
4251                                &None
4252                            }
4253                        },
4254                        pick_mut: |settings_content| {
4255                            &mut settings_content.calls.get_or_insert_default().mute_on_join
4256                        },
4257                    }),
4258                    metadata: None,
4259                    files: USER,
4260                }),
4261                SettingsPageItem::SettingItem(SettingItem {
4262                    title: "Share On Join",
4263                    description: "Whether your current project should be shared when joining an empty channel",
4264                    field: Box::new(SettingField {
4265                        pick: |settings_content| {
4266                            if let Some(calls) = &settings_content.calls {
4267                                &calls.share_on_join
4268                            } else {
4269                                &None
4270                            }
4271                        },
4272                        pick_mut: |settings_content| {
4273                            &mut settings_content.calls.get_or_insert_default().share_on_join
4274                        },
4275                    }),
4276                    metadata: None,
4277                    files: USER,
4278                }),
4279                SettingsPageItem::SectionHeader("Experimental"),
4280                SettingsPageItem::SettingItem(SettingItem {
4281                    title: "Rodio Audio",
4282                    description: "Opt into the new audio system",
4283                    field: Box::new(SettingField {
4284                        pick: |settings_content| {
4285                            if let Some(audio) = &settings_content.audio {
4286                                &audio.rodio_audio
4287                            } else {
4288                                &None
4289                            }
4290                        },
4291                        pick_mut: |settings_content| {
4292                            &mut settings_content.audio.get_or_insert_default().rodio_audio
4293                        },
4294                    }),
4295                    metadata: None,
4296                    files: USER,
4297                }),
4298                SettingsPageItem::SettingItem(SettingItem {
4299                    title: "Auto Microphone Volume",
4300                    description: "Automatically adjust microphone volume (requires Rodio Audio)",
4301                    field: Box::new(SettingField {
4302                        pick: |settings_content| {
4303                            if let Some(audio) = &settings_content.audio {
4304                                &audio.auto_microphone_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_microphone_volume
4314                        },
4315                    }),
4316                    metadata: None,
4317                    files: USER,
4318                }),
4319                SettingsPageItem::SettingItem(SettingItem {
4320                    title: "Auto Speaker Volume",
4321                    description: "Automatically adjust volume of other call members (requires Rodio Audio)",
4322                    field: Box::new(SettingField {
4323                        pick: |settings_content| {
4324                            if let Some(audio) = &settings_content.audio {
4325                                &audio.auto_speaker_volume
4326                            } else {
4327                                &None
4328                            }
4329                        },
4330                        pick_mut: |settings_content| {
4331                            &mut settings_content
4332                                .audio
4333                                .get_or_insert_default()
4334                                .auto_speaker_volume
4335                        },
4336                    }),
4337                    metadata: None,
4338                    files: USER,
4339                }),
4340                SettingsPageItem::SettingItem(SettingItem {
4341                    title: "Denoise",
4342                    description: "Remove background noises (requires Rodio Audio)",
4343                    field: Box::new(SettingField {
4344                        pick: |settings_content| {
4345                            if let Some(audio) = &settings_content.audio {
4346                                &audio.denoise
4347                            } else {
4348                                &None
4349                            }
4350                        },
4351                        pick_mut: |settings_content| {
4352                            &mut settings_content.audio.get_or_insert_default().denoise
4353                        },
4354                    }),
4355                    metadata: None,
4356                    files: USER,
4357                }),
4358                SettingsPageItem::SettingItem(SettingItem {
4359                    title: "Legacy Audio Compatible",
4360                    description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
4361                    field: Box::new(SettingField {
4362                        pick: |settings_content| {
4363                            if let Some(audio) = &settings_content.audio {
4364                                &audio.legacy_audio_compatible
4365                            } else {
4366                                &None
4367                            }
4368                        },
4369                        pick_mut: |settings_content| {
4370                            &mut settings_content
4371                                .audio
4372                                .get_or_insert_default()
4373                                .legacy_audio_compatible
4374                        },
4375                    }),
4376                    metadata: None,
4377                    files: USER,
4378                }),
4379            ],
4380        },
4381        SettingsPage {
4382            title: "AI",
4383            items: vec![
4384                SettingsPageItem::SectionHeader("General"),
4385                SettingsPageItem::SettingItem(SettingItem {
4386                    title: "Disable AI",
4387                    description: "Whether to disable all AI features in Zed",
4388                    field: Box::new(SettingField {
4389                        pick: |settings_content| &settings_content.disable_ai,
4390                        pick_mut: |settings_content| &mut settings_content.disable_ai,
4391                    }),
4392                    metadata: None,
4393                    files: USER,
4394                }),
4395                SettingsPageItem::SectionHeader("Agent Configuration"),
4396                SettingsPageItem::SettingItem(SettingItem {
4397                    title: "Always Allow Tool Actions",
4398                    description: "When enabled, the agent can run potentially destructive actions without asking for your confirmation. This setting has no effect on external agents.",
4399                    field: Box::new(SettingField {
4400                        pick: |settings_content| {
4401                            if let Some(agent) = &settings_content.agent {
4402                                &agent.always_allow_tool_actions
4403                            } else {
4404                                &None
4405                            }
4406                        },
4407                        pick_mut: |settings_content| {
4408                            &mut settings_content
4409                                .agent
4410                                .get_or_insert_default()
4411                                .always_allow_tool_actions
4412                        },
4413                    }),
4414                    metadata: None,
4415                    files: USER,
4416                }),
4417                SettingsPageItem::SettingItem(SettingItem {
4418                    title: "Single File Review",
4419                    description: "When enabled, agent edits will also be displayed in single-file buffers for review",
4420                    field: Box::new(SettingField {
4421                        pick: |settings_content| {
4422                            if let Some(agent) = &settings_content.agent {
4423                                &agent.single_file_review
4424                            } else {
4425                                &None
4426                            }
4427                        },
4428                        pick_mut: |settings_content| {
4429                            &mut settings_content
4430                                .agent
4431                                .get_or_insert_default()
4432                                .single_file_review
4433                        },
4434                    }),
4435                    metadata: None,
4436                    files: USER,
4437                }),
4438                SettingsPageItem::SettingItem(SettingItem {
4439                    title: "Enable Feedback",
4440                    description: "Show voting thumbs up/down icon buttons for feedback on agent edits",
4441                    field: Box::new(SettingField {
4442                        pick: |settings_content| {
4443                            if let Some(agent) = &settings_content.agent {
4444                                &agent.enable_feedback
4445                            } else {
4446                                &None
4447                            }
4448                        },
4449                        pick_mut: |settings_content| {
4450                            &mut settings_content
4451                                .agent
4452                                .get_or_insert_default()
4453                                .enable_feedback
4454                        },
4455                    }),
4456                    metadata: None,
4457                    files: USER,
4458                }),
4459                SettingsPageItem::SettingItem(SettingItem {
4460                    title: "Notify When Agent Waiting",
4461                    description: "Where to show notifications when the agent has completed its response or needs confirmation before running a tool action",
4462                    field: Box::new(SettingField {
4463                        pick: |settings_content| {
4464                            if let Some(agent) = &settings_content.agent {
4465                                &agent.notify_when_agent_waiting
4466                            } else {
4467                                &None
4468                            }
4469                        },
4470                        pick_mut: |settings_content| {
4471                            &mut settings_content
4472                                .agent
4473                                .get_or_insert_default()
4474                                .notify_when_agent_waiting
4475                        },
4476                    }),
4477                    metadata: None,
4478                    files: USER,
4479                }),
4480                SettingsPageItem::SettingItem(SettingItem {
4481                    title: "Play Sound When Agent Done",
4482                    description: "Whether to play a sound when the agent has either completed its response, or needs user input",
4483                    field: Box::new(SettingField {
4484                        pick: |settings_content| {
4485                            if let Some(agent) = &settings_content.agent {
4486                                &agent.play_sound_when_agent_done
4487                            } else {
4488                                &None
4489                            }
4490                        },
4491                        pick_mut: |settings_content| {
4492                            &mut settings_content
4493                                .agent
4494                                .get_or_insert_default()
4495                                .play_sound_when_agent_done
4496                        },
4497                    }),
4498                    metadata: None,
4499                    files: USER,
4500                }),
4501                SettingsPageItem::SettingItem(SettingItem {
4502                    title: "Expand Edit Card",
4503                    description: "Whether to have edit cards in the agent panel expanded, showing a preview of the diff",
4504                    field: Box::new(SettingField {
4505                        pick: |settings_content| {
4506                            if let Some(agent) = &settings_content.agent {
4507                                &agent.expand_edit_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_edit_card
4517                        },
4518                    }),
4519                    metadata: None,
4520                    files: USER,
4521                }),
4522                SettingsPageItem::SettingItem(SettingItem {
4523                    title: "Expand Terminal Card",
4524                    description: "Whether to have terminal cards in the agent panel expanded, showing the whole command output",
4525                    field: Box::new(SettingField {
4526                        pick: |settings_content| {
4527                            if let Some(agent) = &settings_content.agent {
4528                                &agent.expand_terminal_card
4529                            } else {
4530                                &None
4531                            }
4532                        },
4533                        pick_mut: |settings_content| {
4534                            &mut settings_content
4535                                .agent
4536                                .get_or_insert_default()
4537                                .expand_terminal_card
4538                        },
4539                    }),
4540                    metadata: None,
4541                    files: USER,
4542                }),
4543                SettingsPageItem::SettingItem(SettingItem {
4544                    title: "Use Modifier To Send",
4545                    description: "Whether to always use cmd-enter (or ctrl-enter on Linux or Windows) to send messages",
4546                    field: Box::new(SettingField {
4547                        pick: |settings_content| {
4548                            if let Some(agent) = &settings_content.agent {
4549                                &agent.use_modifier_to_send
4550                            } else {
4551                                &None
4552                            }
4553                        },
4554                        pick_mut: |settings_content| {
4555                            &mut settings_content
4556                                .agent
4557                                .get_or_insert_default()
4558                                .use_modifier_to_send
4559                        },
4560                    }),
4561                    metadata: None,
4562                    files: USER,
4563                }),
4564                SettingsPageItem::SettingItem(SettingItem {
4565                    title: "Message Editor Min Lines",
4566                    description: "Minimum number of lines to display in the agent message editor",
4567                    field: Box::new(SettingField {
4568                        pick: |settings_content| {
4569                            if let Some(agent) = &settings_content.agent {
4570                                &agent.message_editor_min_lines
4571                            } else {
4572                                &None
4573                            }
4574                        },
4575                        pick_mut: |settings_content| {
4576                            &mut settings_content
4577                                .agent
4578                                .get_or_insert_default()
4579                                .message_editor_min_lines
4580                        },
4581                    }),
4582                    metadata: None,
4583                    files: USER,
4584                }),
4585            ],
4586        },
4587        SettingsPage {
4588            title: "System & Network",
4589            items: vec![
4590                SettingsPageItem::SectionHeader("Network"),
4591                // todo(settings_ui): Proxy needs a default
4592                SettingsPageItem::SettingItem(SettingItem {
4593                    title: "Proxy",
4594                    description: "The proxy to use for network requests",
4595                    field: Box::new(
4596                        SettingField {
4597                            pick: |settings_content| &settings_content.proxy,
4598                            pick_mut: |settings_content| &mut settings_content.proxy,
4599                        }
4600                        .unimplemented(),
4601                    ),
4602                    metadata: Some(Box::new(SettingsFieldMetadata {
4603                        placeholder: Some("socks5h://localhost:10808"),
4604                    })),
4605                    files: USER,
4606                }),
4607                SettingsPageItem::SettingItem(SettingItem {
4608                    title: "Server URL",
4609                    description: "The URL of the Zed server to connect to",
4610                    field: Box::new(SettingField {
4611                        pick: |settings_content| &settings_content.server_url,
4612                        pick_mut: |settings_content| &mut settings_content.server_url,
4613                    }),
4614                    metadata: Some(Box::new(SettingsFieldMetadata {
4615                        placeholder: Some("https://zed.dev"),
4616                    })),
4617                    files: USER,
4618                }),
4619                SettingsPageItem::SectionHeader("System"),
4620                SettingsPageItem::SettingItem(SettingItem {
4621                    title: "Auto Update",
4622                    description: "Whether or not to automatically check for updates",
4623                    field: Box::new(SettingField {
4624                        pick: |settings_content| &settings_content.auto_update,
4625                        pick_mut: |settings_content| &mut settings_content.auto_update,
4626                    }),
4627                    metadata: None,
4628                    files: USER,
4629                }),
4630            ],
4631        },
4632    ]
4633}
4634
4635const LANGUAGES_SECTION_HEADER: &'static str = "Languages";
4636
4637fn current_language() -> Option<SharedString> {
4638    sub_page_stack().iter().find_map(|page| {
4639        (page.section_header == LANGUAGES_SECTION_HEADER).then(|| page.link.title.clone())
4640    })
4641}
4642
4643fn language_settings_field<T>(
4644    settings_content: &SettingsContent,
4645    get: fn(&LanguageSettingsContent) -> &Option<T>,
4646) -> &Option<T> {
4647    let all_languages = &settings_content.project.all_languages;
4648    if let Some(current_language_name) = current_language() {
4649        if let Some(current_language) = all_languages.languages.0.get(&current_language_name) {
4650            let value = get(current_language);
4651            if value.is_some() {
4652                return value;
4653            }
4654        }
4655    }
4656    let default_value = get(&all_languages.defaults);
4657    return default_value;
4658}
4659
4660fn language_settings_field_mut<T>(
4661    settings_content: &mut SettingsContent,
4662    get: fn(&mut LanguageSettingsContent) -> &mut Option<T>,
4663) -> &mut Option<T> {
4664    let all_languages = &mut settings_content.project.all_languages;
4665    let language_content = if let Some(current_language) = current_language() {
4666        all_languages
4667            .languages
4668            .0
4669            .entry(current_language)
4670            .or_default()
4671    } else {
4672        &mut all_languages.defaults
4673    };
4674    return get(language_content);
4675}
4676
4677fn language_settings_data() -> Vec<SettingsPageItem> {
4678    vec![
4679        SettingsPageItem::SectionHeader("Indentation"),
4680        SettingsPageItem::SettingItem(SettingItem {
4681            title: "Tab Size",
4682            description: "How many columns a tab should occupy",
4683            field: Box::new(SettingField {
4684                pick: |settings_content| {
4685                    language_settings_field(settings_content, |language| &language.tab_size)
4686                },
4687                pick_mut: |settings_content| {
4688                    language_settings_field_mut(settings_content, |language| &mut language.tab_size)
4689                },
4690            }),
4691            metadata: None,
4692            files: USER | LOCAL,
4693        }),
4694        SettingsPageItem::SettingItem(SettingItem {
4695            title: "Hard Tabs",
4696            description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
4697            field: Box::new(SettingField {
4698                pick: |settings_content| {
4699                    language_settings_field(settings_content, |language| &language.hard_tabs)
4700                },
4701                pick_mut: |settings_content| {
4702                    language_settings_field_mut(settings_content, |language| {
4703                        &mut language.hard_tabs
4704                    })
4705                },
4706            }),
4707            metadata: None,
4708            files: USER | LOCAL,
4709        }),
4710        SettingsPageItem::SettingItem(SettingItem {
4711            title: "Auto Indent",
4712            description: "Whether indentation should be adjusted based on the context whilst typing",
4713            field: Box::new(SettingField {
4714                pick: |settings_content| {
4715                    language_settings_field(settings_content, |language| &language.auto_indent)
4716                },
4717                pick_mut: |settings_content| {
4718                    language_settings_field_mut(settings_content, |language| {
4719                        &mut language.auto_indent
4720                    })
4721                },
4722            }),
4723            metadata: None,
4724            files: USER | LOCAL,
4725        }),
4726        SettingsPageItem::SettingItem(SettingItem {
4727            title: "Auto Indent On Paste",
4728            description: "Whether indentation of pasted content should be adjusted based on the context",
4729            field: Box::new(SettingField {
4730                pick: |settings_content| {
4731                    language_settings_field(settings_content, |language| {
4732                        &language.auto_indent_on_paste
4733                    })
4734                },
4735                pick_mut: |settings_content| {
4736                    language_settings_field_mut(settings_content, |language| {
4737                        &mut language.auto_indent_on_paste
4738                    })
4739                },
4740            }),
4741            metadata: None,
4742            files: USER | LOCAL,
4743        }),
4744        SettingsPageItem::SectionHeader("Wrapping"),
4745        SettingsPageItem::SettingItem(SettingItem {
4746            title: "Soft Wrap",
4747            description: "How to soft-wrap long lines of text",
4748            field: Box::new(SettingField {
4749                pick: |settings_content| {
4750                    language_settings_field(settings_content, |language| &language.soft_wrap)
4751                },
4752                pick_mut: |settings_content| {
4753                    language_settings_field_mut(settings_content, |language| {
4754                        &mut language.soft_wrap
4755                    })
4756                },
4757            }),
4758            metadata: None,
4759            files: USER | LOCAL,
4760        }),
4761        SettingsPageItem::SettingItem(SettingItem {
4762            title: "Show Wrap Guides",
4763            description: "Show wrap guides in the editor",
4764            field: Box::new(SettingField {
4765                pick: |settings_content| {
4766                    language_settings_field(settings_content, |language| &language.show_wrap_guides)
4767                },
4768                pick_mut: |settings_content| {
4769                    language_settings_field_mut(settings_content, |language| {
4770                        &mut language.show_wrap_guides
4771                    })
4772                },
4773            }),
4774            metadata: None,
4775            files: USER | LOCAL,
4776        }),
4777        SettingsPageItem::SettingItem(SettingItem {
4778            title: "Preferred Line Length",
4779            description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
4780            field: Box::new(SettingField {
4781                pick: |settings_content| {
4782                    language_settings_field(settings_content, |language| {
4783                        &language.preferred_line_length
4784                    })
4785                },
4786                pick_mut: |settings_content| {
4787                    language_settings_field_mut(settings_content, |language| {
4788                        &mut language.preferred_line_length
4789                    })
4790                },
4791            }),
4792            metadata: None,
4793            files: USER | LOCAL,
4794        }),
4795        SettingsPageItem::SettingItem(SettingItem {
4796            title: "Wrap Guides",
4797            description: "Character counts at which to show wrap guides in the editor",
4798            field: Box::new(
4799                SettingField {
4800                    pick: |settings_content| {
4801                        language_settings_field(settings_content, |language| &language.wrap_guides)
4802                    },
4803                    pick_mut: |settings_content| {
4804                        language_settings_field_mut(settings_content, |language| {
4805                            &mut language.wrap_guides
4806                        })
4807                    },
4808                }
4809                .unimplemented(),
4810            ),
4811            metadata: None,
4812            files: USER | LOCAL,
4813        }),
4814        SettingsPageItem::SettingItem(SettingItem {
4815            title: "Allow Rewrap",
4816            description: "Controls where the `editor::Rewrap` action is allowed for this language",
4817            field: Box::new(SettingField {
4818                pick: |settings_content| {
4819                    language_settings_field(settings_content, |language| &language.allow_rewrap)
4820                },
4821                pick_mut: |settings_content| {
4822                    language_settings_field_mut(settings_content, |language| {
4823                        &mut language.allow_rewrap
4824                    })
4825                },
4826            }),
4827            metadata: None,
4828            files: USER | LOCAL,
4829        }),
4830        SettingsPageItem::SectionHeader("Indent Guides"),
4831        SettingsPageItem::SettingItem(SettingItem {
4832            title: "Enabled",
4833            description: "Display indent guides in the editor",
4834            field: Box::new(SettingField {
4835                pick: |settings_content| {
4836                    language_settings_field(settings_content, |language| {
4837                        if let Some(indent_guides) = &language.indent_guides {
4838                            &indent_guides.enabled
4839                        } else {
4840                            &None
4841                        }
4842                    })
4843                },
4844                pick_mut: |settings_content| {
4845                    language_settings_field_mut(settings_content, |language| {
4846                        &mut language.indent_guides.get_or_insert_default().enabled
4847                    })
4848                },
4849            }),
4850            metadata: None,
4851            files: USER | LOCAL,
4852        }),
4853        SettingsPageItem::SettingItem(SettingItem {
4854            title: "Line Width",
4855            description: "The width of the indent guides in pixels, between 1 and 10",
4856            field: Box::new(SettingField {
4857                pick: |settings_content| {
4858                    language_settings_field(settings_content, |language| {
4859                        if let Some(indent_guides) = &language.indent_guides {
4860                            &indent_guides.line_width
4861                        } else {
4862                            &None
4863                        }
4864                    })
4865                },
4866                pick_mut: |settings_content| {
4867                    language_settings_field_mut(settings_content, |language| {
4868                        &mut language.indent_guides.get_or_insert_default().line_width
4869                    })
4870                },
4871            }),
4872            metadata: None,
4873            files: USER | LOCAL,
4874        }),
4875        SettingsPageItem::SettingItem(SettingItem {
4876            title: "Active Line Width",
4877            description: "The width of the active indent guide in pixels, between 1 and 10",
4878            field: Box::new(SettingField {
4879                pick: |settings_content| {
4880                    language_settings_field(settings_content, |language| {
4881                        if let Some(indent_guides) = &language.indent_guides {
4882                            &indent_guides.active_line_width
4883                        } else {
4884                            &None
4885                        }
4886                    })
4887                },
4888                pick_mut: |settings_content| {
4889                    language_settings_field_mut(settings_content, |language| {
4890                        &mut language
4891                            .indent_guides
4892                            .get_or_insert_default()
4893                            .active_line_width
4894                    })
4895                },
4896            }),
4897            metadata: None,
4898            files: USER | LOCAL,
4899        }),
4900        SettingsPageItem::SettingItem(SettingItem {
4901            title: "Coloring",
4902            description: "Determines how indent guides are colored",
4903            field: Box::new(SettingField {
4904                pick: |settings_content| {
4905                    language_settings_field(settings_content, |language| {
4906                        if let Some(indent_guides) = &language.indent_guides {
4907                            &indent_guides.coloring
4908                        } else {
4909                            &None
4910                        }
4911                    })
4912                },
4913                pick_mut: |settings_content| {
4914                    language_settings_field_mut(settings_content, |language| {
4915                        &mut language.indent_guides.get_or_insert_default().coloring
4916                    })
4917                },
4918            }),
4919            metadata: None,
4920            files: USER | LOCAL,
4921        }),
4922        SettingsPageItem::SettingItem(SettingItem {
4923            title: "Background Coloring",
4924            description: "Determines how indent guide backgrounds are colored",
4925            field: Box::new(SettingField {
4926                pick: |settings_content| {
4927                    language_settings_field(settings_content, |language| {
4928                        if let Some(indent_guides) = &language.indent_guides {
4929                            &indent_guides.background_coloring
4930                        } else {
4931                            &None
4932                        }
4933                    })
4934                },
4935                pick_mut: |settings_content| {
4936                    language_settings_field_mut(settings_content, |language| {
4937                        &mut language
4938                            .indent_guides
4939                            .get_or_insert_default()
4940                            .background_coloring
4941                    })
4942                },
4943            }),
4944            metadata: None,
4945            files: USER | LOCAL,
4946        }),
4947        SettingsPageItem::SectionHeader("Formatting"),
4948        SettingsPageItem::SettingItem(SettingItem {
4949            title: "Format On Save",
4950            description: "Whether or not to perform a buffer format before saving",
4951            field: Box::new(
4952                // TODO(settings_ui): this setting should just be a bool
4953                SettingField {
4954                    pick: |settings_content| {
4955                        language_settings_field(settings_content, |language| {
4956                            &language.format_on_save
4957                        })
4958                    },
4959                    pick_mut: |settings_content| {
4960                        language_settings_field_mut(settings_content, |language| {
4961                            &mut language.format_on_save
4962                        })
4963                    },
4964                },
4965            ),
4966            metadata: None,
4967            files: USER | LOCAL,
4968        }),
4969        SettingsPageItem::SettingItem(SettingItem {
4970            title: "Remove Trailing Whitespace On Save",
4971            description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
4972            field: Box::new(SettingField {
4973                pick: |settings_content| {
4974                    language_settings_field(settings_content, |language| {
4975                        &language.remove_trailing_whitespace_on_save
4976                    })
4977                },
4978                pick_mut: |settings_content| {
4979                    language_settings_field_mut(settings_content, |language| {
4980                        &mut language.remove_trailing_whitespace_on_save
4981                    })
4982                },
4983            }),
4984            metadata: None,
4985            files: USER | LOCAL,
4986        }),
4987        SettingsPageItem::SettingItem(SettingItem {
4988            title: "Ensure Final Newline On Save",
4989            description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
4990            field: Box::new(SettingField {
4991                pick: |settings_content| {
4992                    language_settings_field(settings_content, |language| {
4993                        &language.ensure_final_newline_on_save
4994                    })
4995                },
4996                pick_mut: |settings_content| {
4997                    language_settings_field_mut(settings_content, |language| {
4998                        &mut language.ensure_final_newline_on_save
4999                    })
5000                },
5001            }),
5002            metadata: None,
5003            files: USER | LOCAL,
5004        }),
5005        SettingsPageItem::SettingItem(SettingItem {
5006            title: "Formatter",
5007            description: "How to perform a buffer format",
5008            field: Box::new(
5009                SettingField {
5010                    pick: |settings_content| {
5011                        language_settings_field(settings_content, |language| &language.formatter)
5012                    },
5013                    pick_mut: |settings_content| {
5014                        language_settings_field_mut(settings_content, |language| {
5015                            &mut language.formatter
5016                        })
5017                    },
5018                }
5019                .unimplemented(),
5020            ),
5021            metadata: None,
5022            files: USER | LOCAL,
5023        }),
5024        SettingsPageItem::SettingItem(SettingItem {
5025            title: "Use On Type Format",
5026            description: "Whether to use additional LSP queries to format (and amend) the code after every \"trigger\" symbol input, defined by LSP server capabilities",
5027            field: Box::new(SettingField {
5028                pick: |settings_content| {
5029                    language_settings_field(settings_content, |language| {
5030                        &language.use_on_type_format
5031                    })
5032                },
5033                pick_mut: |settings_content| {
5034                    language_settings_field_mut(settings_content, |language| {
5035                        &mut language.use_on_type_format
5036                    })
5037                },
5038            }),
5039            metadata: None,
5040            files: USER | LOCAL,
5041        }),
5042        SettingsPageItem::SectionHeader("Autoclose"),
5043        SettingsPageItem::SettingItem(SettingItem {
5044            title: "Use Autoclose",
5045            description: "Whether to automatically type closing characters for you. For example, when you type (, Zed will automatically add a closing ) at the correct position",
5046            field: Box::new(SettingField {
5047                pick: |settings_content| {
5048                    language_settings_field(settings_content, |language| &language.use_autoclose)
5049                },
5050                pick_mut: |settings_content| {
5051                    language_settings_field_mut(settings_content, |language| {
5052                        &mut language.use_autoclose
5053                    })
5054                },
5055            }),
5056            metadata: None,
5057            files: USER | LOCAL,
5058        }),
5059        SettingsPageItem::SettingItem(SettingItem {
5060            title: "Use Auto Surround",
5061            description: "Whether to automatically surround text with characters for you. For example, when you select text and type (, Zed will automatically surround text with ()",
5062            field: Box::new(SettingField {
5063                pick: |settings_content| {
5064                    language_settings_field(settings_content, |language| {
5065                        &language.use_auto_surround
5066                    })
5067                },
5068                pick_mut: |settings_content| {
5069                    language_settings_field_mut(settings_content, |language| {
5070                        &mut language.use_auto_surround
5071                    })
5072                },
5073            }),
5074            metadata: None,
5075            files: USER | LOCAL,
5076        }),
5077        SettingsPageItem::SettingItem(SettingItem {
5078            title: "Always Treat Brackets As Autoclosed",
5079            description: "Controls whether the closing characters are always skipped over and auto-removed no matter how they were inserted",
5080            field: Box::new(SettingField {
5081                pick: |settings_content| {
5082                    language_settings_field(settings_content, |language| {
5083                        &language.always_treat_brackets_as_autoclosed
5084                    })
5085                },
5086                pick_mut: |settings_content| {
5087                    language_settings_field_mut(settings_content, |language| {
5088                        &mut language.always_treat_brackets_as_autoclosed
5089                    })
5090                },
5091            }),
5092            metadata: None,
5093            files: USER | LOCAL,
5094        }),
5095        SettingsPageItem::SettingItem(SettingItem {
5096            title: "Jsx Tag Auto Close",
5097            description: "Whether to automatically close JSX tags",
5098            field: Box::new(SettingField {
5099                // TODO(settings_ui): this setting should just be a bool
5100                pick: |settings_content| {
5101                    language_settings_field(settings_content, |language| {
5102                        match language.jsx_tag_auto_close.as_ref() {
5103                            Some(s) => &s.enabled,
5104                            None => &None,
5105                        }
5106                    })
5107                },
5108                pick_mut: |settings_content| {
5109                    language_settings_field_mut(settings_content, |language| {
5110                        &mut language.jsx_tag_auto_close.get_or_insert_default().enabled
5111                    })
5112                },
5113            }),
5114            metadata: None,
5115            files: USER | LOCAL,
5116        }),
5117        SettingsPageItem::SectionHeader("Edit Predictions"),
5118        SettingsPageItem::SettingItem(SettingItem {
5119            title: "Show Edit Predictions",
5120            description: "Controls whether edit predictions are shown immediately (true) or manually by triggering `editor::ShowEditPrediction` (false)",
5121            field: Box::new(SettingField {
5122                pick: |settings_content| {
5123                    language_settings_field(settings_content, |language| {
5124                        &language.show_edit_predictions
5125                    })
5126                },
5127                pick_mut: |settings_content| {
5128                    language_settings_field_mut(settings_content, |language| {
5129                        &mut language.show_edit_predictions
5130                    })
5131                },
5132            }),
5133            metadata: None,
5134            files: USER | LOCAL,
5135        }),
5136        SettingsPageItem::SettingItem(SettingItem {
5137            title: "Edit Predictions Disabled In",
5138            description: "Controls whether edit predictions are shown in the given language scopes",
5139            field: Box::new(
5140                SettingField {
5141                    pick: |settings_content| {
5142                        language_settings_field(settings_content, |language| {
5143                            &language.edit_predictions_disabled_in
5144                        })
5145                    },
5146                    pick_mut: |settings_content| {
5147                        language_settings_field_mut(settings_content, |language| {
5148                            &mut language.edit_predictions_disabled_in
5149                        })
5150                    },
5151                }
5152                .unimplemented(),
5153            ),
5154            metadata: None,
5155            files: USER | LOCAL,
5156        }),
5157        SettingsPageItem::SectionHeader("Whitespace"),
5158        SettingsPageItem::SettingItem(SettingItem {
5159            title: "Show Whitespaces",
5160            description: "Whether to show tabs and spaces in the editor",
5161            field: Box::new(SettingField {
5162                pick: |settings_content| {
5163                    language_settings_field(settings_content, |language| &language.show_whitespaces)
5164                },
5165                pick_mut: |settings_content| {
5166                    language_settings_field_mut(settings_content, |language| {
5167                        &mut language.show_whitespaces
5168                    })
5169                },
5170            }),
5171            metadata: None,
5172            files: USER | LOCAL,
5173        }),
5174        SettingsPageItem::SettingItem(SettingItem {
5175            title: "Space Whitespace Indicator",
5176            description: "Visible character used to render space characters when show_whitespaces is enabled (default: \"\")",
5177            field: Box::new(
5178                SettingField {
5179                    pick: |settings_content| {
5180                        language_settings_field(settings_content, |language| {
5181                            if let Some(whitespace_map) = &language.whitespace_map {
5182                                &whitespace_map.space
5183                            } else {
5184                                &None
5185                            }
5186                        })
5187                    },
5188                    pick_mut: |settings_content| {
5189                        language_settings_field_mut(settings_content, |language| {
5190                            &mut language.whitespace_map.get_or_insert_default().space
5191                        })
5192                    },
5193                }
5194                .unimplemented(),
5195            ),
5196            metadata: None,
5197            files: USER | LOCAL,
5198        }),
5199        SettingsPageItem::SettingItem(SettingItem {
5200            title: "Tab Whitespace Indicator",
5201            description: "Visible character used to render tab characters when show_whitespaces is enabled (default: \"\")",
5202            field: Box::new(
5203                SettingField {
5204                    pick: |settings_content| {
5205                        language_settings_field(settings_content, |language| {
5206                            if let Some(whitespace_map) = &language.whitespace_map {
5207                                &whitespace_map.tab
5208                            } else {
5209                                &None
5210                            }
5211                        })
5212                    },
5213                    pick_mut: |settings_content| {
5214                        language_settings_field_mut(settings_content, |language| {
5215                            &mut language.whitespace_map.get_or_insert_default().tab
5216                        })
5217                    },
5218                }
5219                .unimplemented(),
5220            ),
5221            metadata: None,
5222            files: USER | LOCAL,
5223        }),
5224        SettingsPageItem::SectionHeader("Completions"),
5225        SettingsPageItem::SettingItem(SettingItem {
5226            title: "Show Completions On Input",
5227            description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
5228            field: Box::new(SettingField {
5229                pick: |settings_content| {
5230                    language_settings_field(settings_content, |language| {
5231                        &language.show_completions_on_input
5232                    })
5233                },
5234                pick_mut: |settings_content| {
5235                    language_settings_field_mut(settings_content, |language| {
5236                        &mut language.show_completions_on_input
5237                    })
5238                },
5239            }),
5240            metadata: None,
5241            files: USER | LOCAL,
5242        }),
5243        SettingsPageItem::SettingItem(SettingItem {
5244            title: "Show Completion Documentation",
5245            description: "Whether to display inline and alongside documentation for items in the completions menu",
5246            field: Box::new(SettingField {
5247                pick: |settings_content| {
5248                    language_settings_field(settings_content, |language| {
5249                        &language.show_completion_documentation
5250                    })
5251                },
5252                pick_mut: |settings_content| {
5253                    language_settings_field_mut(settings_content, |language| {
5254                        &mut language.show_completion_documentation
5255                    })
5256                },
5257            }),
5258            metadata: None,
5259            files: USER | LOCAL,
5260        }),
5261        SettingsPageItem::SettingItem(SettingItem {
5262            title: "Words",
5263            description: "Controls how words are completed",
5264            field: Box::new(SettingField {
5265                pick: |settings_content| {
5266                    language_settings_field(settings_content, |language| {
5267                        if let Some(completions) = &language.completions {
5268                            &completions.words
5269                        } else {
5270                            &None
5271                        }
5272                    })
5273                },
5274                pick_mut: |settings_content| {
5275                    language_settings_field_mut(settings_content, |language| {
5276                        &mut language.completions.get_or_insert_default().words
5277                    })
5278                },
5279            }),
5280            metadata: None,
5281            files: USER | LOCAL,
5282        }),
5283        SettingsPageItem::SettingItem(SettingItem {
5284            title: "Words Min Length",
5285            description: "How many characters has to be in the completions query to automatically show the words-based completions",
5286            field: Box::new(SettingField {
5287                pick: |settings_content| {
5288                    language_settings_field(settings_content, |language| {
5289                        if let Some(completions) = &language.completions {
5290                            &completions.words_min_length
5291                        } else {
5292                            &None
5293                        }
5294                    })
5295                },
5296                pick_mut: |settings_content| {
5297                    language_settings_field_mut(settings_content, |language| {
5298                        &mut language
5299                            .completions
5300                            .get_or_insert_default()
5301                            .words_min_length
5302                    })
5303                },
5304            }),
5305            metadata: None,
5306            files: USER | LOCAL,
5307        }),
5308        SettingsPageItem::SectionHeader("Inlay Hints"),
5309        SettingsPageItem::SettingItem(SettingItem {
5310            title: "Enabled",
5311            description: "Global switch to toggle hints on and off",
5312            field: Box::new(SettingField {
5313                pick: |settings_content| {
5314                    language_settings_field(settings_content, |language| {
5315                        if let Some(inlay_hints) = &language.inlay_hints {
5316                            &inlay_hints.enabled
5317                        } else {
5318                            &None
5319                        }
5320                    })
5321                },
5322                pick_mut: |settings_content| {
5323                    language_settings_field_mut(settings_content, |language| {
5324                        &mut language.inlay_hints.get_or_insert_default().enabled
5325                    })
5326                },
5327            }),
5328            metadata: None,
5329            files: USER | LOCAL,
5330        }),
5331        SettingsPageItem::SettingItem(SettingItem {
5332            title: "Show Value Hints",
5333            description: "Global switch to toggle inline values on and off when debugging",
5334            field: Box::new(SettingField {
5335                pick: |settings_content| {
5336                    language_settings_field(settings_content, |language| {
5337                        if let Some(inlay_hints) = &language.inlay_hints {
5338                            &inlay_hints.show_value_hints
5339                        } else {
5340                            &None
5341                        }
5342                    })
5343                },
5344                pick_mut: |settings_content| {
5345                    language_settings_field_mut(settings_content, |language| {
5346                        &mut language
5347                            .inlay_hints
5348                            .get_or_insert_default()
5349                            .show_value_hints
5350                    })
5351                },
5352            }),
5353            metadata: None,
5354            files: USER | LOCAL,
5355        }),
5356        SettingsPageItem::SettingItem(SettingItem {
5357            title: "Show Type Hints",
5358            description: "Whether type hints should be shown",
5359            field: Box::new(SettingField {
5360                pick: |settings_content| {
5361                    language_settings_field(settings_content, |language| {
5362                        if let Some(inlay_hints) = &language.inlay_hints {
5363                            &inlay_hints.show_type_hints
5364                        } else {
5365                            &None
5366                        }
5367                    })
5368                },
5369                pick_mut: |settings_content| {
5370                    language_settings_field_mut(settings_content, |language| {
5371                        &mut language.inlay_hints.get_or_insert_default().show_type_hints
5372                    })
5373                },
5374            }),
5375            metadata: None,
5376            files: USER | LOCAL,
5377        }),
5378        SettingsPageItem::SettingItem(SettingItem {
5379            title: "Show Parameter Hints",
5380            description: "Whether parameter hints should be shown",
5381            field: Box::new(SettingField {
5382                pick: |settings_content| {
5383                    language_settings_field(settings_content, |language| {
5384                        if let Some(inlay_hints) = &language.inlay_hints {
5385                            &inlay_hints.show_parameter_hints
5386                        } else {
5387                            &None
5388                        }
5389                    })
5390                },
5391                pick_mut: |settings_content| {
5392                    language_settings_field_mut(settings_content, |language| {
5393                        &mut language
5394                            .inlay_hints
5395                            .get_or_insert_default()
5396                            .show_parameter_hints
5397                    })
5398                },
5399            }),
5400            metadata: None,
5401            files: USER | LOCAL,
5402        }),
5403        SettingsPageItem::SettingItem(SettingItem {
5404            title: "Show Other Hints",
5405            description: "Whether other hints should be shown",
5406            field: Box::new(SettingField {
5407                pick: |settings_content| {
5408                    language_settings_field(settings_content, |language| {
5409                        if let Some(inlay_hints) = &language.inlay_hints {
5410                            &inlay_hints.show_other_hints
5411                        } else {
5412                            &None
5413                        }
5414                    })
5415                },
5416                pick_mut: |settings_content| {
5417                    language_settings_field_mut(settings_content, |language| {
5418                        &mut language
5419                            .inlay_hints
5420                            .get_or_insert_default()
5421                            .show_other_hints
5422                    })
5423                },
5424            }),
5425            metadata: None,
5426            files: USER | LOCAL,
5427        }),
5428        SettingsPageItem::SettingItem(SettingItem {
5429            title: "Show Background",
5430            description: "Show a background for inlay hints",
5431            field: Box::new(SettingField {
5432                pick: |settings_content| {
5433                    language_settings_field(settings_content, |language| {
5434                        if let Some(inlay_hints) = &language.inlay_hints {
5435                            &inlay_hints.show_background
5436                        } else {
5437                            &None
5438                        }
5439                    })
5440                },
5441                pick_mut: |settings_content| {
5442                    language_settings_field_mut(settings_content, |language| {
5443                        &mut language.inlay_hints.get_or_insert_default().show_background
5444                    })
5445                },
5446            }),
5447            metadata: None,
5448            files: USER | LOCAL,
5449        }),
5450        SettingsPageItem::SettingItem(SettingItem {
5451            title: "Edit Debounce Ms",
5452            description: "Whether or not to debounce inlay hints updates after buffer edits (set to 0 to disable debouncing)",
5453            field: Box::new(SettingField {
5454                pick: |settings_content| {
5455                    language_settings_field(settings_content, |language| {
5456                        if let Some(inlay_hints) = &language.inlay_hints {
5457                            &inlay_hints.edit_debounce_ms
5458                        } else {
5459                            &None
5460                        }
5461                    })
5462                },
5463                pick_mut: |settings_content| {
5464                    language_settings_field_mut(settings_content, |language| {
5465                        &mut language
5466                            .inlay_hints
5467                            .get_or_insert_default()
5468                            .edit_debounce_ms
5469                    })
5470                },
5471            }),
5472            metadata: None,
5473            files: USER | LOCAL,
5474        }),
5475        SettingsPageItem::SettingItem(SettingItem {
5476            title: "Scroll Debounce Ms",
5477            description: "Whether or not to debounce inlay hints updates after buffer scrolls (set to 0 to disable debouncing)",
5478            field: Box::new(SettingField {
5479                pick: |settings_content| {
5480                    language_settings_field(settings_content, |language| {
5481                        if let Some(inlay_hints) = &language.inlay_hints {
5482                            &inlay_hints.scroll_debounce_ms
5483                        } else {
5484                            &None
5485                        }
5486                    })
5487                },
5488                pick_mut: |settings_content| {
5489                    language_settings_field_mut(settings_content, |language| {
5490                        &mut language
5491                            .inlay_hints
5492                            .get_or_insert_default()
5493                            .scroll_debounce_ms
5494                    })
5495                },
5496            }),
5497            metadata: None,
5498            files: USER | LOCAL,
5499        }),
5500        SettingsPageItem::SettingItem(SettingItem {
5501            title: "Toggle On Modifiers Press",
5502            description: "Toggles inlay hints (hides or shows) when the user presses the modifiers specified",
5503            field: Box::new(
5504                SettingField {
5505                    pick: |settings_content| {
5506                        language_settings_field(settings_content, |language| {
5507                            if let Some(inlay_hints) = &language.inlay_hints {
5508                                &inlay_hints.toggle_on_modifiers_press
5509                            } else {
5510                                &None
5511                            }
5512                        })
5513                    },
5514                    pick_mut: |settings_content| {
5515                        language_settings_field_mut(settings_content, |language| {
5516                            &mut language
5517                                .inlay_hints
5518                                .get_or_insert_default()
5519                                .toggle_on_modifiers_press
5520                        })
5521                    },
5522                }
5523                .unimplemented(),
5524            ),
5525            metadata: None,
5526            files: USER | LOCAL,
5527        }),
5528        SettingsPageItem::SectionHeader("Tasks"),
5529        SettingsPageItem::SettingItem(SettingItem {
5530            title: "Enabled",
5531            description: "Whether tasks are enabled for this language",
5532            field: Box::new(SettingField {
5533                pick: |settings_content| {
5534                    language_settings_field(settings_content, |language| {
5535                        if let Some(tasks) = &language.tasks {
5536                            &tasks.enabled
5537                        } else {
5538                            &None
5539                        }
5540                    })
5541                },
5542                pick_mut: |settings_content| {
5543                    language_settings_field_mut(settings_content, |language| {
5544                        &mut language.tasks.get_or_insert_default().enabled
5545                    })
5546                },
5547            }),
5548            metadata: None,
5549            files: USER | LOCAL,
5550        }),
5551        SettingsPageItem::SettingItem(SettingItem {
5552            title: "Variables",
5553            description: "Extra task variables to set for a particular language",
5554            field: Box::new(
5555                SettingField {
5556                    pick: |settings_content| {
5557                        language_settings_field(settings_content, |language| {
5558                            if let Some(tasks) = &language.tasks {
5559                                &tasks.variables
5560                            } else {
5561                                &None
5562                            }
5563                        })
5564                    },
5565                    pick_mut: |settings_content| {
5566                        language_settings_field_mut(settings_content, |language| {
5567                            &mut language.tasks.get_or_insert_default().variables
5568                        })
5569                    },
5570                }
5571                .unimplemented(),
5572            ),
5573            metadata: None,
5574            files: USER | LOCAL,
5575        }),
5576        SettingsPageItem::SettingItem(SettingItem {
5577            title: "Prefer LSP",
5578            description: "Use LSP tasks over Zed language extension tasks",
5579            field: Box::new(SettingField {
5580                pick: |settings_content| {
5581                    language_settings_field(settings_content, |language| {
5582                        if let Some(tasks) = &language.tasks {
5583                            &tasks.prefer_lsp
5584                        } else {
5585                            &None
5586                        }
5587                    })
5588                },
5589                pick_mut: |settings_content| {
5590                    language_settings_field_mut(settings_content, |language| {
5591                        &mut language.tasks.get_or_insert_default().prefer_lsp
5592                    })
5593                },
5594            }),
5595            metadata: None,
5596            files: USER | LOCAL,
5597        }),
5598        SettingsPageItem::SectionHeader("Miscellaneous"),
5599        SettingsPageItem::SettingItem(SettingItem {
5600            title: "Debuggers",
5601            description: "Preferred debuggers for this language",
5602            field: Box::new(
5603                SettingField {
5604                    pick: |settings_content| {
5605                        language_settings_field(settings_content, |language| &language.debuggers)
5606                    },
5607                    pick_mut: |settings_content| {
5608                        language_settings_field_mut(settings_content, |language| {
5609                            &mut language.debuggers
5610                        })
5611                    },
5612                }
5613                .unimplemented(),
5614            ),
5615            metadata: None,
5616            files: USER | LOCAL,
5617        }),
5618        SettingsPageItem::SettingItem(SettingItem {
5619            title: "Middle Click Paste",
5620            description: "Enable middle-click paste on Linux",
5621            field: Box::new(SettingField {
5622                pick: |settings_content| &settings_content.editor.middle_click_paste,
5623                pick_mut: |settings_content| &mut settings_content.editor.middle_click_paste,
5624            }),
5625            metadata: None,
5626            files: USER,
5627        }),
5628        SettingsPageItem::SettingItem(SettingItem {
5629            title: "Extend Comment On Newline",
5630            description: "Whether to start a new line with a comment when a previous line is a comment as well",
5631            field: Box::new(SettingField {
5632                pick: |settings_content| {
5633                    language_settings_field(settings_content, |language| {
5634                        &language.extend_comment_on_newline
5635                    })
5636                },
5637                pick_mut: |settings_content| {
5638                    language_settings_field_mut(settings_content, |language| {
5639                        &mut language.extend_comment_on_newline
5640                    })
5641                },
5642            }),
5643            metadata: None,
5644            files: USER | LOCAL,
5645        }),
5646    ]
5647}
5648
5649/// LanguageSettings items that should be included in the "Languages & Tools" page
5650/// not the "Editor" page
5651fn non_editor_language_settings_data() -> Vec<SettingsPageItem> {
5652    vec![
5653        SettingsPageItem::SectionHeader("LSP"),
5654        SettingsPageItem::SettingItem(SettingItem {
5655            title: "Enable Language Server",
5656            description: "Whether to use language servers to provide code intelligence",
5657            field: Box::new(SettingField {
5658                pick: |settings_content| {
5659                    language_settings_field(settings_content, |language| {
5660                        &language.enable_language_server
5661                    })
5662                },
5663                pick_mut: |settings_content| {
5664                    language_settings_field_mut(settings_content, |language| {
5665                        &mut language.enable_language_server
5666                    })
5667                },
5668            }),
5669            metadata: None,
5670            files: USER | LOCAL,
5671        }),
5672        SettingsPageItem::SettingItem(SettingItem {
5673            title: "Language Servers",
5674            description: "The list of language servers to use (or disable) for this language",
5675            field: Box::new(
5676                SettingField {
5677                    pick: |settings_content| {
5678                        language_settings_field(settings_content, |language| {
5679                            &language.language_servers
5680                        })
5681                    },
5682                    pick_mut: |settings_content| {
5683                        language_settings_field_mut(settings_content, |language| {
5684                            &mut language.language_servers
5685                        })
5686                    },
5687                }
5688                .unimplemented(),
5689            ),
5690            metadata: None,
5691            files: USER | LOCAL,
5692        }),
5693        SettingsPageItem::SettingItem(SettingItem {
5694            title: "Linked Edits",
5695            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",
5696            field: Box::new(SettingField {
5697                pick: |settings_content| {
5698                    language_settings_field(settings_content, |language| &language.linked_edits)
5699                },
5700                pick_mut: |settings_content| {
5701                    language_settings_field_mut(settings_content, |language| {
5702                        &mut language.linked_edits
5703                    })
5704                },
5705            }),
5706            metadata: None,
5707            files: USER | LOCAL,
5708        }),
5709        SettingsPageItem::SettingItem(SettingItem {
5710            title: "Go To Definition Fallback",
5711            description: "Whether to follow-up empty go to definition responses from the language server",
5712            field: Box::new(SettingField {
5713                pick: |settings_content| &settings_content.editor.go_to_definition_fallback,
5714                pick_mut: |settings_content| &mut settings_content.editor.go_to_definition_fallback,
5715            }),
5716            metadata: None,
5717            files: USER,
5718        }),
5719        SettingsPageItem::SectionHeader("LSP Completions"),
5720        SettingsPageItem::SettingItem(SettingItem {
5721            title: "Enabled",
5722            description: "Whether to fetch LSP completions or not",
5723            field: Box::new(SettingField {
5724                pick: |settings_content| {
5725                    language_settings_field(settings_content, |language| {
5726                        if let Some(completions) = &language.completions {
5727                            &completions.lsp
5728                        } else {
5729                            &None
5730                        }
5731                    })
5732                },
5733                pick_mut: |settings_content| {
5734                    language_settings_field_mut(settings_content, |language| {
5735                        &mut language.completions.get_or_insert_default().lsp
5736                    })
5737                },
5738            }),
5739            metadata: None,
5740            files: USER | LOCAL,
5741        }),
5742        SettingsPageItem::SettingItem(SettingItem {
5743            title: "Fetch Timeout (milliseconds)",
5744            description: "When fetching LSP completions, determines how long to wait for a response of a particular server (set to 0 to wait indefinitely)",
5745            field: Box::new(SettingField {
5746                pick: |settings_content| {
5747                    language_settings_field(settings_content, |language| {
5748                        if let Some(completions) = &language.completions {
5749                            &completions.lsp_fetch_timeout_ms
5750                        } else {
5751                            &None
5752                        }
5753                    })
5754                },
5755                pick_mut: |settings_content| {
5756                    language_settings_field_mut(settings_content, |language| {
5757                        &mut language
5758                            .completions
5759                            .get_or_insert_default()
5760                            .lsp_fetch_timeout_ms
5761                    })
5762                },
5763            }),
5764            metadata: None,
5765            files: USER | LOCAL,
5766        }),
5767        SettingsPageItem::SettingItem(SettingItem {
5768            title: "Insert Mode",
5769            description: "Controls how LSP completions are inserted",
5770            field: Box::new(SettingField {
5771                pick: |settings_content| {
5772                    language_settings_field(settings_content, |language| {
5773                        if let Some(completions) = &language.completions {
5774                            &completions.lsp_insert_mode
5775                        } else {
5776                            &None
5777                        }
5778                    })
5779                },
5780                pick_mut: |settings_content| {
5781                    language_settings_field_mut(settings_content, |language| {
5782                        &mut language.completions.get_or_insert_default().lsp_insert_mode
5783                    })
5784                },
5785            }),
5786            metadata: None,
5787            files: USER | LOCAL,
5788        }),
5789        SettingsPageItem::SectionHeader("Debuggers"),
5790        SettingsPageItem::SettingItem(SettingItem {
5791            title: "Debuggers",
5792            description: "Preferred debuggers for this language",
5793            field: Box::new(
5794                SettingField {
5795                    pick: |settings_content| {
5796                        language_settings_field(settings_content, |language| &language.debuggers)
5797                    },
5798                    pick_mut: |settings_content| {
5799                        language_settings_field_mut(settings_content, |language| {
5800                            &mut language.debuggers
5801                        })
5802                    },
5803                }
5804                .unimplemented(),
5805            ),
5806            metadata: None,
5807            files: USER | LOCAL,
5808        }),
5809        SettingsPageItem::SectionHeader("Prettier"),
5810        SettingsPageItem::SettingItem(SettingItem {
5811            title: "Allowed",
5812            description: "Enables or disables formatting with Prettier for a given language",
5813            field: Box::new(SettingField {
5814                pick: |settings_content| {
5815                    language_settings_field(settings_content, |language| {
5816                        if let Some(prettier) = &language.prettier {
5817                            &prettier.allowed
5818                        } else {
5819                            &None
5820                        }
5821                    })
5822                },
5823                pick_mut: |settings_content| {
5824                    language_settings_field_mut(settings_content, |language| {
5825                        &mut language.prettier.get_or_insert_default().allowed
5826                    })
5827                },
5828            }),
5829            metadata: None,
5830            files: USER | LOCAL,
5831        }),
5832        SettingsPageItem::SettingItem(SettingItem {
5833            title: "Parser",
5834            description: "Forces Prettier integration to use a specific parser name when formatting files with the language",
5835            field: Box::new(SettingField {
5836                pick: |settings_content| {
5837                    language_settings_field(settings_content, |language| {
5838                        if let Some(prettier) = &language.prettier {
5839                            &prettier.parser
5840                        } else {
5841                            &None
5842                        }
5843                    })
5844                },
5845                pick_mut: |settings_content| {
5846                    language_settings_field_mut(settings_content, |language| {
5847                        &mut language.prettier.get_or_insert_default().parser
5848                    })
5849                },
5850            }),
5851            metadata: None,
5852            files: USER | LOCAL,
5853        }),
5854        SettingsPageItem::SettingItem(SettingItem {
5855            title: "Plugins",
5856            description: "Forces Prettier integration to use specific plugins when formatting files with the language",
5857            field: Box::new(
5858                SettingField {
5859                    pick: |settings_content| {
5860                        language_settings_field(settings_content, |language| {
5861                            if let Some(prettier) = &language.prettier {
5862                                &prettier.plugins
5863                            } else {
5864                                &None
5865                            }
5866                        })
5867                    },
5868                    pick_mut: |settings_content| {
5869                        language_settings_field_mut(settings_content, |language| {
5870                            &mut language.prettier.get_or_insert_default().plugins
5871                        })
5872                    },
5873                }
5874                .unimplemented(),
5875            ),
5876            metadata: None,
5877            files: USER | LOCAL,
5878        }),
5879        SettingsPageItem::SettingItem(SettingItem {
5880            title: "Options",
5881            description: "Default Prettier options, in the format as in package.json section for Prettier",
5882            field: Box::new(
5883                SettingField {
5884                    pick: |settings_content| {
5885                        language_settings_field(settings_content, |language| {
5886                            if let Some(prettier) = &language.prettier {
5887                                &prettier.options
5888                            } else {
5889                                &None
5890                            }
5891                        })
5892                    },
5893                    pick_mut: |settings_content| {
5894                        language_settings_field_mut(settings_content, |language| {
5895                            &mut language.prettier.get_or_insert_default().options
5896                        })
5897                    },
5898                }
5899                .unimplemented(),
5900            ),
5901            metadata: None,
5902            files: USER | LOCAL,
5903        }),
5904    ]
5905}