page_data.rs

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