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
3347                            } else if settings_content.theme.buffer_font_size.is_some() {
3348                                &settings_content.theme.buffer_font_size
3349                            } else {
3350                                &None
3351                            }
3352                        },
3353                        pick_mut: |settings_content| {
3354                            &mut settings_content.terminal.get_or_insert_default().font_size
3355                        },
3356                    }),
3357                    metadata: None,
3358                    files: USER,
3359                }),
3360                SettingsPageItem::SettingItem(SettingItem {
3361                    title: "Font Family",
3362                    description: "Font family for terminal text. If not set, defaults to buffer font family",
3363                    field: Box::new(SettingField {
3364                        pick: |settings_content| {
3365                            if let Some(terminal) = &settings_content.terminal
3366                                && terminal.font_family.is_some()
3367                            {
3368                                &terminal.font_family
3369                            } else if settings_content.theme.buffer_font_family.is_some() {
3370                                &settings_content.theme.buffer_font_family
3371                            } else {
3372                                &None
3373                            }
3374                        },
3375                        pick_mut: |settings_content| {
3376                            &mut settings_content
3377                                .terminal
3378                                .get_or_insert_default()
3379                                .font_family
3380                        },
3381                    }),
3382                    metadata: None,
3383                    files: USER,
3384                }),
3385                SettingsPageItem::SettingItem(SettingItem {
3386                    title: "Font Fallbacks",
3387                    description: "Font fallbacks for terminal text. If not set, defaults to buffer font fallbacks",
3388                    field: Box::new(
3389                        SettingField {
3390                            pick: |settings_content| {
3391                                if let Some(terminal) = &settings_content.terminal {
3392                                    &terminal.font_fallbacks
3393                                } else {
3394                                    &None
3395                                }
3396                            },
3397                            pick_mut: |settings_content| {
3398                                &mut settings_content
3399                                    .terminal
3400                                    .get_or_insert_default()
3401                                    .font_fallbacks
3402                            },
3403                        }
3404                        .unimplemented(),
3405                    ),
3406                    metadata: None,
3407                    files: USER,
3408                }),
3409                SettingsPageItem::SettingItem(SettingItem {
3410                    title: "Font Weight",
3411                    description: "Font weight for terminal text in CSS weight units (100-900)",
3412                    field: Box::new(SettingField {
3413                        pick: |settings_content| {
3414                            if let Some(terminal) = &settings_content.terminal {
3415                                &terminal.font_weight
3416                            } else {
3417                                &None
3418                            }
3419                        },
3420                        pick_mut: |settings_content| {
3421                            &mut settings_content
3422                                .terminal
3423                                .get_or_insert_default()
3424                                .font_weight
3425                        },
3426                    }),
3427                    metadata: None,
3428                    files: USER,
3429                }),
3430                SettingsPageItem::SettingItem(SettingItem {
3431                    title: "Font Features",
3432                    description: "Font features for terminal text",
3433                    field: Box::new(
3434                        SettingField {
3435                            pick: |settings_content| {
3436                                if let Some(terminal) = &settings_content.terminal {
3437                                    &terminal.font_features
3438                                } else {
3439                                    &None
3440                                }
3441                            },
3442                            pick_mut: |settings_content| {
3443                                &mut settings_content
3444                                    .terminal
3445                                    .get_or_insert_default()
3446                                    .font_features
3447                            },
3448                        }
3449                        .unimplemented(),
3450                    ),
3451                    metadata: None,
3452                    files: USER,
3453                }),
3454                SettingsPageItem::SectionHeader("Display Settings"),
3455                SettingsPageItem::SettingItem(SettingItem {
3456                    title: "Line Height",
3457                    description: "Line height for terminal text",
3458                    field: Box::new(
3459                        SettingField {
3460                            pick: |settings_content| {
3461                                if let Some(terminal) = &settings_content.terminal {
3462                                    &terminal.line_height
3463                                } else {
3464                                    &None
3465                                }
3466                            },
3467                            pick_mut: |settings_content| {
3468                                &mut settings_content
3469                                    .terminal
3470                                    .get_or_insert_default()
3471                                    .line_height
3472                            },
3473                        }
3474                        .unimplemented(),
3475                    ),
3476                    metadata: None,
3477                    files: USER,
3478                }),
3479                SettingsPageItem::SettingItem(SettingItem {
3480                    title: "Cursor Shape",
3481                    description: "Default cursor shape for the terminal (bar, block, underline, or hollow)",
3482                    field: Box::new(SettingField {
3483                        pick: |settings_content| {
3484                            if let Some(terminal) = &settings_content.terminal {
3485                                &terminal.cursor_shape
3486                            } else {
3487                                &None
3488                            }
3489                        },
3490                        pick_mut: |settings_content| {
3491                            &mut settings_content
3492                                .terminal
3493                                .get_or_insert_default()
3494                                .cursor_shape
3495                        },
3496                    }),
3497                    metadata: None,
3498                    files: USER,
3499                }),
3500                SettingsPageItem::SettingItem(SettingItem {
3501                    title: "Cursor Blinking",
3502                    description: "Sets the cursor blinking behavior in the terminal",
3503                    field: Box::new(SettingField {
3504                        pick: |settings_content| {
3505                            if let Some(terminal) = &settings_content.terminal {
3506                                &terminal.blinking
3507                            } else {
3508                                &None
3509                            }
3510                        },
3511                        pick_mut: |settings_content| {
3512                            &mut settings_content.terminal.get_or_insert_default().blinking
3513                        },
3514                    }),
3515                    metadata: None,
3516                    files: USER,
3517                }),
3518                SettingsPageItem::SettingItem(SettingItem {
3519                    title: "Alternate Scroll",
3520                    description: "Whether Alternate Scroll mode is active by default (converts mouse scroll to arrow keys in apps like vim)",
3521                    field: Box::new(SettingField {
3522                        pick: |settings_content| {
3523                            if let Some(terminal) = &settings_content.terminal {
3524                                &terminal.alternate_scroll
3525                            } else {
3526                                &None
3527                            }
3528                        },
3529                        pick_mut: |settings_content| {
3530                            &mut settings_content
3531                                .terminal
3532                                .get_or_insert_default()
3533                                .alternate_scroll
3534                        },
3535                    }),
3536                    metadata: None,
3537                    files: USER,
3538                }),
3539                SettingsPageItem::SettingItem(SettingItem {
3540                    title: "Minimum Contrast",
3541                    description: "The minimum APCA perceptual contrast between foreground and background colors (0-106)",
3542                    field: Box::new(SettingField {
3543                        pick: |settings_content| {
3544                            if let Some(terminal) = &settings_content.terminal {
3545                                &terminal.minimum_contrast
3546                            } else {
3547                                &None
3548                            }
3549                        },
3550                        pick_mut: |settings_content| {
3551                            &mut settings_content
3552                                .terminal
3553                                .get_or_insert_default()
3554                                .minimum_contrast
3555                        },
3556                    }),
3557                    metadata: None,
3558                    files: USER,
3559                }),
3560                SettingsPageItem::SectionHeader("Behavior Settings"),
3561                SettingsPageItem::SettingItem(SettingItem {
3562                    title: "Option As Meta",
3563                    description: "Whether the option key behaves as the meta key",
3564                    field: Box::new(SettingField {
3565                        pick: |settings_content| {
3566                            if let Some(terminal) = &settings_content.terminal {
3567                                &terminal.option_as_meta
3568                            } else {
3569                                &None
3570                            }
3571                        },
3572                        pick_mut: |settings_content| {
3573                            &mut settings_content
3574                                .terminal
3575                                .get_or_insert_default()
3576                                .option_as_meta
3577                        },
3578                    }),
3579                    metadata: None,
3580                    files: USER,
3581                }),
3582                SettingsPageItem::SettingItem(SettingItem {
3583                    title: "Copy On Select",
3584                    description: "Whether selecting text in the terminal automatically copies to the system clipboard",
3585                    field: Box::new(SettingField {
3586                        pick: |settings_content| {
3587                            if let Some(terminal) = &settings_content.terminal {
3588                                &terminal.copy_on_select
3589                            } else {
3590                                &None
3591                            }
3592                        },
3593                        pick_mut: |settings_content| {
3594                            &mut settings_content
3595                                .terminal
3596                                .get_or_insert_default()
3597                                .copy_on_select
3598                        },
3599                    }),
3600                    metadata: None,
3601                    files: USER,
3602                }),
3603                SettingsPageItem::SettingItem(SettingItem {
3604                    title: "Keep Selection On Copy",
3605                    description: "Whether to keep the text selection after copying it to the clipboard",
3606                    field: Box::new(SettingField {
3607                        pick: |settings_content| {
3608                            if let Some(terminal) = &settings_content.terminal {
3609                                &terminal.keep_selection_on_copy
3610                            } else {
3611                                &None
3612                            }
3613                        },
3614                        pick_mut: |settings_content| {
3615                            &mut settings_content
3616                                .terminal
3617                                .get_or_insert_default()
3618                                .keep_selection_on_copy
3619                        },
3620                    }),
3621                    metadata: None,
3622                    files: USER,
3623                }),
3624                SettingsPageItem::SectionHeader("Layout Settings"),
3625                SettingsPageItem::SettingItem(SettingItem {
3626                    title: "Default Width",
3627                    description: "Default width when the terminal is docked to the left or right (in pixels)",
3628                    field: Box::new(SettingField {
3629                        pick: |settings_content| {
3630                            if let Some(terminal) = &settings_content.terminal {
3631                                &terminal.default_width
3632                            } else {
3633                                &None
3634                            }
3635                        },
3636                        pick_mut: |settings_content| {
3637                            &mut settings_content
3638                                .terminal
3639                                .get_or_insert_default()
3640                                .default_width
3641                        },
3642                    }),
3643                    metadata: None,
3644                    files: USER,
3645                }),
3646                SettingsPageItem::SettingItem(SettingItem {
3647                    title: "Default Height",
3648                    description: "Default height when the terminal is docked to the bottom (in pixels)",
3649                    field: Box::new(SettingField {
3650                        pick: |settings_content| {
3651                            if let Some(terminal) = &settings_content.terminal {
3652                                &terminal.default_height
3653                            } else {
3654                                &None
3655                            }
3656                        },
3657                        pick_mut: |settings_content| {
3658                            &mut settings_content
3659                                .terminal
3660                                .get_or_insert_default()
3661                                .default_height
3662                        },
3663                    }),
3664                    metadata: None,
3665                    files: USER,
3666                }),
3667                SettingsPageItem::SectionHeader("Advanced Settings"),
3668                SettingsPageItem::SettingItem(SettingItem {
3669                    title: "Max Scroll History Lines",
3670                    description: "Maximum number of lines to keep in scrollback history (max: 100,000; 0 disables scrolling)",
3671                    field: Box::new(SettingField {
3672                        pick: |settings_content| {
3673                            if let Some(terminal) = &settings_content.terminal {
3674                                &terminal.max_scroll_history_lines
3675                            } else {
3676                                &None
3677                            }
3678                        },
3679                        pick_mut: |settings_content| {
3680                            &mut settings_content
3681                                .terminal
3682                                .get_or_insert_default()
3683                                .max_scroll_history_lines
3684                        },
3685                    }),
3686                    metadata: None,
3687                    files: USER,
3688                }),
3689                SettingsPageItem::SectionHeader("Toolbar"),
3690                SettingsPageItem::SettingItem(SettingItem {
3691                    title: "Breadcrumbs",
3692                    description: "Display the terminal title in breadcrumbs inside the terminal pane",
3693                    field: Box::new(SettingField {
3694                        pick: |settings_content| {
3695                            if let Some(terminal) = &settings_content.terminal {
3696                                if let Some(toolbar) = &terminal.toolbar {
3697                                    &toolbar.breadcrumbs
3698                                } else {
3699                                    &None
3700                                }
3701                            } else {
3702                                &None
3703                            }
3704                        },
3705                        pick_mut: |settings_content| {
3706                            &mut settings_content
3707                                .terminal
3708                                .get_or_insert_default()
3709                                .toolbar
3710                                .get_or_insert_default()
3711                                .breadcrumbs
3712                        },
3713                    }),
3714                    metadata: None,
3715                    files: USER,
3716                }),
3717                SettingsPageItem::SectionHeader("Scrollbar"),
3718                SettingsPageItem::SettingItem(SettingItem {
3719                    title: "Show Scrollbar",
3720                    description: "When to show the scrollbar in the terminal",
3721                    field: Box::new(SettingField {
3722                        pick: |settings_content| {
3723                            if let Some(terminal) = &settings_content.terminal
3724                                && let Some(scrollbar) = &terminal.scrollbar
3725                                && scrollbar.show.is_some()
3726                            {
3727                                &scrollbar.show
3728                            } else if let Some(scrollbar) = &settings_content.editor.scrollbar {
3729                                &scrollbar.show
3730                            } else {
3731                                &None
3732                            }
3733                        },
3734                        pick_mut: |settings_content| {
3735                            &mut settings_content
3736                                .terminal
3737                                .get_or_insert_default()
3738                                .scrollbar
3739                                .get_or_insert_default()
3740                                .show
3741                        },
3742                    }),
3743                    metadata: None,
3744                    files: USER,
3745                }),
3746            ],
3747        },
3748        SettingsPage {
3749            title: "Version Control",
3750            items: vec![
3751                SettingsPageItem::SectionHeader("Git"),
3752                SettingsPageItem::SettingItem(SettingItem {
3753                    title: "Git Gutter",
3754                    description: "Control whether git status is shown in the editor's gutter",
3755                    field: Box::new(SettingField {
3756                        pick: |settings_content| {
3757                            if let Some(git) = &settings_content.git {
3758                                &git.git_gutter
3759                            } else {
3760                                &None
3761                            }
3762                        },
3763                        pick_mut: |settings_content| {
3764                            &mut settings_content.git.get_or_insert_default().git_gutter
3765                        },
3766                    }),
3767                    metadata: None,
3768                    files: USER,
3769                }),
3770                // todo(settings_ui): Figure out the right default for this value in default.json
3771                SettingsPageItem::SettingItem(SettingItem {
3772                    title: "Gutter Debounce",
3773                    description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
3774                    field: Box::new(SettingField {
3775                        pick: |settings_content| {
3776                            if let Some(git) = &settings_content.git {
3777                                &git.gutter_debounce
3778                            } else {
3779                                &None
3780                            }
3781                        },
3782                        pick_mut: |settings_content| {
3783                            &mut settings_content.git.get_or_insert_default().gutter_debounce
3784                        },
3785                    }),
3786                    metadata: None,
3787                    files: USER,
3788                }),
3789                SettingsPageItem::SettingItem(SettingItem {
3790                    title: "Inline Git Blame",
3791                    description: "Whether or not to show git blame data inline in the currently focused line",
3792                    field: Box::new(SettingField {
3793                        pick: |settings_content| {
3794                            if let Some(git) = &settings_content.git {
3795                                if let Some(inline_blame) = &git.inline_blame {
3796                                    &inline_blame.enabled
3797                                } else {
3798                                    &None
3799                                }
3800                            } else {
3801                                &None
3802                            }
3803                        },
3804                        pick_mut: |settings_content| {
3805                            &mut settings_content
3806                                .git
3807                                .get_or_insert_default()
3808                                .inline_blame
3809                                .get_or_insert_default()
3810                                .enabled
3811                        },
3812                    }),
3813                    metadata: None,
3814                    files: USER,
3815                }),
3816                SettingsPageItem::SettingItem(SettingItem {
3817                    title: "Inline Git Blame Delay",
3818                    description: "The delay after which the inline blame information is shown",
3819                    field: Box::new(SettingField {
3820                        pick: |settings_content| {
3821                            if let Some(git) = &settings_content.git {
3822                                if let Some(inline_blame) = &git.inline_blame {
3823                                    &inline_blame.delay_ms
3824                                } else {
3825                                    &None
3826                                }
3827                            } else {
3828                                &None
3829                            }
3830                        },
3831                        pick_mut: |settings_content| {
3832                            &mut settings_content
3833                                .git
3834                                .get_or_insert_default()
3835                                .inline_blame
3836                                .get_or_insert_default()
3837                                .delay_ms
3838                        },
3839                    }),
3840                    metadata: None,
3841                    files: USER,
3842                }),
3843                SettingsPageItem::SettingItem(SettingItem {
3844                    title: "Inline Git Blame Padding",
3845                    description: "Padding between the end of the source line and the start of the inline blame in columns",
3846                    field: Box::new(SettingField {
3847                        pick: |settings_content| {
3848                            if let Some(git) = &settings_content.git {
3849                                if let Some(inline_blame) = &git.inline_blame {
3850                                    &inline_blame.padding
3851                                } else {
3852                                    &None
3853                                }
3854                            } else {
3855                                &None
3856                            }
3857                        },
3858                        pick_mut: |settings_content| {
3859                            &mut settings_content
3860                                .git
3861                                .get_or_insert_default()
3862                                .inline_blame
3863                                .get_or_insert_default()
3864                                .padding
3865                        },
3866                    }),
3867                    metadata: None,
3868                    files: USER,
3869                }),
3870                SettingsPageItem::SettingItem(SettingItem {
3871                    title: "Inline Git Blame Min Column",
3872                    description: "The minimum column number to show the inline blame information at",
3873                    field: Box::new(SettingField {
3874                        pick: |settings_content| {
3875                            if let Some(git) = &settings_content.git {
3876                                if let Some(inline_blame) = &git.inline_blame {
3877                                    &inline_blame.min_column
3878                                } else {
3879                                    &None
3880                                }
3881                            } else {
3882                                &None
3883                            }
3884                        },
3885                        pick_mut: |settings_content| {
3886                            &mut settings_content
3887                                .git
3888                                .get_or_insert_default()
3889                                .inline_blame
3890                                .get_or_insert_default()
3891                                .min_column
3892                        },
3893                    }),
3894                    metadata: None,
3895                    files: USER,
3896                }),
3897                SettingsPageItem::SettingItem(SettingItem {
3898                    title: "Show Commit Summary",
3899                    description: "Show commit summary as part of the inline blame",
3900                    field: Box::new(SettingField {
3901                        pick: |settings_content| {
3902                            if let Some(git) = &settings_content.git {
3903                                if let Some(inline_blame) = &git.inline_blame {
3904                                    &inline_blame.show_commit_summary
3905                                } else {
3906                                    &None
3907                                }
3908                            } else {
3909                                &None
3910                            }
3911                        },
3912                        pick_mut: |settings_content| {
3913                            &mut settings_content
3914                                .git
3915                                .get_or_insert_default()
3916                                .inline_blame
3917                                .get_or_insert_default()
3918                                .show_commit_summary
3919                        },
3920                    }),
3921                    metadata: None,
3922                    files: USER,
3923                }),
3924                SettingsPageItem::SettingItem(SettingItem {
3925                    title: "Show Avatar",
3926                    description: "Show the avatar of the author of the commit",
3927                    field: Box::new(SettingField {
3928                        pick: |settings_content| {
3929                            if let Some(git) = &settings_content.git {
3930                                if let Some(blame) = &git.blame {
3931                                    &blame.show_avatar
3932                                } else {
3933                                    &None
3934                                }
3935                            } else {
3936                                &None
3937                            }
3938                        },
3939                        pick_mut: |settings_content| {
3940                            &mut settings_content
3941                                .git
3942                                .get_or_insert_default()
3943                                .blame
3944                                .get_or_insert_default()
3945                                .show_avatar
3946                        },
3947                    }),
3948                    metadata: None,
3949                    files: USER,
3950                }),
3951                SettingsPageItem::SettingItem(SettingItem {
3952                    title: "Show Author Name In Branch Picker",
3953                    description: "Show author name as part of the commit information in branch picker",
3954                    field: Box::new(SettingField {
3955                        pick: |settings_content| {
3956                            if let Some(git) = &settings_content.git {
3957                                if let Some(branch_picker) = &git.branch_picker {
3958                                    &branch_picker.show_author_name
3959                                } else {
3960                                    &None
3961                                }
3962                            } else {
3963                                &None
3964                            }
3965                        },
3966                        pick_mut: |settings_content| {
3967                            &mut settings_content
3968                                .git
3969                                .get_or_insert_default()
3970                                .branch_picker
3971                                .get_or_insert_default()
3972                                .show_author_name
3973                        },
3974                    }),
3975                    metadata: None,
3976                    files: USER,
3977                }),
3978                SettingsPageItem::SettingItem(SettingItem {
3979                    title: "Hunk Style",
3980                    description: "How git hunks are displayed visually in the editor",
3981                    field: Box::new(SettingField {
3982                        pick: |settings_content| {
3983                            if let Some(git) = &settings_content.git {
3984                                &git.hunk_style
3985                            } else {
3986                                &None
3987                            }
3988                        },
3989                        pick_mut: |settings_content| {
3990                            &mut settings_content.git.get_or_insert_default().hunk_style
3991                        },
3992                    }),
3993                    metadata: None,
3994                    files: USER,
3995                }),
3996            ],
3997        },
3998        SettingsPage {
3999            title: "Diagnostics & Errors",
4000            items: vec![
4001                SettingsPageItem::SectionHeader("Filtering"),
4002                SettingsPageItem::SettingItem(SettingItem {
4003                    title: "Max Severity",
4004                    description: "Which level to use to filter out diagnostics displayed in the editor",
4005                    field: Box::new(SettingField {
4006                        pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
4007                        pick_mut: |settings_content| {
4008                            &mut settings_content.editor.diagnostics_max_severity
4009                        },
4010                    }),
4011                    metadata: None,
4012                    files: USER,
4013                }),
4014                SettingsPageItem::SettingItem(SettingItem {
4015                    title: "Include Warnings",
4016                    description: "Whether to show warnings or not by default",
4017                    field: Box::new(SettingField {
4018                        pick: |settings_content| {
4019                            if let Some(diagnostics) = &settings_content.diagnostics {
4020                                &diagnostics.include_warnings
4021                            } else {
4022                                &None
4023                            }
4024                        },
4025                        pick_mut: |settings_content| {
4026                            &mut settings_content
4027                                .diagnostics
4028                                .get_or_insert_default()
4029                                .include_warnings
4030                        },
4031                    }),
4032                    metadata: None,
4033                    files: USER,
4034                }),
4035                SettingsPageItem::SectionHeader("Inline"),
4036                SettingsPageItem::SettingItem(SettingItem {
4037                    title: "Inline Diagnostics Enabled",
4038                    description: "Whether to show diagnostics inline or not",
4039                    field: Box::new(SettingField {
4040                        pick: |settings_content| {
4041                            if let Some(diagnostics) = &settings_content.diagnostics {
4042                                if let Some(inline) = &diagnostics.inline {
4043                                    &inline.enabled
4044                                } else {
4045                                    &None
4046                                }
4047                            } else {
4048                                &None
4049                            }
4050                        },
4051                        pick_mut: |settings_content| {
4052                            &mut settings_content
4053                                .diagnostics
4054                                .get_or_insert_default()
4055                                .inline
4056                                .get_or_insert_default()
4057                                .enabled
4058                        },
4059                    }),
4060                    metadata: None,
4061                    files: USER,
4062                }),
4063                SettingsPageItem::SettingItem(SettingItem {
4064                    title: "Inline Update Debounce",
4065                    description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
4066                    field: Box::new(SettingField {
4067                        pick: |settings_content| {
4068                            if let Some(diagnostics) = &settings_content.diagnostics {
4069                                if let Some(inline) = &diagnostics.inline {
4070                                    &inline.update_debounce_ms
4071                                } else {
4072                                    &None
4073                                }
4074                            } else {
4075                                &None
4076                            }
4077                        },
4078                        pick_mut: |settings_content| {
4079                            &mut settings_content
4080                                .diagnostics
4081                                .get_or_insert_default()
4082                                .inline
4083                                .get_or_insert_default()
4084                                .update_debounce_ms
4085                        },
4086                    }),
4087                    metadata: None,
4088                    files: USER,
4089                }),
4090                SettingsPageItem::SettingItem(SettingItem {
4091                    title: "Inline Padding",
4092                    description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
4093                    field: Box::new(SettingField {
4094                        pick: |settings_content| {
4095                            if let Some(diagnostics) = &settings_content.diagnostics {
4096                                if let Some(inline) = &diagnostics.inline {
4097                                    &inline.padding
4098                                } else {
4099                                    &None
4100                                }
4101                            } else {
4102                                &None
4103                            }
4104                        },
4105                        pick_mut: |settings_content| {
4106                            &mut settings_content
4107                                .diagnostics
4108                                .get_or_insert_default()
4109                                .inline
4110                                .get_or_insert_default()
4111                                .padding
4112                        },
4113                    }),
4114                    metadata: None,
4115                    files: USER,
4116                }),
4117                SettingsPageItem::SettingItem(SettingItem {
4118                    title: "Inline Min Column",
4119                    description: "The minimum column to display inline diagnostics",
4120                    field: Box::new(SettingField {
4121                        pick: |settings_content| {
4122                            if let Some(diagnostics) = &settings_content.diagnostics {
4123                                if let Some(inline) = &diagnostics.inline {
4124                                    &inline.min_column
4125                                } else {
4126                                    &None
4127                                }
4128                            } else {
4129                                &None
4130                            }
4131                        },
4132                        pick_mut: |settings_content| {
4133                            &mut settings_content
4134                                .diagnostics
4135                                .get_or_insert_default()
4136                                .inline
4137                                .get_or_insert_default()
4138                                .min_column
4139                        },
4140                    }),
4141                    metadata: None,
4142                    files: USER,
4143                }),
4144                SettingsPageItem::SectionHeader("Performance"),
4145                SettingsPageItem::SettingItem(SettingItem {
4146                    title: "LSP Pull Diagnostics Enabled",
4147                    description: "Whether to pull for language server-powered diagnostics or not",
4148                    field: Box::new(SettingField {
4149                        pick: |settings_content| {
4150                            if let Some(diagnostics) = &settings_content.diagnostics {
4151                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
4152                                    &lsp_pull.enabled
4153                                } else {
4154                                    &None
4155                                }
4156                            } else {
4157                                &None
4158                            }
4159                        },
4160                        pick_mut: |settings_content| {
4161                            &mut settings_content
4162                                .diagnostics
4163                                .get_or_insert_default()
4164                                .lsp_pull_diagnostics
4165                                .get_or_insert_default()
4166                                .enabled
4167                        },
4168                    }),
4169                    metadata: None,
4170                    files: USER,
4171                }),
4172                // todo(settings_ui): Needs unit
4173                SettingsPageItem::SettingItem(SettingItem {
4174                    title: "LSP Pull Debounce",
4175                    description: "Minimum time to wait before pulling diagnostics from the language server(s)",
4176                    field: Box::new(SettingField {
4177                        pick: |settings_content| {
4178                            if let Some(diagnostics) = &settings_content.diagnostics {
4179                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
4180                                    &lsp_pull.debounce_ms
4181                                } else {
4182                                    &None
4183                                }
4184                            } else {
4185                                &None
4186                            }
4187                        },
4188                        pick_mut: |settings_content| {
4189                            &mut settings_content
4190                                .diagnostics
4191                                .get_or_insert_default()
4192                                .lsp_pull_diagnostics
4193                                .get_or_insert_default()
4194                                .debounce_ms
4195                        },
4196                    }),
4197                    metadata: None,
4198                    files: USER,
4199                }),
4200            ],
4201        },
4202        SettingsPage {
4203            title: "Collaboration",
4204            items: vec![
4205                SettingsPageItem::SectionHeader("Calls"),
4206                SettingsPageItem::SettingItem(SettingItem {
4207                    title: "Mute On Join",
4208                    description: "Whether the microphone should be muted when joining a channel or a call",
4209                    field: Box::new(SettingField {
4210                        pick: |settings_content| {
4211                            if let Some(calls) = &settings_content.calls {
4212                                &calls.mute_on_join
4213                            } else {
4214                                &None
4215                            }
4216                        },
4217                        pick_mut: |settings_content| {
4218                            &mut settings_content.calls.get_or_insert_default().mute_on_join
4219                        },
4220                    }),
4221                    metadata: None,
4222                    files: USER,
4223                }),
4224                SettingsPageItem::SettingItem(SettingItem {
4225                    title: "Share On Join",
4226                    description: "Whether your current project should be shared when joining an empty channel",
4227                    field: Box::new(SettingField {
4228                        pick: |settings_content| {
4229                            if let Some(calls) = &settings_content.calls {
4230                                &calls.share_on_join
4231                            } else {
4232                                &None
4233                            }
4234                        },
4235                        pick_mut: |settings_content| {
4236                            &mut settings_content.calls.get_or_insert_default().share_on_join
4237                        },
4238                    }),
4239                    metadata: None,
4240                    files: USER,
4241                }),
4242                SettingsPageItem::SectionHeader("Experimental"),
4243                SettingsPageItem::SettingItem(SettingItem {
4244                    title: "Rodio Audio",
4245                    description: "Opt into the new audio system",
4246                    field: Box::new(SettingField {
4247                        pick: |settings_content| {
4248                            if let Some(audio) = &settings_content.audio {
4249                                &audio.rodio_audio
4250                            } else {
4251                                &None
4252                            }
4253                        },
4254                        pick_mut: |settings_content| {
4255                            &mut settings_content.audio.get_or_insert_default().rodio_audio
4256                        },
4257                    }),
4258                    metadata: None,
4259                    files: USER,
4260                }),
4261                SettingsPageItem::SettingItem(SettingItem {
4262                    title: "Auto Microphone Volume",
4263                    description: "Automatically adjust microphone volume (requires Rodio Audio)",
4264                    field: Box::new(SettingField {
4265                        pick: |settings_content| {
4266                            if let Some(audio) = &settings_content.audio {
4267                                &audio.auto_microphone_volume
4268                            } else {
4269                                &None
4270                            }
4271                        },
4272                        pick_mut: |settings_content| {
4273                            &mut settings_content
4274                                .audio
4275                                .get_or_insert_default()
4276                                .auto_microphone_volume
4277                        },
4278                    }),
4279                    metadata: None,
4280                    files: USER,
4281                }),
4282                SettingsPageItem::SettingItem(SettingItem {
4283                    title: "Auto Speaker Volume",
4284                    description: "Automatically adjust volume of other call members (requires Rodio Audio)",
4285                    field: Box::new(SettingField {
4286                        pick: |settings_content| {
4287                            if let Some(audio) = &settings_content.audio {
4288                                &audio.auto_speaker_volume
4289                            } else {
4290                                &None
4291                            }
4292                        },
4293                        pick_mut: |settings_content| {
4294                            &mut settings_content
4295                                .audio
4296                                .get_or_insert_default()
4297                                .auto_speaker_volume
4298                        },
4299                    }),
4300                    metadata: None,
4301                    files: USER,
4302                }),
4303                SettingsPageItem::SettingItem(SettingItem {
4304                    title: "Denoise",
4305                    description: "Remove background noises (requires Rodio Audio)",
4306                    field: Box::new(SettingField {
4307                        pick: |settings_content| {
4308                            if let Some(audio) = &settings_content.audio {
4309                                &audio.denoise
4310                            } else {
4311                                &None
4312                            }
4313                        },
4314                        pick_mut: |settings_content| {
4315                            &mut settings_content.audio.get_or_insert_default().denoise
4316                        },
4317                    }),
4318                    metadata: None,
4319                    files: USER,
4320                }),
4321                SettingsPageItem::SettingItem(SettingItem {
4322                    title: "Legacy Audio Compatible",
4323                    description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
4324                    field: Box::new(SettingField {
4325                        pick: |settings_content| {
4326                            if let Some(audio) = &settings_content.audio {
4327                                &audio.legacy_audio_compatible
4328                            } else {
4329                                &None
4330                            }
4331                        },
4332                        pick_mut: |settings_content| {
4333                            &mut settings_content
4334                                .audio
4335                                .get_or_insert_default()
4336                                .legacy_audio_compatible
4337                        },
4338                    }),
4339                    metadata: None,
4340                    files: USER,
4341                }),
4342            ],
4343        },
4344        SettingsPage {
4345            title: "AI",
4346            items: vec![
4347                SettingsPageItem::SectionHeader("General"),
4348                SettingsPageItem::SettingItem(SettingItem {
4349                    title: "Disable AI",
4350                    description: "Whether to disable all AI features in Zed",
4351                    field: Box::new(SettingField {
4352                        pick: |settings_content| &settings_content.disable_ai,
4353                        pick_mut: |settings_content| &mut settings_content.disable_ai,
4354                    }),
4355                    metadata: None,
4356                    files: USER,
4357                }),
4358            ],
4359        },
4360        SettingsPage {
4361            title: "System & Network",
4362            items: vec![
4363                SettingsPageItem::SectionHeader("Network"),
4364                // todo(settings_ui): Proxy needs a default
4365                SettingsPageItem::SettingItem(SettingItem {
4366                    title: "Proxy",
4367                    description: "The proxy to use for network requests",
4368                    field: Box::new(
4369                        SettingField {
4370                            pick: |settings_content| &settings_content.proxy,
4371                            pick_mut: |settings_content| &mut settings_content.proxy,
4372                        }
4373                        .unimplemented(),
4374                    ),
4375                    metadata: Some(Box::new(SettingsFieldMetadata {
4376                        placeholder: Some("socks5h://localhost:10808"),
4377                    })),
4378                    files: USER,
4379                }),
4380                SettingsPageItem::SettingItem(SettingItem {
4381                    title: "Server URL",
4382                    description: "The URL of the Zed server to connect to",
4383                    field: Box::new(SettingField {
4384                        pick: |settings_content| &settings_content.server_url,
4385                        pick_mut: |settings_content| &mut settings_content.server_url,
4386                    }),
4387                    metadata: Some(Box::new(SettingsFieldMetadata {
4388                        placeholder: Some("https://zed.dev"),
4389                    })),
4390                    files: USER,
4391                }),
4392                SettingsPageItem::SectionHeader("System"),
4393                SettingsPageItem::SettingItem(SettingItem {
4394                    title: "Auto Update",
4395                    description: "Whether or not to automatically check for updates",
4396                    field: Box::new(SettingField {
4397                        pick: |settings_content| &settings_content.auto_update,
4398                        pick_mut: |settings_content| &mut settings_content.auto_update,
4399                    }),
4400                    metadata: None,
4401                    files: USER,
4402                }),
4403            ],
4404        },
4405    ]
4406}
4407
4408const LANGUAGES_SECTION_HEADER: &'static str = "Languages";
4409
4410fn language_settings_data() -> Vec<SettingsPageItem> {
4411    fn current_language() -> Option<SharedString> {
4412        sub_page_stack().iter().find_map(|page| {
4413            (page.section_header == LANGUAGES_SECTION_HEADER)
4414                .then(|| SharedString::new_static(page.link.title))
4415        })
4416    }
4417
4418    fn language_settings_field<T>(
4419        settings_content: &SettingsContent,
4420        get: fn(&LanguageSettingsContent) -> &Option<T>,
4421    ) -> &Option<T> {
4422        let all_languages = &settings_content.project.all_languages;
4423        if let Some(current_language_name) = current_language() {
4424            if let Some(current_language) = all_languages.languages.0.get(&current_language_name) {
4425                let value = get(current_language);
4426                if value.is_some() {
4427                    return value;
4428                }
4429            }
4430        }
4431        let default_value = get(&all_languages.defaults);
4432        return default_value;
4433    }
4434
4435    fn language_settings_field_mut<T>(
4436        settings_content: &mut SettingsContent,
4437        get: fn(&mut LanguageSettingsContent) -> &mut Option<T>,
4438    ) -> &mut Option<T> {
4439        let all_languages = &mut settings_content.project.all_languages;
4440        let language_content = if let Some(current_language) = current_language() {
4441            all_languages
4442                .languages
4443                .0
4444                .entry(current_language)
4445                .or_default()
4446        } else {
4447            &mut all_languages.defaults
4448        };
4449        return get(language_content);
4450    }
4451
4452    vec![
4453        SettingsPageItem::SectionHeader("Indentation"),
4454        SettingsPageItem::SettingItem(SettingItem {
4455            title: "Tab Size",
4456            description: "How many columns a tab should occupy",
4457            field: Box::new(SettingField {
4458                pick: |settings_content| {
4459                    language_settings_field(settings_content, |language| &language.tab_size)
4460                },
4461                pick_mut: |settings_content| {
4462                    language_settings_field_mut(settings_content, |language| &mut language.tab_size)
4463                },
4464            }),
4465            metadata: None,
4466            files: USER | LOCAL,
4467        }),
4468        SettingsPageItem::SettingItem(SettingItem {
4469            title: "Hard Tabs",
4470            description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
4471            field: Box::new(SettingField {
4472                pick: |settings_content| {
4473                    language_settings_field(settings_content, |language| &language.hard_tabs)
4474                },
4475                pick_mut: |settings_content| {
4476                    language_settings_field_mut(settings_content, |language| {
4477                        &mut language.hard_tabs
4478                    })
4479                },
4480            }),
4481            metadata: None,
4482            files: USER | LOCAL,
4483        }),
4484        SettingsPageItem::SettingItem(SettingItem {
4485            title: "Auto Indent",
4486            description: "Whether indentation should be adjusted based on the context whilst typing",
4487            field: Box::new(SettingField {
4488                pick: |settings_content| {
4489                    language_settings_field(settings_content, |language| &language.auto_indent)
4490                },
4491                pick_mut: |settings_content| {
4492                    language_settings_field_mut(settings_content, |language| {
4493                        &mut language.auto_indent
4494                    })
4495                },
4496            }),
4497            metadata: None,
4498            files: USER | LOCAL,
4499        }),
4500        SettingsPageItem::SettingItem(SettingItem {
4501            title: "Auto Indent On Paste",
4502            description: "Whether indentation of pasted content should be adjusted based on the context",
4503            field: Box::new(SettingField {
4504                pick: |settings_content| {
4505                    language_settings_field(settings_content, |language| {
4506                        &language.auto_indent_on_paste
4507                    })
4508                },
4509                pick_mut: |settings_content| {
4510                    language_settings_field_mut(settings_content, |language| {
4511                        &mut language.auto_indent_on_paste
4512                    })
4513                },
4514            }),
4515            metadata: None,
4516            files: USER | LOCAL,
4517        }),
4518        SettingsPageItem::SectionHeader("Wrapping"),
4519        SettingsPageItem::SettingItem(SettingItem {
4520            title: "Soft Wrap",
4521            description: "How to soft-wrap long lines of text",
4522            field: Box::new(SettingField {
4523                pick: |settings_content| {
4524                    language_settings_field(settings_content, |language| &language.soft_wrap)
4525                },
4526                pick_mut: |settings_content| {
4527                    language_settings_field_mut(settings_content, |language| {
4528                        &mut language.soft_wrap
4529                    })
4530                },
4531            }),
4532            metadata: None,
4533            files: USER | LOCAL,
4534        }),
4535        SettingsPageItem::SettingItem(SettingItem {
4536            title: "Show Wrap Guides",
4537            description: "Show wrap guides in the editor",
4538            field: Box::new(SettingField {
4539                pick: |settings_content| {
4540                    language_settings_field(settings_content, |language| &language.show_wrap_guides)
4541                },
4542                pick_mut: |settings_content| {
4543                    language_settings_field_mut(settings_content, |language| {
4544                        &mut language.show_wrap_guides
4545                    })
4546                },
4547            }),
4548            metadata: None,
4549            files: USER | LOCAL,
4550        }),
4551        SettingsPageItem::SettingItem(SettingItem {
4552            title: "Preferred Line Length",
4553            description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
4554            field: Box::new(SettingField {
4555                pick: |settings_content| {
4556                    language_settings_field(settings_content, |language| {
4557                        &language.preferred_line_length
4558                    })
4559                },
4560                pick_mut: |settings_content| {
4561                    language_settings_field_mut(settings_content, |language| {
4562                        &mut language.preferred_line_length
4563                    })
4564                },
4565            }),
4566            metadata: None,
4567            files: USER | LOCAL,
4568        }),
4569        SettingsPageItem::SettingItem(SettingItem {
4570            title: "Wrap Guides",
4571            description: "Character counts at which to show wrap guides in the editor",
4572            field: Box::new(
4573                SettingField {
4574                    pick: |settings_content| {
4575                        language_settings_field(settings_content, |language| &language.wrap_guides)
4576                    },
4577                    pick_mut: |settings_content| {
4578                        language_settings_field_mut(settings_content, |language| {
4579                            &mut language.wrap_guides
4580                        })
4581                    },
4582                }
4583                .unimplemented(),
4584            ),
4585            metadata: None,
4586            files: USER | LOCAL,
4587        }),
4588        SettingsPageItem::SettingItem(SettingItem {
4589            title: "Allow Rewrap",
4590            description: "Controls where the `editor::Rewrap` action is allowed for this language",
4591            field: Box::new(SettingField {
4592                pick: |settings_content| {
4593                    language_settings_field(settings_content, |language| &language.allow_rewrap)
4594                },
4595                pick_mut: |settings_content| {
4596                    language_settings_field_mut(settings_content, |language| {
4597                        &mut language.allow_rewrap
4598                    })
4599                },
4600            }),
4601            metadata: None,
4602            files: USER | LOCAL,
4603        }),
4604        SettingsPageItem::SectionHeader("Indent Guides"),
4605        SettingsPageItem::SettingItem(SettingItem {
4606            title: "Enabled",
4607            description: "Display indent guides in the editor",
4608            field: Box::new(SettingField {
4609                pick: |settings_content| {
4610                    language_settings_field(settings_content, |language| {
4611                        if let Some(indent_guides) = &language.indent_guides {
4612                            &indent_guides.enabled
4613                        } else {
4614                            &None
4615                        }
4616                    })
4617                },
4618                pick_mut: |settings_content| {
4619                    language_settings_field_mut(settings_content, |language| {
4620                        &mut language.indent_guides.get_or_insert_default().enabled
4621                    })
4622                },
4623            }),
4624            metadata: None,
4625            files: USER | LOCAL,
4626        }),
4627        SettingsPageItem::SettingItem(SettingItem {
4628            title: "Line Width",
4629            description: "The width of the indent guides in pixels, between 1 and 10",
4630            field: Box::new(SettingField {
4631                pick: |settings_content| {
4632                    language_settings_field(settings_content, |language| {
4633                        if let Some(indent_guides) = &language.indent_guides {
4634                            &indent_guides.line_width
4635                        } else {
4636                            &None
4637                        }
4638                    })
4639                },
4640                pick_mut: |settings_content| {
4641                    language_settings_field_mut(settings_content, |language| {
4642                        &mut language.indent_guides.get_or_insert_default().line_width
4643                    })
4644                },
4645            }),
4646            metadata: None,
4647            files: USER | LOCAL,
4648        }),
4649        SettingsPageItem::SettingItem(SettingItem {
4650            title: "Active Line Width",
4651            description: "The width of the active indent guide in pixels, between 1 and 10",
4652            field: Box::new(SettingField {
4653                pick: |settings_content| {
4654                    language_settings_field(settings_content, |language| {
4655                        if let Some(indent_guides) = &language.indent_guides {
4656                            &indent_guides.active_line_width
4657                        } else {
4658                            &None
4659                        }
4660                    })
4661                },
4662                pick_mut: |settings_content| {
4663                    language_settings_field_mut(settings_content, |language| {
4664                        &mut language
4665                            .indent_guides
4666                            .get_or_insert_default()
4667                            .active_line_width
4668                    })
4669                },
4670            }),
4671            metadata: None,
4672            files: USER | LOCAL,
4673        }),
4674        SettingsPageItem::SettingItem(SettingItem {
4675            title: "Coloring",
4676            description: "Determines how indent guides are colored",
4677            field: Box::new(SettingField {
4678                pick: |settings_content| {
4679                    language_settings_field(settings_content, |language| {
4680                        if let Some(indent_guides) = &language.indent_guides {
4681                            &indent_guides.coloring
4682                        } else {
4683                            &None
4684                        }
4685                    })
4686                },
4687                pick_mut: |settings_content| {
4688                    language_settings_field_mut(settings_content, |language| {
4689                        &mut language.indent_guides.get_or_insert_default().coloring
4690                    })
4691                },
4692            }),
4693            metadata: None,
4694            files: USER | LOCAL,
4695        }),
4696        SettingsPageItem::SettingItem(SettingItem {
4697            title: "Background Coloring",
4698            description: "Determines how indent guide backgrounds are colored",
4699            field: Box::new(SettingField {
4700                pick: |settings_content| {
4701                    language_settings_field(settings_content, |language| {
4702                        if let Some(indent_guides) = &language.indent_guides {
4703                            &indent_guides.background_coloring
4704                        } else {
4705                            &None
4706                        }
4707                    })
4708                },
4709                pick_mut: |settings_content| {
4710                    language_settings_field_mut(settings_content, |language| {
4711                        &mut language
4712                            .indent_guides
4713                            .get_or_insert_default()
4714                            .background_coloring
4715                    })
4716                },
4717            }),
4718            metadata: None,
4719            files: USER | LOCAL,
4720        }),
4721        SettingsPageItem::SectionHeader("Formatting"),
4722        SettingsPageItem::SettingItem(SettingItem {
4723            title: "Format On Save",
4724            description: "Whether or not to perform a buffer format before saving",
4725            field: Box::new(
4726                // TODO(settings_ui): this setting should just be a bool
4727                SettingField {
4728                    pick: |settings_content| {
4729                        language_settings_field(settings_content, |language| {
4730                            &language.format_on_save
4731                        })
4732                    },
4733                    pick_mut: |settings_content| {
4734                        language_settings_field_mut(settings_content, |language| {
4735                            &mut language.format_on_save
4736                        })
4737                    },
4738                },
4739            ),
4740            metadata: None,
4741            files: USER | LOCAL,
4742        }),
4743        SettingsPageItem::SettingItem(SettingItem {
4744            title: "Remove Trailing Whitespace On Save",
4745            description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
4746            field: Box::new(SettingField {
4747                pick: |settings_content| {
4748                    language_settings_field(settings_content, |language| {
4749                        &language.remove_trailing_whitespace_on_save
4750                    })
4751                },
4752                pick_mut: |settings_content| {
4753                    language_settings_field_mut(settings_content, |language| {
4754                        &mut language.remove_trailing_whitespace_on_save
4755                    })
4756                },
4757            }),
4758            metadata: None,
4759            files: USER | LOCAL,
4760        }),
4761        SettingsPageItem::SettingItem(SettingItem {
4762            title: "Ensure Final Newline On Save",
4763            description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
4764            field: Box::new(SettingField {
4765                pick: |settings_content| {
4766                    language_settings_field(settings_content, |language| {
4767                        &language.ensure_final_newline_on_save
4768                    })
4769                },
4770                pick_mut: |settings_content| {
4771                    language_settings_field_mut(settings_content, |language| {
4772                        &mut language.ensure_final_newline_on_save
4773                    })
4774                },
4775            }),
4776            metadata: None,
4777            files: USER | LOCAL,
4778        }),
4779        SettingsPageItem::SettingItem(SettingItem {
4780            title: "Formatter",
4781            description: "How to perform a buffer format",
4782            field: Box::new(
4783                SettingField {
4784                    pick: |settings_content| {
4785                        language_settings_field(settings_content, |language| &language.formatter)
4786                    },
4787                    pick_mut: |settings_content| {
4788                        language_settings_field_mut(settings_content, |language| {
4789                            &mut language.formatter
4790                        })
4791                    },
4792                }
4793                .unimplemented(),
4794            ),
4795            metadata: None,
4796            files: USER | LOCAL,
4797        }),
4798        SettingsPageItem::SettingItem(SettingItem {
4799            title: "Use On Type Format",
4800            description: "Whether to use additional LSP queries to format (and amend) the code after every \"trigger\" symbol input, defined by LSP server capabilities",
4801            field: Box::new(SettingField {
4802                pick: |settings_content| {
4803                    language_settings_field(settings_content, |language| {
4804                        &language.use_on_type_format
4805                    })
4806                },
4807                pick_mut: |settings_content| {
4808                    language_settings_field_mut(settings_content, |language| {
4809                        &mut language.use_on_type_format
4810                    })
4811                },
4812            }),
4813            metadata: None,
4814            files: USER | LOCAL,
4815        }),
4816        SettingsPageItem::SectionHeader("Prettier"),
4817        SettingsPageItem::SettingItem(SettingItem {
4818            title: "Allowed",
4819            description: "Enables or disables formatting with Prettier for a given language",
4820            field: Box::new(SettingField {
4821                pick: |settings_content| {
4822                    language_settings_field(settings_content, |language| {
4823                        if let Some(prettier) = &language.prettier {
4824                            &prettier.allowed
4825                        } else {
4826                            &None
4827                        }
4828                    })
4829                },
4830                pick_mut: |settings_content| {
4831                    language_settings_field_mut(settings_content, |language| {
4832                        &mut language.prettier.get_or_insert_default().allowed
4833                    })
4834                },
4835            }),
4836            metadata: None,
4837            files: USER | LOCAL,
4838        }),
4839        SettingsPageItem::SettingItem(SettingItem {
4840            title: "Parser",
4841            description: "Forces Prettier integration to use a specific parser name when formatting files with the language",
4842            field: Box::new(SettingField {
4843                pick: |settings_content| {
4844                    language_settings_field(settings_content, |language| {
4845                        if let Some(prettier) = &language.prettier {
4846                            &prettier.parser
4847                        } else {
4848                            &None
4849                        }
4850                    })
4851                },
4852                pick_mut: |settings_content| {
4853                    language_settings_field_mut(settings_content, |language| {
4854                        &mut language.prettier.get_or_insert_default().parser
4855                    })
4856                },
4857            }),
4858            metadata: None,
4859            files: USER | LOCAL,
4860        }),
4861        SettingsPageItem::SettingItem(SettingItem {
4862            title: "Plugins",
4863            description: "Forces Prettier integration to use specific plugins when formatting files with the language",
4864            field: Box::new(
4865                SettingField {
4866                    pick: |settings_content| {
4867                        language_settings_field(settings_content, |language| {
4868                            if let Some(prettier) = &language.prettier {
4869                                &prettier.plugins
4870                            } else {
4871                                &None
4872                            }
4873                        })
4874                    },
4875                    pick_mut: |settings_content| {
4876                        language_settings_field_mut(settings_content, |language| {
4877                            &mut language.prettier.get_or_insert_default().plugins
4878                        })
4879                    },
4880                }
4881                .unimplemented(),
4882            ),
4883            metadata: None,
4884            files: USER | LOCAL,
4885        }),
4886        SettingsPageItem::SettingItem(SettingItem {
4887            title: "Options",
4888            description: "Default Prettier options, in the format as in package.json section for Prettier",
4889            field: Box::new(
4890                SettingField {
4891                    pick: |settings_content| {
4892                        language_settings_field(settings_content, |language| {
4893                            if let Some(prettier) = &language.prettier {
4894                                &prettier.options
4895                            } else {
4896                                &None
4897                            }
4898                        })
4899                    },
4900                    pick_mut: |settings_content| {
4901                        language_settings_field_mut(settings_content, |language| {
4902                            &mut language.prettier.get_or_insert_default().options
4903                        })
4904                    },
4905                }
4906                .unimplemented(),
4907            ),
4908            metadata: None,
4909            files: USER | LOCAL,
4910        }),
4911        SettingsPageItem::SectionHeader("Autoclose"),
4912        SettingsPageItem::SettingItem(SettingItem {
4913            title: "Use Autoclose",
4914            description: "Whether to automatically type closing characters for you. For example, when you type (, Zed will automatically add a closing ) at the correct position",
4915            field: Box::new(SettingField {
4916                pick: |settings_content| {
4917                    language_settings_field(settings_content, |language| &language.use_autoclose)
4918                },
4919                pick_mut: |settings_content| {
4920                    language_settings_field_mut(settings_content, |language| {
4921                        &mut language.use_autoclose
4922                    })
4923                },
4924            }),
4925            metadata: None,
4926            files: USER | LOCAL,
4927        }),
4928        SettingsPageItem::SettingItem(SettingItem {
4929            title: "Use Auto Surround",
4930            description: "Whether to automatically surround text with characters for you. For example, when you select text and type (, Zed will automatically surround text with ()",
4931            field: Box::new(SettingField {
4932                pick: |settings_content| {
4933                    language_settings_field(settings_content, |language| {
4934                        &language.use_auto_surround
4935                    })
4936                },
4937                pick_mut: |settings_content| {
4938                    language_settings_field_mut(settings_content, |language| {
4939                        &mut language.use_auto_surround
4940                    })
4941                },
4942            }),
4943            metadata: None,
4944            files: USER | LOCAL,
4945        }),
4946        SettingsPageItem::SettingItem(SettingItem {
4947            title: "Always Treat Brackets As Autoclosed",
4948            description: "Controls whether the closing characters are always skipped over and auto-removed no matter how they were inserted",
4949            field: Box::new(SettingField {
4950                pick: |settings_content| {
4951                    language_settings_field(settings_content, |language| {
4952                        &language.always_treat_brackets_as_autoclosed
4953                    })
4954                },
4955                pick_mut: |settings_content| {
4956                    language_settings_field_mut(settings_content, |language| {
4957                        &mut language.always_treat_brackets_as_autoclosed
4958                    })
4959                },
4960            }),
4961            metadata: None,
4962            files: USER | LOCAL,
4963        }),
4964        SettingsPageItem::SettingItem(SettingItem {
4965            title: "Jsx Tag Auto Close",
4966            description: "Whether to automatically close JSX tags",
4967            field: Box::new(SettingField {
4968                // TODO(settings_ui): this setting should just be a bool
4969                pick: |settings_content| {
4970                    language_settings_field(settings_content, |language| {
4971                        match language.jsx_tag_auto_close.as_ref() {
4972                            Some(s) => &s.enabled,
4973                            None => &None,
4974                        }
4975                    })
4976                },
4977                pick_mut: |settings_content| {
4978                    language_settings_field_mut(settings_content, |language| {
4979                        &mut language.jsx_tag_auto_close.get_or_insert_default().enabled
4980                    })
4981                },
4982            }),
4983            metadata: None,
4984            files: USER | LOCAL,
4985        }),
4986        SettingsPageItem::SectionHeader("LSP"),
4987        SettingsPageItem::SettingItem(SettingItem {
4988            title: "Enable Language Server",
4989            description: "Whether to use language servers to provide code intelligence",
4990            field: Box::new(SettingField {
4991                pick: |settings_content| {
4992                    language_settings_field(settings_content, |language| {
4993                        &language.enable_language_server
4994                    })
4995                },
4996                pick_mut: |settings_content| {
4997                    language_settings_field_mut(settings_content, |language| {
4998                        &mut language.enable_language_server
4999                    })
5000                },
5001            }),
5002            metadata: None,
5003            files: USER | LOCAL,
5004        }),
5005        SettingsPageItem::SettingItem(SettingItem {
5006            title: "Language Servers",
5007            description: "The list of language servers to use (or disable) for this language",
5008            field: Box::new(
5009                SettingField {
5010                    pick: |settings_content| {
5011                        language_settings_field(settings_content, |language| {
5012                            &language.language_servers
5013                        })
5014                    },
5015                    pick_mut: |settings_content| {
5016                        language_settings_field_mut(settings_content, |language| {
5017                            &mut language.language_servers
5018                        })
5019                    },
5020                }
5021                .unimplemented(),
5022            ),
5023            metadata: None,
5024            files: USER | LOCAL,
5025        }),
5026        SettingsPageItem::SettingItem(SettingItem {
5027            title: "Linked Edits",
5028            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",
5029            field: Box::new(SettingField {
5030                pick: |settings_content| {
5031                    language_settings_field(settings_content, |language| &language.linked_edits)
5032                },
5033                pick_mut: |settings_content| {
5034                    language_settings_field_mut(settings_content, |language| {
5035                        &mut language.linked_edits
5036                    })
5037                },
5038            }),
5039            metadata: None,
5040            files: USER | LOCAL,
5041        }),
5042        SettingsPageItem::SettingItem(SettingItem {
5043            title: "Go To Definition Fallback",
5044            description: "Whether to follow-up empty go to definition responses from the language server",
5045            field: Box::new(SettingField {
5046                pick: |settings_content| &settings_content.editor.go_to_definition_fallback,
5047                pick_mut: |settings_content| &mut settings_content.editor.go_to_definition_fallback,
5048            }),
5049            metadata: None,
5050            files: USER,
5051        }),
5052        SettingsPageItem::SectionHeader("Edit Predictions"),
5053        SettingsPageItem::SettingItem(SettingItem {
5054            title: "Show Edit Predictions",
5055            description: "Controls whether edit predictions are shown immediately (true) or manually by triggering `editor::ShowEditPrediction` (false)",
5056            field: Box::new(SettingField {
5057                pick: |settings_content| {
5058                    language_settings_field(settings_content, |language| {
5059                        &language.show_edit_predictions
5060                    })
5061                },
5062                pick_mut: |settings_content| {
5063                    language_settings_field_mut(settings_content, |language| {
5064                        &mut language.show_edit_predictions
5065                    })
5066                },
5067            }),
5068            metadata: None,
5069            files: USER | LOCAL,
5070        }),
5071        SettingsPageItem::SettingItem(SettingItem {
5072            title: "Edit Predictions Disabled In",
5073            description: "Controls whether edit predictions are shown in the given language scopes",
5074            field: Box::new(
5075                SettingField {
5076                    pick: |settings_content| {
5077                        language_settings_field(settings_content, |language| {
5078                            &language.edit_predictions_disabled_in
5079                        })
5080                    },
5081                    pick_mut: |settings_content| {
5082                        language_settings_field_mut(settings_content, |language| {
5083                            &mut language.edit_predictions_disabled_in
5084                        })
5085                    },
5086                }
5087                .unimplemented(),
5088            ),
5089            metadata: None,
5090            files: USER | LOCAL,
5091        }),
5092        SettingsPageItem::SectionHeader("Whitespace"),
5093        SettingsPageItem::SettingItem(SettingItem {
5094            title: "Show Whitespaces",
5095            description: "Whether to show tabs and spaces in the editor",
5096            field: Box::new(SettingField {
5097                pick: |settings_content| {
5098                    language_settings_field(settings_content, |language| &language.show_whitespaces)
5099                },
5100                pick_mut: |settings_content| {
5101                    language_settings_field_mut(settings_content, |language| {
5102                        &mut language.show_whitespaces
5103                    })
5104                },
5105            }),
5106            metadata: None,
5107            files: USER | LOCAL,
5108        }),
5109        SettingsPageItem::SettingItem(SettingItem {
5110            title: "Space Whitespace Indicator",
5111            description: "Visible character used to render space characters when show_whitespaces is enabled (default: \"\")",
5112            field: Box::new(
5113                SettingField {
5114                    pick: |settings_content| {
5115                        language_settings_field(settings_content, |language| {
5116                            if let Some(whitespace_map) = &language.whitespace_map {
5117                                &whitespace_map.space
5118                            } else {
5119                                &None
5120                            }
5121                        })
5122                    },
5123                    pick_mut: |settings_content| {
5124                        language_settings_field_mut(settings_content, |language| {
5125                            &mut language.whitespace_map.get_or_insert_default().space
5126                        })
5127                    },
5128                }
5129                .unimplemented(),
5130            ),
5131            metadata: None,
5132            files: USER | LOCAL,
5133        }),
5134        SettingsPageItem::SettingItem(SettingItem {
5135            title: "Tab Whitespace Indicator",
5136            description: "Visible character used to render tab characters when show_whitespaces is enabled (default: \"\")",
5137            field: Box::new(
5138                SettingField {
5139                    pick: |settings_content| {
5140                        language_settings_field(settings_content, |language| {
5141                            if let Some(whitespace_map) = &language.whitespace_map {
5142                                &whitespace_map.tab
5143                            } else {
5144                                &None
5145                            }
5146                        })
5147                    },
5148                    pick_mut: |settings_content| {
5149                        language_settings_field_mut(settings_content, |language| {
5150                            &mut language.whitespace_map.get_or_insert_default().tab
5151                        })
5152                    },
5153                }
5154                .unimplemented(),
5155            ),
5156            metadata: None,
5157            files: USER | LOCAL,
5158        }),
5159        SettingsPageItem::SectionHeader("Completions"),
5160        SettingsPageItem::SettingItem(SettingItem {
5161            title: "Show Completions On Input",
5162            description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
5163            field: Box::new(SettingField {
5164                pick: |settings_content| {
5165                    language_settings_field(settings_content, |language| {
5166                        &language.show_completions_on_input
5167                    })
5168                },
5169                pick_mut: |settings_content| {
5170                    language_settings_field_mut(settings_content, |language| {
5171                        &mut language.show_completions_on_input
5172                    })
5173                },
5174            }),
5175            metadata: None,
5176            files: USER | LOCAL,
5177        }),
5178        SettingsPageItem::SettingItem(SettingItem {
5179            title: "Show Completion Documentation",
5180            description: "Whether to display inline and alongside documentation for items in the completions menu",
5181            field: Box::new(SettingField {
5182                pick: |settings_content| {
5183                    language_settings_field(settings_content, |language| {
5184                        &language.show_completion_documentation
5185                    })
5186                },
5187                pick_mut: |settings_content| {
5188                    language_settings_field_mut(settings_content, |language| {
5189                        &mut language.show_completion_documentation
5190                    })
5191                },
5192            }),
5193            metadata: None,
5194            files: USER | LOCAL,
5195        }),
5196        SettingsPageItem::SettingItem(SettingItem {
5197            title: "Words",
5198            description: "Controls how words are completed",
5199            field: Box::new(SettingField {
5200                pick: |settings_content| {
5201                    language_settings_field(settings_content, |language| {
5202                        if let Some(completions) = &language.completions {
5203                            &completions.words
5204                        } else {
5205                            &None
5206                        }
5207                    })
5208                },
5209                pick_mut: |settings_content| {
5210                    language_settings_field_mut(settings_content, |language| {
5211                        &mut language.completions.get_or_insert_default().words
5212                    })
5213                },
5214            }),
5215            metadata: None,
5216            files: USER | LOCAL,
5217        }),
5218        SettingsPageItem::SettingItem(SettingItem {
5219            title: "Words Min Length",
5220            description: "How many characters has to be in the completions query to automatically show the words-based completions",
5221            field: Box::new(SettingField {
5222                pick: |settings_content| {
5223                    language_settings_field(settings_content, |language| {
5224                        if let Some(completions) = &language.completions {
5225                            &completions.words_min_length
5226                        } else {
5227                            &None
5228                        }
5229                    })
5230                },
5231                pick_mut: |settings_content| {
5232                    language_settings_field_mut(settings_content, |language| {
5233                        &mut language
5234                            .completions
5235                            .get_or_insert_default()
5236                            .words_min_length
5237                    })
5238                },
5239            }),
5240            metadata: None,
5241            files: USER | LOCAL,
5242        }),
5243        SettingsPageItem::SettingItem(SettingItem {
5244            title: "Lsp",
5245            description: "Whether to fetch LSP completions or not",
5246            field: Box::new(SettingField {
5247                pick: |settings_content| {
5248                    language_settings_field(settings_content, |language| {
5249                        if let Some(completions) = &language.completions {
5250                            &completions.lsp
5251                        } else {
5252                            &None
5253                        }
5254                    })
5255                },
5256                pick_mut: |settings_content| {
5257                    language_settings_field_mut(settings_content, |language| {
5258                        &mut language.completions.get_or_insert_default().lsp
5259                    })
5260                },
5261            }),
5262            metadata: None,
5263            files: USER | LOCAL,
5264        }),
5265        SettingsPageItem::SettingItem(SettingItem {
5266            title: "Lsp Fetch Timeout Ms",
5267            description: "When fetching LSP completions, determines how long to wait for a response of a particular server (set to 0 to wait indefinitely)",
5268            field: Box::new(SettingField {
5269                pick: |settings_content| {
5270                    language_settings_field(settings_content, |language| {
5271                        if let Some(completions) = &language.completions {
5272                            &completions.lsp_fetch_timeout_ms
5273                        } else {
5274                            &None
5275                        }
5276                    })
5277                },
5278                pick_mut: |settings_content| {
5279                    language_settings_field_mut(settings_content, |language| {
5280                        &mut language
5281                            .completions
5282                            .get_or_insert_default()
5283                            .lsp_fetch_timeout_ms
5284                    })
5285                },
5286            }),
5287            metadata: None,
5288            files: USER | LOCAL,
5289        }),
5290        SettingsPageItem::SettingItem(SettingItem {
5291            title: "Lsp Insert Mode",
5292            description: "Controls how LSP completions are inserted",
5293            field: Box::new(SettingField {
5294                pick: |settings_content| {
5295                    language_settings_field(settings_content, |language| {
5296                        if let Some(completions) = &language.completions {
5297                            &completions.lsp_insert_mode
5298                        } else {
5299                            &None
5300                        }
5301                    })
5302                },
5303                pick_mut: |settings_content| {
5304                    language_settings_field_mut(settings_content, |language| {
5305                        &mut language.completions.get_or_insert_default().lsp_insert_mode
5306                    })
5307                },
5308            }),
5309            metadata: None,
5310            files: USER | LOCAL,
5311        }),
5312        SettingsPageItem::SectionHeader("Inlay Hints"),
5313        SettingsPageItem::SettingItem(SettingItem {
5314            title: "Enabled",
5315            description: "Global switch to toggle hints on and off",
5316            field: Box::new(SettingField {
5317                pick: |settings_content| {
5318                    language_settings_field(settings_content, |language| {
5319                        if let Some(inlay_hints) = &language.inlay_hints {
5320                            &inlay_hints.enabled
5321                        } else {
5322                            &None
5323                        }
5324                    })
5325                },
5326                pick_mut: |settings_content| {
5327                    language_settings_field_mut(settings_content, |language| {
5328                        &mut language.inlay_hints.get_or_insert_default().enabled
5329                    })
5330                },
5331            }),
5332            metadata: None,
5333            files: USER | LOCAL,
5334        }),
5335        SettingsPageItem::SettingItem(SettingItem {
5336            title: "Show Value Hints",
5337            description: "Global switch to toggle inline values on and off when debugging",
5338            field: Box::new(SettingField {
5339                pick: |settings_content| {
5340                    language_settings_field(settings_content, |language| {
5341                        if let Some(inlay_hints) = &language.inlay_hints {
5342                            &inlay_hints.show_value_hints
5343                        } else {
5344                            &None
5345                        }
5346                    })
5347                },
5348                pick_mut: |settings_content| {
5349                    language_settings_field_mut(settings_content, |language| {
5350                        &mut language
5351                            .inlay_hints
5352                            .get_or_insert_default()
5353                            .show_value_hints
5354                    })
5355                },
5356            }),
5357            metadata: None,
5358            files: USER | LOCAL,
5359        }),
5360        SettingsPageItem::SettingItem(SettingItem {
5361            title: "Show Type Hints",
5362            description: "Whether type hints should be shown",
5363            field: Box::new(SettingField {
5364                pick: |settings_content| {
5365                    language_settings_field(settings_content, |language| {
5366                        if let Some(inlay_hints) = &language.inlay_hints {
5367                            &inlay_hints.show_type_hints
5368                        } else {
5369                            &None
5370                        }
5371                    })
5372                },
5373                pick_mut: |settings_content| {
5374                    language_settings_field_mut(settings_content, |language| {
5375                        &mut language.inlay_hints.get_or_insert_default().show_type_hints
5376                    })
5377                },
5378            }),
5379            metadata: None,
5380            files: USER | LOCAL,
5381        }),
5382        SettingsPageItem::SettingItem(SettingItem {
5383            title: "Show Parameter Hints",
5384            description: "Whether parameter hints should be shown",
5385            field: Box::new(SettingField {
5386                pick: |settings_content| {
5387                    language_settings_field(settings_content, |language| {
5388                        if let Some(inlay_hints) = &language.inlay_hints {
5389                            &inlay_hints.show_parameter_hints
5390                        } else {
5391                            &None
5392                        }
5393                    })
5394                },
5395                pick_mut: |settings_content| {
5396                    language_settings_field_mut(settings_content, |language| {
5397                        &mut language
5398                            .inlay_hints
5399                            .get_or_insert_default()
5400                            .show_parameter_hints
5401                    })
5402                },
5403            }),
5404            metadata: None,
5405            files: USER | LOCAL,
5406        }),
5407        SettingsPageItem::SettingItem(SettingItem {
5408            title: "Show Other Hints",
5409            description: "Whether other hints should be shown",
5410            field: Box::new(SettingField {
5411                pick: |settings_content| {
5412                    language_settings_field(settings_content, |language| {
5413                        if let Some(inlay_hints) = &language.inlay_hints {
5414                            &inlay_hints.show_other_hints
5415                        } else {
5416                            &None
5417                        }
5418                    })
5419                },
5420                pick_mut: |settings_content| {
5421                    language_settings_field_mut(settings_content, |language| {
5422                        &mut language
5423                            .inlay_hints
5424                            .get_or_insert_default()
5425                            .show_other_hints
5426                    })
5427                },
5428            }),
5429            metadata: None,
5430            files: USER | LOCAL,
5431        }),
5432        SettingsPageItem::SettingItem(SettingItem {
5433            title: "Show Background",
5434            description: "Show a background for inlay hints",
5435            field: Box::new(SettingField {
5436                pick: |settings_content| {
5437                    language_settings_field(settings_content, |language| {
5438                        if let Some(inlay_hints) = &language.inlay_hints {
5439                            &inlay_hints.show_background
5440                        } else {
5441                            &None
5442                        }
5443                    })
5444                },
5445                pick_mut: |settings_content| {
5446                    language_settings_field_mut(settings_content, |language| {
5447                        &mut language.inlay_hints.get_or_insert_default().show_background
5448                    })
5449                },
5450            }),
5451            metadata: None,
5452            files: USER | LOCAL,
5453        }),
5454        SettingsPageItem::SettingItem(SettingItem {
5455            title: "Edit Debounce Ms",
5456            description: "Whether or not to debounce inlay hints updates after buffer edits (set to 0 to disable debouncing)",
5457            field: Box::new(SettingField {
5458                pick: |settings_content| {
5459                    language_settings_field(settings_content, |language| {
5460                        if let Some(inlay_hints) = &language.inlay_hints {
5461                            &inlay_hints.edit_debounce_ms
5462                        } else {
5463                            &None
5464                        }
5465                    })
5466                },
5467                pick_mut: |settings_content| {
5468                    language_settings_field_mut(settings_content, |language| {
5469                        &mut language
5470                            .inlay_hints
5471                            .get_or_insert_default()
5472                            .edit_debounce_ms
5473                    })
5474                },
5475            }),
5476            metadata: None,
5477            files: USER | LOCAL,
5478        }),
5479        SettingsPageItem::SettingItem(SettingItem {
5480            title: "Scroll Debounce Ms",
5481            description: "Whether or not to debounce inlay hints updates after buffer scrolls (set to 0 to disable debouncing)",
5482            field: Box::new(SettingField {
5483                pick: |settings_content| {
5484                    language_settings_field(settings_content, |language| {
5485                        if let Some(inlay_hints) = &language.inlay_hints {
5486                            &inlay_hints.scroll_debounce_ms
5487                        } else {
5488                            &None
5489                        }
5490                    })
5491                },
5492                pick_mut: |settings_content| {
5493                    language_settings_field_mut(settings_content, |language| {
5494                        &mut language
5495                            .inlay_hints
5496                            .get_or_insert_default()
5497                            .scroll_debounce_ms
5498                    })
5499                },
5500            }),
5501            metadata: None,
5502            files: USER | LOCAL,
5503        }),
5504        SettingsPageItem::SettingItem(SettingItem {
5505            title: "Toggle On Modifiers Press",
5506            description: "Toggles inlay hints (hides or shows) when the user presses the modifiers specified",
5507            field: Box::new(
5508                SettingField {
5509                    pick: |settings_content| {
5510                        language_settings_field(settings_content, |language| {
5511                            if let Some(inlay_hints) = &language.inlay_hints {
5512                                &inlay_hints.toggle_on_modifiers_press
5513                            } else {
5514                                &None
5515                            }
5516                        })
5517                    },
5518                    pick_mut: |settings_content| {
5519                        language_settings_field_mut(settings_content, |language| {
5520                            &mut language
5521                                .inlay_hints
5522                                .get_or_insert_default()
5523                                .toggle_on_modifiers_press
5524                        })
5525                    },
5526                }
5527                .unimplemented(),
5528            ),
5529            metadata: None,
5530            files: USER | LOCAL,
5531        }),
5532        SettingsPageItem::SectionHeader("Tasks"),
5533        SettingsPageItem::SettingItem(SettingItem {
5534            title: "Enabled",
5535            description: "Whether tasks are enabled for this language",
5536            field: Box::new(SettingField {
5537                pick: |settings_content| {
5538                    language_settings_field(settings_content, |language| {
5539                        if let Some(tasks) = &language.tasks {
5540                            &tasks.enabled
5541                        } else {
5542                            &None
5543                        }
5544                    })
5545                },
5546                pick_mut: |settings_content| {
5547                    language_settings_field_mut(settings_content, |language| {
5548                        &mut language.tasks.get_or_insert_default().enabled
5549                    })
5550                },
5551            }),
5552            metadata: None,
5553            files: USER | LOCAL,
5554        }),
5555        SettingsPageItem::SettingItem(SettingItem {
5556            title: "Variables",
5557            description: "Extra task variables to set for a particular language",
5558            field: Box::new(
5559                SettingField {
5560                    pick: |settings_content| {
5561                        language_settings_field(settings_content, |language| {
5562                            if let Some(tasks) = &language.tasks {
5563                                &tasks.variables
5564                            } else {
5565                                &None
5566                            }
5567                        })
5568                    },
5569                    pick_mut: |settings_content| {
5570                        language_settings_field_mut(settings_content, |language| {
5571                            &mut language.tasks.get_or_insert_default().variables
5572                        })
5573                    },
5574                }
5575                .unimplemented(),
5576            ),
5577            metadata: None,
5578            files: USER | LOCAL,
5579        }),
5580        SettingsPageItem::SettingItem(SettingItem {
5581            title: "Prefer Lsp",
5582            description: "Use LSP tasks over Zed language extension ones",
5583            field: Box::new(SettingField {
5584                pick: |settings_content| {
5585                    language_settings_field(settings_content, |language| {
5586                        if let Some(tasks) = &language.tasks {
5587                            &tasks.prefer_lsp
5588                        } else {
5589                            &None
5590                        }
5591                    })
5592                },
5593                pick_mut: |settings_content| {
5594                    language_settings_field_mut(settings_content, |language| {
5595                        &mut language.tasks.get_or_insert_default().prefer_lsp
5596                    })
5597                },
5598            }),
5599            metadata: None,
5600            files: USER | LOCAL,
5601        }),
5602        SettingsPageItem::SectionHeader("Miscellaneous"),
5603        SettingsPageItem::SettingItem(SettingItem {
5604            title: "Debuggers",
5605            description: "Preferred debuggers for this language",
5606            field: Box::new(
5607                SettingField {
5608                    pick: |settings_content| {
5609                        language_settings_field(settings_content, |language| &language.debuggers)
5610                    },
5611                    pick_mut: |settings_content| {
5612                        language_settings_field_mut(settings_content, |language| {
5613                            &mut language.debuggers
5614                        })
5615                    },
5616                }
5617                .unimplemented(),
5618            ),
5619            metadata: None,
5620            files: USER | LOCAL,
5621        }),
5622        SettingsPageItem::SettingItem(SettingItem {
5623            title: "Middle Click Paste",
5624            description: "Enable middle-click paste on Linux",
5625            field: Box::new(SettingField {
5626                pick: |settings_content| &settings_content.editor.middle_click_paste,
5627                pick_mut: |settings_content| &mut settings_content.editor.middle_click_paste,
5628            }),
5629            metadata: None,
5630            files: USER,
5631        }),
5632        SettingsPageItem::SettingItem(SettingItem {
5633            title: "Extend Comment On Newline",
5634            description: "Whether to start a new line with a comment when a previous line is a comment as well",
5635            field: Box::new(SettingField {
5636                pick: |settings_content| {
5637                    language_settings_field(settings_content, |language| {
5638                        &language.extend_comment_on_newline
5639                    })
5640                },
5641                pick_mut: |settings_content| {
5642                    language_settings_field_mut(settings_content, |language| {
5643                        &mut language.extend_comment_on_newline
5644                    })
5645                },
5646            }),
5647            metadata: None,
5648            files: USER | LOCAL,
5649        }),
5650    ]
5651}