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