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