page_data.rs

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