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(
1628                            language_settings_data().iter().enumerate(),
1629                            None,
1630                            window,
1631                            cx,
1632                        )
1633                        .into_any_element()
1634                    }),
1635                }),
1636                SettingsPageItem::SubPageLink(SubPageLink {
1637                    title: "JSONC",
1638                    files: USER | LOCAL,
1639                    render: Arc::new(|this, window, cx| {
1640                        this.render_page_items(
1641                            language_settings_data().iter().enumerate(),
1642                            None,
1643                            window,
1644                            cx,
1645                        )
1646                        .into_any_element()
1647                    }),
1648                }),
1649                SettingsPageItem::SubPageLink(SubPageLink {
1650                    title: "Rust",
1651                    files: USER | LOCAL,
1652                    render: Arc::new(|this, window, cx| {
1653                        this.render_page_items(
1654                            language_settings_data().iter().enumerate(),
1655                            None,
1656                            window,
1657                            cx,
1658                        )
1659                        .into_any_element()
1660                    }),
1661                }),
1662                SettingsPageItem::SubPageLink(SubPageLink {
1663                    title: "Python",
1664                    files: USER | LOCAL,
1665                    render: Arc::new(|this, window, cx| {
1666                        this.render_page_items(
1667                            language_settings_data().iter().enumerate(),
1668                            None,
1669                            window,
1670                            cx,
1671                        )
1672                        .into_any_element()
1673                    }),
1674                }),
1675                SettingsPageItem::SubPageLink(SubPageLink {
1676                    title: "TSX",
1677                    files: USER | LOCAL,
1678                    render: Arc::new(|this, window, cx| {
1679                        this.render_page_items(
1680                            language_settings_data().iter().enumerate(),
1681                            None,
1682                            window,
1683                            cx,
1684                        )
1685                        .into_any_element()
1686                    }),
1687                }),
1688            ],
1689        },
1690        SettingsPage {
1691            title: "Workbench & Window",
1692            items: vec![
1693                SettingsPageItem::SectionHeader("Status Bar"),
1694                SettingsPageItem::SettingItem(SettingItem {
1695                    title: "Project Panel Button",
1696                    description: "Whether to show the project panel button in the status bar",
1697                    field: Box::new(SettingField {
1698                        pick: |settings_content| {
1699                            if let Some(project_panel) = &settings_content.project_panel {
1700                                &project_panel.button
1701                            } else {
1702                                &None
1703                            }
1704                        },
1705                        pick_mut: |settings_content| {
1706                            &mut settings_content
1707                                .project_panel
1708                                .get_or_insert_default()
1709                                .button
1710                        },
1711                    }),
1712                    metadata: None,
1713                    files: USER,
1714                }),
1715                SettingsPageItem::SettingItem(SettingItem {
1716                    title: "Active Language Button",
1717                    description: "Whether to show the active language button in the status bar",
1718                    field: Box::new(SettingField {
1719                        pick: |settings_content| {
1720                            if let Some(status_bar) = &settings_content.status_bar {
1721                                &status_bar.active_language_button
1722                            } else {
1723                                &None
1724                            }
1725                        },
1726                        pick_mut: |settings_content| {
1727                            &mut settings_content
1728                                .status_bar
1729                                .get_or_insert_default()
1730                                .active_language_button
1731                        },
1732                    }),
1733                    metadata: None,
1734                    files: USER,
1735                }),
1736                SettingsPageItem::SettingItem(SettingItem {
1737                    title: "Cursor Position Button",
1738                    description: "Whether to show the cursor position button in the status bar",
1739                    field: Box::new(SettingField {
1740                        pick: |settings_content| {
1741                            if let Some(status_bar) = &settings_content.status_bar {
1742                                &status_bar.cursor_position_button
1743                            } else {
1744                                &None
1745                            }
1746                        },
1747                        pick_mut: |settings_content| {
1748                            &mut settings_content
1749                                .status_bar
1750                                .get_or_insert_default()
1751                                .cursor_position_button
1752                        },
1753                    }),
1754                    metadata: None,
1755                    files: USER,
1756                }),
1757                SettingsPageItem::SettingItem(SettingItem {
1758                    title: "Terminal Button",
1759                    description: "Whether to show the terminal button in the status bar",
1760                    field: Box::new(SettingField {
1761                        pick: |settings_content| {
1762                            if let Some(terminal) = &settings_content.terminal {
1763                                &terminal.button
1764                            } else {
1765                                &None
1766                            }
1767                        },
1768                        pick_mut: |settings_content| {
1769                            &mut settings_content.terminal.get_or_insert_default().button
1770                        },
1771                    }),
1772                    metadata: None,
1773                    files: USER,
1774                }),
1775                SettingsPageItem::SettingItem(SettingItem {
1776                    title: "Diagnostics Button",
1777                    description: "Whether to show the project diagnostics button in the status bar",
1778                    field: Box::new(SettingField {
1779                        pick: |settings_content| {
1780                            if let Some(diagnostics) = &settings_content.diagnostics {
1781                                &diagnostics.button
1782                            } else {
1783                                &None
1784                            }
1785                        },
1786                        pick_mut: |settings_content| {
1787                            &mut settings_content.diagnostics.get_or_insert_default().button
1788                        },
1789                    }),
1790                    metadata: None,
1791                    files: USER,
1792                }),
1793                SettingsPageItem::SettingItem(SettingItem {
1794                    title: "Project Search Button",
1795                    description: "Whether to show the project search button in the status bar",
1796                    field: Box::new(SettingField {
1797                        pick: |settings_content| {
1798                            if let Some(search) = &settings_content.editor.search {
1799                                &search.button
1800                            } else {
1801                                &None
1802                            }
1803                        },
1804                        pick_mut: |settings_content| {
1805                            &mut settings_content
1806                                .editor
1807                                .search
1808                                .get_or_insert_default()
1809                                .button
1810                        },
1811                    }),
1812                    metadata: None,
1813                    files: USER,
1814                }),
1815                SettingsPageItem::SettingItem(SettingItem {
1816                    title: "Debugger Button",
1817                    description: "Whether to show the debugger button in the status bar",
1818                    field: Box::new(SettingField {
1819                        pick: |settings_content| {
1820                            if let Some(debugger) = &settings_content.debugger {
1821                                &debugger.button
1822                            } else {
1823                                &None
1824                            }
1825                        },
1826                        pick_mut: |settings_content| {
1827                            &mut settings_content.debugger.get_or_insert_default().button
1828                        },
1829                    }),
1830                    metadata: None,
1831                    files: USER,
1832                }),
1833                SettingsPageItem::SectionHeader("Tab Bar"),
1834                SettingsPageItem::SettingItem(SettingItem {
1835                    title: "Editor Tabs",
1836                    description: "Whether or not to show the tab bar in the editor",
1837                    field: Box::new(SettingField {
1838                        pick: |settings_content| {
1839                            if let Some(tab_bar) = &settings_content.tab_bar {
1840                                &tab_bar.show
1841                            } else {
1842                                &None
1843                            }
1844                        },
1845                        pick_mut: |settings_content| {
1846                            &mut settings_content.tab_bar.get_or_insert_default().show
1847                        },
1848                    }),
1849                    metadata: None,
1850                    files: USER,
1851                }),
1852                SettingsPageItem::SettingItem(SettingItem {
1853                    title: "Show Navigation History Buttons",
1854                    description: "Whether or not to show the navigation history buttons in the tab bar",
1855                    field: Box::new(SettingField {
1856                        pick: |settings_content| {
1857                            if let Some(tab_bar) = &settings_content.tab_bar {
1858                                &tab_bar.show_nav_history_buttons
1859                            } else {
1860                                &None
1861                            }
1862                        },
1863                        pick_mut: |settings_content| {
1864                            &mut settings_content
1865                                .tab_bar
1866                                .get_or_insert_default()
1867                                .show_nav_history_buttons
1868                        },
1869                    }),
1870                    metadata: None,
1871                    files: USER,
1872                }),
1873                SettingsPageItem::SectionHeader("Title Bar"),
1874                SettingsPageItem::SettingItem(SettingItem {
1875                    title: "Show Branch Icon",
1876                    description: "Whether to show the branch icon beside branch switcher in the titlebar",
1877                    field: Box::new(SettingField {
1878                        pick: |settings_content| {
1879                            if let Some(title_bar) = &settings_content.title_bar {
1880                                &title_bar.show_branch_icon
1881                            } else {
1882                                &None
1883                            }
1884                        },
1885                        pick_mut: |settings_content| {
1886                            &mut settings_content
1887                                .title_bar
1888                                .get_or_insert_default()
1889                                .show_branch_icon
1890                        },
1891                    }),
1892                    metadata: None,
1893                    files: USER,
1894                }),
1895                SettingsPageItem::SettingItem(SettingItem {
1896                    title: "Show Branch Name",
1897                    description: "Whether to show the branch name button in the titlebar",
1898                    field: Box::new(SettingField {
1899                        pick: |settings_content| {
1900                            if let Some(title_bar) = &settings_content.title_bar {
1901                                &title_bar.show_branch_name
1902                            } else {
1903                                &None
1904                            }
1905                        },
1906                        pick_mut: |settings_content| {
1907                            &mut settings_content
1908                                .title_bar
1909                                .get_or_insert_default()
1910                                .show_branch_name
1911                        },
1912                    }),
1913                    metadata: None,
1914                    files: USER,
1915                }),
1916                SettingsPageItem::SettingItem(SettingItem {
1917                    title: "Show Project Items",
1918                    description: "Whether to show the project host and name in the titlebar",
1919                    field: Box::new(SettingField {
1920                        pick: |settings_content| {
1921                            if let Some(title_bar) = &settings_content.title_bar {
1922                                &title_bar.show_project_items
1923                            } else {
1924                                &None
1925                            }
1926                        },
1927                        pick_mut: |settings_content| {
1928                            &mut settings_content
1929                                .title_bar
1930                                .get_or_insert_default()
1931                                .show_project_items
1932                        },
1933                    }),
1934                    metadata: None,
1935                    files: USER,
1936                }),
1937                SettingsPageItem::SettingItem(SettingItem {
1938                    title: "Show Onboarding Banner",
1939                    description: "Whether to show banners announcing new features in the titlebar",
1940                    field: Box::new(SettingField {
1941                        pick: |settings_content| {
1942                            if let Some(title_bar) = &settings_content.title_bar {
1943                                &title_bar.show_onboarding_banner
1944                            } else {
1945                                &None
1946                            }
1947                        },
1948                        pick_mut: |settings_content| {
1949                            &mut settings_content
1950                                .title_bar
1951                                .get_or_insert_default()
1952                                .show_onboarding_banner
1953                        },
1954                    }),
1955                    metadata: None,
1956                    files: USER,
1957                }),
1958                SettingsPageItem::SettingItem(SettingItem {
1959                    title: "Show User Picture",
1960                    description: "Whether to show user picture in the titlebar",
1961                    field: Box::new(SettingField {
1962                        pick: |settings_content| {
1963                            if let Some(title_bar) = &settings_content.title_bar {
1964                                &title_bar.show_user_picture
1965                            } else {
1966                                &None
1967                            }
1968                        },
1969                        pick_mut: |settings_content| {
1970                            &mut settings_content
1971                                .title_bar
1972                                .get_or_insert_default()
1973                                .show_user_picture
1974                        },
1975                    }),
1976                    metadata: None,
1977                    files: USER,
1978                }),
1979                SettingsPageItem::SettingItem(SettingItem {
1980                    title: "Show Sign In",
1981                    description: "Whether to show the sign in button in the titlebar",
1982                    field: Box::new(SettingField {
1983                        pick: |settings_content| {
1984                            if let Some(title_bar) = &settings_content.title_bar {
1985                                &title_bar.show_sign_in
1986                            } else {
1987                                &None
1988                            }
1989                        },
1990                        pick_mut: |settings_content| {
1991                            &mut settings_content
1992                                .title_bar
1993                                .get_or_insert_default()
1994                                .show_sign_in
1995                        },
1996                    }),
1997                    metadata: None,
1998                    files: USER,
1999                }),
2000                SettingsPageItem::SettingItem(SettingItem {
2001                    title: "Show Menus",
2002                    description: "Whether to show the menus in the titlebar",
2003                    field: Box::new(SettingField {
2004                        pick: |settings_content| {
2005                            if let Some(title_bar) = &settings_content.title_bar {
2006                                &title_bar.show_menus
2007                            } else {
2008                                &None
2009                            }
2010                        },
2011                        pick_mut: |settings_content| {
2012                            &mut settings_content
2013                                .title_bar
2014                                .get_or_insert_default()
2015                                .show_menus
2016                        },
2017                    }),
2018                    metadata: None,
2019                    files: USER,
2020                }),
2021                SettingsPageItem::SectionHeader("Tab Settings"),
2022                SettingsPageItem::SettingItem(SettingItem {
2023                    title: "Activate On Close",
2024                    description: "What to do after closing the current tab",
2025                    field: Box::new(SettingField {
2026                        pick: |settings_content| {
2027                            if let Some(tabs) = &settings_content.tabs {
2028                                &tabs.activate_on_close
2029                            } else {
2030                                &None
2031                            }
2032                        },
2033                        pick_mut: |settings_content| {
2034                            &mut settings_content
2035                                .tabs
2036                                .get_or_insert_default()
2037                                .activate_on_close
2038                        },
2039                    }),
2040                    metadata: None,
2041                    files: USER,
2042                }),
2043                SettingsPageItem::SettingItem(SettingItem {
2044                    title: "Tab Show Diagnostics",
2045                    description: "Which files containing diagnostic errors/warnings to mark in the tabs",
2046                    field: Box::new(SettingField {
2047                        pick: |settings_content| {
2048                            if let Some(tabs) = &settings_content.tabs {
2049                                &tabs.show_diagnostics
2050                            } else {
2051                                &None
2052                            }
2053                        },
2054                        pick_mut: |settings_content| {
2055                            &mut settings_content
2056                                .tabs
2057                                .get_or_insert_default()
2058                                .show_diagnostics
2059                        },
2060                    }),
2061                    metadata: None,
2062                    files: USER,
2063                }),
2064                SettingsPageItem::SettingItem(SettingItem {
2065                    title: "Show Close Button",
2066                    description: "Controls the appearance behavior of the tab's close button",
2067                    field: Box::new(SettingField {
2068                        pick: |settings_content| {
2069                            if let Some(tabs) = &settings_content.tabs {
2070                                &tabs.show_close_button
2071                            } else {
2072                                &None
2073                            }
2074                        },
2075                        pick_mut: |settings_content| {
2076                            &mut settings_content
2077                                .tabs
2078                                .get_or_insert_default()
2079                                .show_close_button
2080                        },
2081                    }),
2082                    metadata: None,
2083                    files: USER,
2084                }),
2085                SettingsPageItem::SectionHeader("Preview Tabs"),
2086                SettingsPageItem::SettingItem(SettingItem {
2087                    title: "Preview Tabs Enabled",
2088                    description: "Whether to show opened editors as preview tabs",
2089                    field: Box::new(SettingField {
2090                        pick: |settings_content| {
2091                            if let Some(preview_tabs) = &settings_content.preview_tabs {
2092                                &preview_tabs.enabled
2093                            } else {
2094                                &None
2095                            }
2096                        },
2097                        pick_mut: |settings_content| {
2098                            &mut settings_content
2099                                .preview_tabs
2100                                .get_or_insert_default()
2101                                .enabled
2102                        },
2103                    }),
2104                    metadata: None,
2105                    files: USER,
2106                }),
2107                SettingsPageItem::SettingItem(SettingItem {
2108                    title: "Enable Preview From File Finder",
2109                    description: "Whether to open tabs in preview mode when selected from the file finder",
2110                    field: Box::new(SettingField {
2111                        pick: |settings_content| {
2112                            if let Some(preview_tabs) = &settings_content.preview_tabs {
2113                                &preview_tabs.enable_preview_from_file_finder
2114                            } else {
2115                                &None
2116                            }
2117                        },
2118                        pick_mut: |settings_content| {
2119                            &mut settings_content
2120                                .preview_tabs
2121                                .get_or_insert_default()
2122                                .enable_preview_from_file_finder
2123                        },
2124                    }),
2125                    metadata: None,
2126                    files: USER,
2127                }),
2128                SettingsPageItem::SettingItem(SettingItem {
2129                    title: "Enable Preview From Code Navigation",
2130                    description: "Whether a preview tab gets replaced when code navigation is used to navigate away from the tab",
2131                    field: Box::new(SettingField {
2132                        pick: |settings_content| {
2133                            if let Some(preview_tabs) = &settings_content.preview_tabs {
2134                                &preview_tabs.enable_preview_from_code_navigation
2135                            } else {
2136                                &None
2137                            }
2138                        },
2139                        pick_mut: |settings_content| {
2140                            &mut settings_content
2141                                .preview_tabs
2142                                .get_or_insert_default()
2143                                .enable_preview_from_code_navigation
2144                        },
2145                    }),
2146                    metadata: None,
2147                    files: USER,
2148                }),
2149                SettingsPageItem::SectionHeader("Search Settings"),
2150                SettingsPageItem::SettingItem(SettingItem {
2151                    title: "Whole Word",
2152                    description: "Whether to search for whole words by default",
2153                    field: Box::new(SettingField {
2154                        pick: |settings_content| {
2155                            if let Some(search) = &settings_content.editor.search {
2156                                &search.whole_word
2157                            } else {
2158                                &None
2159                            }
2160                        },
2161                        pick_mut: |settings_content| {
2162                            &mut settings_content
2163                                .editor
2164                                .search
2165                                .get_or_insert_default()
2166                                .whole_word
2167                        },
2168                    }),
2169                    metadata: None,
2170                    files: USER,
2171                }),
2172                SettingsPageItem::SettingItem(SettingItem {
2173                    title: "Case Sensitive",
2174                    description: "Whether to search case-sensitively by default",
2175                    field: Box::new(SettingField {
2176                        pick: |settings_content| {
2177                            if let Some(search) = &settings_content.editor.search {
2178                                &search.case_sensitive
2179                            } else {
2180                                &None
2181                            }
2182                        },
2183                        pick_mut: |settings_content| {
2184                            &mut settings_content
2185                                .editor
2186                                .search
2187                                .get_or_insert_default()
2188                                .case_sensitive
2189                        },
2190                    }),
2191                    metadata: None,
2192                    files: USER,
2193                }),
2194                SettingsPageItem::SettingItem(SettingItem {
2195                    title: "Include Ignored",
2196                    description: "Whether to include ignored files in search results by default",
2197                    field: Box::new(SettingField {
2198                        pick: |settings_content| {
2199                            if let Some(search) = &settings_content.editor.search {
2200                                &search.include_ignored
2201                            } else {
2202                                &None
2203                            }
2204                        },
2205                        pick_mut: |settings_content| {
2206                            &mut settings_content
2207                                .editor
2208                                .search
2209                                .get_or_insert_default()
2210                                .include_ignored
2211                        },
2212                    }),
2213                    metadata: None,
2214                    files: USER,
2215                }),
2216                SettingsPageItem::SettingItem(SettingItem {
2217                    title: "Regex",
2218                    description: "Whether to use regex search by default",
2219                    field: Box::new(SettingField {
2220                        pick: |settings_content| {
2221                            if let Some(search) = &settings_content.editor.search {
2222                                &search.regex
2223                            } else {
2224                                &None
2225                            }
2226                        },
2227                        pick_mut: |settings_content| {
2228                            &mut settings_content.editor.search.get_or_insert_default().regex
2229                        },
2230                    }),
2231                    metadata: None,
2232                    files: USER,
2233                }),
2234                SettingsPageItem::SectionHeader("File Finder"),
2235                SettingsPageItem::SettingItem(SettingItem {
2236                    title: "File Icons",
2237                    description: "Whether to show file icons in the file finder",
2238                    field: Box::new(SettingField {
2239                        pick: |settings_content| {
2240                            if let Some(file_finder) = &settings_content.file_finder {
2241                                &file_finder.file_icons
2242                            } else {
2243                                &None
2244                            }
2245                        },
2246                        pick_mut: |settings_content| {
2247                            &mut settings_content
2248                                .file_finder
2249                                .get_or_insert_default()
2250                                .file_icons
2251                        },
2252                    }),
2253                    metadata: None,
2254                    files: USER,
2255                }),
2256                SettingsPageItem::SettingItem(SettingItem {
2257                    title: "Modal Max Width",
2258                    description: "Determines how much space the file finder can take up in relation to the available window width",
2259                    field: Box::new(SettingField {
2260                        pick: |settings_content| {
2261                            if let Some(file_finder) = &settings_content.file_finder {
2262                                &file_finder.modal_max_width
2263                            } else {
2264                                &None
2265                            }
2266                        },
2267                        pick_mut: |settings_content| {
2268                            &mut settings_content
2269                                .file_finder
2270                                .get_or_insert_default()
2271                                .modal_max_width
2272                        },
2273                    }),
2274                    metadata: None,
2275                    files: USER,
2276                }),
2277                SettingsPageItem::SettingItem(SettingItem {
2278                    title: "Skip Focus For Active In Search",
2279                    description: "Whether the file finder should skip focus for the active file in search results",
2280                    field: Box::new(SettingField {
2281                        pick: |settings_content| {
2282                            if let Some(file_finder) = &settings_content.file_finder {
2283                                &file_finder.skip_focus_for_active_in_search
2284                            } else {
2285                                &None
2286                            }
2287                        },
2288                        pick_mut: |settings_content| {
2289                            &mut settings_content
2290                                .file_finder
2291                                .get_or_insert_default()
2292                                .skip_focus_for_active_in_search
2293                        },
2294                    }),
2295                    metadata: None,
2296                    files: USER,
2297                }),
2298                SettingsPageItem::SettingItem(SettingItem {
2299                    title: "Git Status",
2300                    description: "Whether to show the git status in the file finder",
2301                    field: Box::new(SettingField {
2302                        pick: |settings_content| {
2303                            if let Some(file_finder) = &settings_content.file_finder {
2304                                &file_finder.git_status
2305                            } else {
2306                                &None
2307                            }
2308                        },
2309                        pick_mut: |settings_content| {
2310                            &mut settings_content
2311                                .file_finder
2312                                .get_or_insert_default()
2313                                .git_status
2314                        },
2315                    }),
2316                    metadata: None,
2317                    files: USER,
2318                }),
2319                // todo: null by default
2320                SettingsPageItem::SettingItem(SettingItem {
2321                    title: "Include Ignored",
2322                    description: "Whether to use gitignored files when searching",
2323                    field: Box::new(
2324                        SettingField {
2325                            pick: |settings_content| {
2326                                if let Some(file_finder) = &settings_content.file_finder {
2327                                    &file_finder.include_ignored
2328                                } else {
2329                                    &None
2330                                }
2331                            },
2332                            pick_mut: |settings_content| {
2333                                &mut settings_content
2334                                    .file_finder
2335                                    .get_or_insert_default()
2336                                    .include_ignored
2337                            },
2338                        }
2339                        .unimplemented(),
2340                    ),
2341                    metadata: None,
2342                    files: USER,
2343                }),
2344            ],
2345        },
2346        SettingsPage {
2347            title: "Panels",
2348            items: vec![
2349                SettingsPageItem::SectionHeader("Project Panel"),
2350                SettingsPageItem::SettingItem(SettingItem {
2351                    title: "Project Panel Dock",
2352                    description: "Where to dock the project panel",
2353                    field: Box::new(SettingField {
2354                        pick: |settings_content| {
2355                            if let Some(project_panel) = &settings_content.project_panel {
2356                                &project_panel.dock
2357                            } else {
2358                                &None
2359                            }
2360                        },
2361                        pick_mut: |settings_content| {
2362                            &mut settings_content.project_panel.get_or_insert_default().dock
2363                        },
2364                    }),
2365                    metadata: None,
2366                    files: USER,
2367                }),
2368                SettingsPageItem::SettingItem(SettingItem {
2369                    title: "Project Panel Default Width",
2370                    description: "Default width of the project panel in pixels",
2371                    field: Box::new(SettingField {
2372                        pick: |settings_content| {
2373                            if let Some(project_panel) = &settings_content.project_panel {
2374                                &project_panel.default_width
2375                            } else {
2376                                &None
2377                            }
2378                        },
2379                        pick_mut: |settings_content| {
2380                            &mut settings_content
2381                                .project_panel
2382                                .get_or_insert_default()
2383                                .default_width
2384                        },
2385                    }),
2386                    metadata: None,
2387                    files: USER,
2388                }),
2389                SettingsPageItem::SettingItem(SettingItem {
2390                    title: "Hide .gitignore",
2391                    description: "Whether to hide the gitignore entries in the project panel",
2392                    field: Box::new(SettingField {
2393                        pick: |settings_content| {
2394                            if let Some(project_panel) = &settings_content.project_panel {
2395                                &project_panel.hide_gitignore
2396                            } else {
2397                                &None
2398                            }
2399                        },
2400                        pick_mut: |settings_content| {
2401                            &mut settings_content
2402                                .project_panel
2403                                .get_or_insert_default()
2404                                .hide_gitignore
2405                        },
2406                    }),
2407                    metadata: None,
2408                    files: USER,
2409                }),
2410                SettingsPageItem::SettingItem(SettingItem {
2411                    title: "Entry Spacing",
2412                    description: "Spacing between worktree entries in the project panel",
2413                    field: Box::new(SettingField {
2414                        pick: |settings_content| {
2415                            if let Some(project_panel) = &settings_content.project_panel {
2416                                &project_panel.entry_spacing
2417                            } else {
2418                                &None
2419                            }
2420                        },
2421                        pick_mut: |settings_content| {
2422                            &mut settings_content
2423                                .project_panel
2424                                .get_or_insert_default()
2425                                .entry_spacing
2426                        },
2427                    }),
2428                    metadata: None,
2429                    files: USER,
2430                }),
2431                SettingsPageItem::SettingItem(SettingItem {
2432                    title: "File Icons",
2433                    description: "Whether to show folder icons or chevrons for directories in the project panel",
2434                    field: Box::new(SettingField {
2435                        pick: |settings_content| {
2436                            if let Some(project_panel) = &settings_content.project_panel {
2437                                &project_panel.file_icons
2438                            } else {
2439                                &None
2440                            }
2441                        },
2442                        pick_mut: |settings_content| {
2443                            &mut settings_content
2444                                .project_panel
2445                                .get_or_insert_default()
2446                                .file_icons
2447                        },
2448                    }),
2449                    metadata: None,
2450                    files: USER,
2451                }),
2452                SettingsPageItem::SettingItem(SettingItem {
2453                    title: "Folder Icons",
2454                    description: "Whether to show folder icons or chevrons for directories in the project panel",
2455                    field: Box::new(SettingField {
2456                        pick: |settings_content| {
2457                            if let Some(project_panel) = &settings_content.project_panel {
2458                                &project_panel.folder_icons
2459                            } else {
2460                                &None
2461                            }
2462                        },
2463                        pick_mut: |settings_content| {
2464                            &mut settings_content
2465                                .project_panel
2466                                .get_or_insert_default()
2467                                .folder_icons
2468                        },
2469                    }),
2470                    metadata: None,
2471                    files: USER,
2472                }),
2473                SettingsPageItem::SettingItem(SettingItem {
2474                    title: "Git Status",
2475                    description: "Whether to show the git status in the project panel",
2476                    field: Box::new(SettingField {
2477                        pick: |settings_content| {
2478                            if let Some(project_panel) = &settings_content.project_panel {
2479                                &project_panel.git_status
2480                            } else {
2481                                &None
2482                            }
2483                        },
2484                        pick_mut: |settings_content| {
2485                            &mut settings_content
2486                                .project_panel
2487                                .get_or_insert_default()
2488                                .git_status
2489                        },
2490                    }),
2491                    metadata: None,
2492                    files: USER,
2493                }),
2494                SettingsPageItem::SettingItem(SettingItem {
2495                    title: "Indent Size",
2496                    description: "Amount of indentation for nested items",
2497                    field: Box::new(SettingField {
2498                        pick: |settings_content| {
2499                            if let Some(project_panel) = &settings_content.project_panel {
2500                                &project_panel.indent_size
2501                            } else {
2502                                &None
2503                            }
2504                        },
2505                        pick_mut: |settings_content| {
2506                            &mut settings_content
2507                                .project_panel
2508                                .get_or_insert_default()
2509                                .indent_size
2510                        },
2511                    }),
2512                    metadata: None,
2513                    files: USER,
2514                }),
2515                SettingsPageItem::SettingItem(SettingItem {
2516                    title: "Auto Reveal Entries",
2517                    description: "Whether to reveal it in the project panel automatically when a corresponding project entry becomes active",
2518                    field: Box::new(SettingField {
2519                        pick: |settings_content| {
2520                            if let Some(project_panel) = &settings_content.project_panel {
2521                                &project_panel.auto_reveal_entries
2522                            } else {
2523                                &None
2524                            }
2525                        },
2526                        pick_mut: |settings_content| {
2527                            &mut settings_content
2528                                .project_panel
2529                                .get_or_insert_default()
2530                                .auto_reveal_entries
2531                        },
2532                    }),
2533                    metadata: None,
2534                    files: USER,
2535                }),
2536                SettingsPageItem::SettingItem(SettingItem {
2537                    title: "Starts Open",
2538                    description: "Whether the project panel should open on startup",
2539                    field: Box::new(SettingField {
2540                        pick: |settings_content| {
2541                            if let Some(project_panel) = &settings_content.project_panel {
2542                                &project_panel.starts_open
2543                            } else {
2544                                &None
2545                            }
2546                        },
2547                        pick_mut: |settings_content| {
2548                            &mut settings_content
2549                                .project_panel
2550                                .get_or_insert_default()
2551                                .starts_open
2552                        },
2553                    }),
2554                    metadata: None,
2555                    files: USER,
2556                }),
2557                SettingsPageItem::SettingItem(SettingItem {
2558                    title: "Auto Fold Directories",
2559                    description: "Whether to fold directories automatically and show compact folders when a directory has only one subdirectory inside",
2560                    field: Box::new(SettingField {
2561                        pick: |settings_content| {
2562                            if let Some(project_panel) = &settings_content.project_panel {
2563                                &project_panel.auto_fold_dirs
2564                            } else {
2565                                &None
2566                            }
2567                        },
2568                        pick_mut: |settings_content| {
2569                            &mut settings_content
2570                                .project_panel
2571                                .get_or_insert_default()
2572                                .auto_fold_dirs
2573                        },
2574                    }),
2575                    metadata: None,
2576                    files: USER,
2577                }),
2578                SettingsPageItem::SettingItem(SettingItem {
2579                    title: "Scrollbar Show",
2580                    description: "When to show the scrollbar in the project panel",
2581                    field: Box::new(SettingField {
2582                        pick: |settings_content| {
2583                            if let Some(project_panel) = &settings_content.project_panel
2584                                && let Some(scrollbar) = &project_panel.scrollbar
2585                                && scrollbar.show.is_some()
2586                            {
2587                                &scrollbar.show
2588                            } else if let Some(scrollbar) = &settings_content.editor.scrollbar {
2589                                &scrollbar.show
2590                            } else {
2591                                &None
2592                            }
2593                        },
2594                        pick_mut: |settings_content| {
2595                            &mut settings_content
2596                                .project_panel
2597                                .get_or_insert_default()
2598                                .scrollbar
2599                                .get_or_insert_default()
2600                                .show
2601                        },
2602                    }),
2603                    metadata: None,
2604                    files: USER,
2605                }),
2606                SettingsPageItem::SettingItem(SettingItem {
2607                    title: "Show Diagnostics",
2608                    description: "Which files containing diagnostic errors/warnings to mark in the project panel",
2609                    field: Box::new(SettingField {
2610                        pick: |settings_content| {
2611                            if let Some(project_panel) = &settings_content.project_panel {
2612                                &project_panel.show_diagnostics
2613                            } else {
2614                                &None
2615                            }
2616                        },
2617                        pick_mut: |settings_content| {
2618                            &mut settings_content
2619                                .project_panel
2620                                .get_or_insert_default()
2621                                .show_diagnostics
2622                        },
2623                    }),
2624                    metadata: None,
2625                    files: USER,
2626                }),
2627                SettingsPageItem::SettingItem(SettingItem {
2628                    title: "Sticky Scroll",
2629                    description: "Whether to stick parent directories at top of the project panel",
2630                    field: Box::new(SettingField {
2631                        pick: |settings_content| {
2632                            if let Some(project_panel) = &settings_content.project_panel {
2633                                &project_panel.sticky_scroll
2634                            } else {
2635                                &None
2636                            }
2637                        },
2638                        pick_mut: |settings_content| {
2639                            &mut settings_content
2640                                .project_panel
2641                                .get_or_insert_default()
2642                                .sticky_scroll
2643                        },
2644                    }),
2645                    metadata: None,
2646                    files: USER,
2647                }),
2648                SettingsPageItem::SettingItem(SettingItem {
2649                    files: USER,
2650                    title: "Indent Guides Show",
2651                    description: "When to show indent guides in the project panel",
2652                    field: Box::new(
2653                        SettingField {
2654                            pick: |settings_content| {
2655                                if let Some(project_panel) = &settings_content.project_panel {
2656                                    if let Some(indent_guides) = &project_panel.indent_guides {
2657                                        &indent_guides.show
2658                                    } else {
2659                                        &None
2660                                    }
2661                                } else {
2662                                    &None
2663                                }
2664                            },
2665                            pick_mut: |settings_content| {
2666                                &mut settings_content
2667                                    .project_panel
2668                                    .get_or_insert_default()
2669                                    .indent_guides
2670                                    .get_or_insert_default()
2671                                    .show
2672                            },
2673                        }
2674                        .unimplemented(),
2675                    ),
2676                    metadata: None,
2677                }),
2678                SettingsPageItem::SettingItem(SettingItem {
2679                    title: "Drag and Drop",
2680                    description: "Whether to enable drag-and-drop operations in the project panel",
2681                    field: Box::new(SettingField {
2682                        pick: |settings_content| {
2683                            if let Some(project_panel) = &settings_content.project_panel {
2684                                &project_panel.drag_and_drop
2685                            } else {
2686                                &None
2687                            }
2688                        },
2689                        pick_mut: |settings_content| {
2690                            &mut settings_content
2691                                .project_panel
2692                                .get_or_insert_default()
2693                                .drag_and_drop
2694                        },
2695                    }),
2696                    metadata: None,
2697                    files: USER,
2698                }),
2699                SettingsPageItem::SettingItem(SettingItem {
2700                    title: "Hide Root",
2701                    description: "Whether to hide the root entry when only one folder is open in the window",
2702                    field: Box::new(SettingField {
2703                        pick: |settings_content| {
2704                            if let Some(project_panel) = &settings_content.project_panel {
2705                                &project_panel.hide_root
2706                            } else {
2707                                &None
2708                            }
2709                        },
2710                        pick_mut: |settings_content| {
2711                            &mut settings_content
2712                                .project_panel
2713                                .get_or_insert_default()
2714                                .hide_root
2715                        },
2716                    }),
2717                    metadata: None,
2718                    files: USER,
2719                }),
2720                SettingsPageItem::SectionHeader("Terminal Panel"),
2721                SettingsPageItem::SettingItem(SettingItem {
2722                    title: "Terminal Dock",
2723                    description: "Where to dock the terminal panel",
2724                    field: Box::new(SettingField {
2725                        pick: |settings_content| {
2726                            if let Some(terminal) = &settings_content.terminal {
2727                                &terminal.dock
2728                            } else {
2729                                &None
2730                            }
2731                        },
2732                        pick_mut: |settings_content| {
2733                            &mut settings_content.terminal.get_or_insert_default().dock
2734                        },
2735                    }),
2736                    metadata: None,
2737                    files: USER,
2738                }),
2739                SettingsPageItem::SectionHeader("Outline Panel"),
2740                SettingsPageItem::SettingItem(SettingItem {
2741                    title: "Outline Panel Button",
2742                    description: "Whether to show the outline panel button in the status bar",
2743                    field: Box::new(SettingField {
2744                        pick: |settings_content| {
2745                            if let Some(outline_panel) = &settings_content.outline_panel {
2746                                &outline_panel.button
2747                            } else {
2748                                &None
2749                            }
2750                        },
2751                        pick_mut: |settings_content| {
2752                            &mut settings_content
2753                                .outline_panel
2754                                .get_or_insert_default()
2755                                .button
2756                        },
2757                    }),
2758                    metadata: None,
2759                    files: USER,
2760                }),
2761                SettingsPageItem::SettingItem(SettingItem {
2762                    title: "Outline Panel Dock",
2763                    description: "Where to dock the outline panel",
2764                    field: Box::new(SettingField {
2765                        pick: |settings_content| {
2766                            if let Some(outline_panel) = &settings_content.outline_panel {
2767                                &outline_panel.dock
2768                            } else {
2769                                &None
2770                            }
2771                        },
2772                        pick_mut: |settings_content| {
2773                            &mut settings_content.outline_panel.get_or_insert_default().dock
2774                        },
2775                    }),
2776                    metadata: None,
2777                    files: USER,
2778                }),
2779                SettingsPageItem::SettingItem(SettingItem {
2780                    title: "Outline Panel Default Width",
2781                    description: "Default width of the outline panel in pixels",
2782                    field: Box::new(SettingField {
2783                        pick: |settings_content| {
2784                            if let Some(outline_panel) = &settings_content.outline_panel {
2785                                &outline_panel.default_width
2786                            } else {
2787                                &None
2788                            }
2789                        },
2790                        pick_mut: |settings_content| {
2791                            &mut settings_content
2792                                .outline_panel
2793                                .get_or_insert_default()
2794                                .default_width
2795                        },
2796                    }),
2797                    metadata: None,
2798                    files: USER,
2799                }),
2800                SettingsPageItem::SettingItem(SettingItem {
2801                    title: "File Icons",
2802                    description: "Whether to show file icons in the outline panel",
2803                    field: Box::new(SettingField {
2804                        pick: |settings_content| {
2805                            if let Some(outline_panel) = &settings_content.outline_panel {
2806                                &outline_panel.file_icons
2807                            } else {
2808                                &None
2809                            }
2810                        },
2811                        pick_mut: |settings_content| {
2812                            &mut settings_content
2813                                .outline_panel
2814                                .get_or_insert_default()
2815                                .file_icons
2816                        },
2817                    }),
2818                    metadata: None,
2819                    files: USER,
2820                }),
2821                SettingsPageItem::SettingItem(SettingItem {
2822                    title: "Folder Icons",
2823                    description: "Whether to show folder icons or chevrons for directories in the outline panel",
2824                    field: Box::new(SettingField {
2825                        pick: |settings_content| {
2826                            if let Some(outline_panel) = &settings_content.outline_panel {
2827                                &outline_panel.folder_icons
2828                            } else {
2829                                &None
2830                            }
2831                        },
2832                        pick_mut: |settings_content| {
2833                            &mut settings_content
2834                                .outline_panel
2835                                .get_or_insert_default()
2836                                .folder_icons
2837                        },
2838                    }),
2839                    metadata: None,
2840                    files: USER,
2841                }),
2842                SettingsPageItem::SettingItem(SettingItem {
2843                    title: "Git Status",
2844                    description: "Whether to show the git status in the outline panel",
2845                    field: Box::new(SettingField {
2846                        pick: |settings_content| {
2847                            if let Some(outline_panel) = &settings_content.outline_panel {
2848                                &outline_panel.git_status
2849                            } else {
2850                                &None
2851                            }
2852                        },
2853                        pick_mut: |settings_content| {
2854                            &mut settings_content
2855                                .outline_panel
2856                                .get_or_insert_default()
2857                                .git_status
2858                        },
2859                    }),
2860                    metadata: None,
2861                    files: USER,
2862                }),
2863                SettingsPageItem::SettingItem(SettingItem {
2864                    title: "Indent Size",
2865                    description: "Amount of indentation for nested items",
2866                    field: Box::new(SettingField {
2867                        pick: |settings_content| {
2868                            if let Some(outline_panel) = &settings_content.outline_panel {
2869                                &outline_panel.indent_size
2870                            } else {
2871                                &None
2872                            }
2873                        },
2874                        pick_mut: |settings_content| {
2875                            &mut settings_content
2876                                .outline_panel
2877                                .get_or_insert_default()
2878                                .indent_size
2879                        },
2880                    }),
2881                    metadata: None,
2882                    files: USER,
2883                }),
2884                SettingsPageItem::SettingItem(SettingItem {
2885                    title: "Auto Reveal Entries",
2886                    description: "Whether to reveal when a corresponding outline entry becomes active",
2887                    field: Box::new(SettingField {
2888                        pick: |settings_content| {
2889                            if let Some(outline_panel) = &settings_content.outline_panel {
2890                                &outline_panel.auto_reveal_entries
2891                            } else {
2892                                &None
2893                            }
2894                        },
2895                        pick_mut: |settings_content| {
2896                            &mut settings_content
2897                                .outline_panel
2898                                .get_or_insert_default()
2899                                .auto_reveal_entries
2900                        },
2901                    }),
2902                    metadata: None,
2903                    files: USER,
2904                }),
2905                SettingsPageItem::SettingItem(SettingItem {
2906                    title: "Auto Fold Directories",
2907                    description: "Whether to fold directories automatically when a directory has only one directory inside",
2908                    field: Box::new(SettingField {
2909                        pick: |settings_content| {
2910                            if let Some(outline_panel) = &settings_content.outline_panel {
2911                                &outline_panel.auto_fold_dirs
2912                            } else {
2913                                &None
2914                            }
2915                        },
2916                        pick_mut: |settings_content| {
2917                            &mut settings_content
2918                                .outline_panel
2919                                .get_or_insert_default()
2920                                .auto_fold_dirs
2921                        },
2922                    }),
2923                    metadata: None,
2924                    files: USER,
2925                }),
2926                SettingsPageItem::SettingItem(SettingItem {
2927                    files: USER,
2928                    title: "Indent Guides Show",
2929                    description: "When to show indent guides in the outline panel",
2930                    field: Box::new(
2931                        SettingField {
2932                            pick: |settings_content| {
2933                                if let Some(outline_panel) = &settings_content.outline_panel {
2934                                    if let Some(indent_guides) = &outline_panel.indent_guides {
2935                                        &indent_guides.show
2936                                    } else {
2937                                        &None
2938                                    }
2939                                } else {
2940                                    &None
2941                                }
2942                            },
2943                            pick_mut: |settings_content| {
2944                                &mut settings_content
2945                                    .outline_panel
2946                                    .get_or_insert_default()
2947                                    .indent_guides
2948                                    .get_or_insert_default()
2949                                    .show
2950                            },
2951                        }
2952                        .unimplemented(),
2953                    ),
2954                    metadata: None,
2955                }),
2956                SettingsPageItem::SectionHeader("Git Panel"),
2957                SettingsPageItem::SettingItem(SettingItem {
2958                    title: "Git Panel Button",
2959                    description: "Whether to show the Git panel button in the status bar",
2960                    field: Box::new(SettingField {
2961                        pick: |settings_content| {
2962                            if let Some(git_panel) = &settings_content.git_panel {
2963                                &git_panel.button
2964                            } else {
2965                                &None
2966                            }
2967                        },
2968                        pick_mut: |settings_content| {
2969                            &mut settings_content.git_panel.get_or_insert_default().button
2970                        },
2971                    }),
2972                    metadata: None,
2973                    files: USER,
2974                }),
2975                SettingsPageItem::SettingItem(SettingItem {
2976                    title: "Git Panel Dock",
2977                    description: "Where to dock the Git panel",
2978                    field: Box::new(SettingField {
2979                        pick: |settings_content| {
2980                            if let Some(git_panel) = &settings_content.git_panel {
2981                                &git_panel.dock
2982                            } else {
2983                                &None
2984                            }
2985                        },
2986                        pick_mut: |settings_content| {
2987                            &mut settings_content.git_panel.get_or_insert_default().dock
2988                        },
2989                    }),
2990                    metadata: None,
2991                    files: USER,
2992                }),
2993                SettingsPageItem::SettingItem(SettingItem {
2994                    title: "Git Panel Default Width",
2995                    description: "Default width of the Git panel in pixels",
2996                    field: Box::new(SettingField {
2997                        pick: |settings_content| {
2998                            if let Some(git_panel) = &settings_content.git_panel {
2999                                &git_panel.default_width
3000                            } else {
3001                                &None
3002                            }
3003                        },
3004                        pick_mut: |settings_content| {
3005                            &mut settings_content
3006                                .git_panel
3007                                .get_or_insert_default()
3008                                .default_width
3009                        },
3010                    }),
3011                    metadata: None,
3012                    files: USER,
3013                }),
3014                SettingsPageItem::SectionHeader("Debugger Panel"),
3015                SettingsPageItem::SettingItem(SettingItem {
3016                    title: "Debugger Panel Dock",
3017                    description: "The dock position of the debug panel",
3018                    field: Box::new(SettingField {
3019                        pick: |settings_content| {
3020                            if let Some(debugger) = &settings_content.debugger {
3021                                &debugger.dock
3022                            } else {
3023                                &None
3024                            }
3025                        },
3026                        pick_mut: |settings_content| {
3027                            &mut settings_content.debugger.get_or_insert_default().dock
3028                        },
3029                    }),
3030                    metadata: None,
3031                    files: USER,
3032                }),
3033                SettingsPageItem::SectionHeader("Notification Panel"),
3034                SettingsPageItem::SettingItem(SettingItem {
3035                    title: "Notification Panel Button",
3036                    description: "Whether to show the notification panel button in the status bar",
3037                    field: Box::new(SettingField {
3038                        pick: |settings_content| {
3039                            if let Some(notification_panel) = &settings_content.notification_panel {
3040                                &notification_panel.button
3041                            } else {
3042                                &None
3043                            }
3044                        },
3045                        pick_mut: |settings_content| {
3046                            &mut settings_content
3047                                .notification_panel
3048                                .get_or_insert_default()
3049                                .button
3050                        },
3051                    }),
3052                    metadata: None,
3053                    files: USER,
3054                }),
3055                SettingsPageItem::SettingItem(SettingItem {
3056                    title: "Notification Panel Dock",
3057                    description: "Where to dock the notification panel",
3058                    field: Box::new(SettingField {
3059                        pick: |settings_content| {
3060                            if let Some(notification_panel) = &settings_content.notification_panel {
3061                                &notification_panel.dock
3062                            } else {
3063                                &None
3064                            }
3065                        },
3066                        pick_mut: |settings_content| {
3067                            &mut settings_content
3068                                .notification_panel
3069                                .get_or_insert_default()
3070                                .dock
3071                        },
3072                    }),
3073                    metadata: None,
3074                    files: USER,
3075                }),
3076                SettingsPageItem::SettingItem(SettingItem {
3077                    title: "Notification Panel Default Width",
3078                    description: "Default width of the notification panel in pixels",
3079                    field: Box::new(SettingField {
3080                        pick: |settings_content| {
3081                            if let Some(notification_panel) = &settings_content.notification_panel {
3082                                &notification_panel.default_width
3083                            } else {
3084                                &None
3085                            }
3086                        },
3087                        pick_mut: |settings_content| {
3088                            &mut settings_content
3089                                .notification_panel
3090                                .get_or_insert_default()
3091                                .default_width
3092                        },
3093                    }),
3094                    metadata: None,
3095                    files: USER,
3096                }),
3097                SettingsPageItem::SectionHeader("Collaboration Panel"),
3098                SettingsPageItem::SettingItem(SettingItem {
3099                    title: "Collaboration Panel Button",
3100                    description: "Whether to show the collaboration panel button in the status bar",
3101                    field: Box::new(SettingField {
3102                        pick: |settings_content| {
3103                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3104                            {
3105                                &collaboration_panel.button
3106                            } else {
3107                                &None
3108                            }
3109                        },
3110                        pick_mut: |settings_content| {
3111                            &mut settings_content
3112                                .collaboration_panel
3113                                .get_or_insert_default()
3114                                .button
3115                        },
3116                    }),
3117                    metadata: None,
3118                    files: USER,
3119                }),
3120                SettingsPageItem::SettingItem(SettingItem {
3121                    title: "Collaboration Panel Dock",
3122                    description: "Where to dock the collaboration panel",
3123                    field: Box::new(SettingField {
3124                        pick: |settings_content| {
3125                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3126                            {
3127                                &collaboration_panel.dock
3128                            } else {
3129                                &None
3130                            }
3131                        },
3132                        pick_mut: |settings_content| {
3133                            &mut settings_content
3134                                .collaboration_panel
3135                                .get_or_insert_default()
3136                                .dock
3137                        },
3138                    }),
3139                    metadata: None,
3140                    files: USER,
3141                }),
3142                SettingsPageItem::SettingItem(SettingItem {
3143                    title: "Collaboration Panel Default Width",
3144                    description: "Default width of the collaboration panel in pixels",
3145                    field: Box::new(SettingField {
3146                        pick: |settings_content| {
3147                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3148                            {
3149                                &collaboration_panel.default_width
3150                            } else {
3151                                &None
3152                            }
3153                        },
3154                        pick_mut: |settings_content| {
3155                            &mut settings_content
3156                                .collaboration_panel
3157                                .get_or_insert_default()
3158                                .default_width
3159                        },
3160                    }),
3161                    metadata: None,
3162                    files: USER,
3163                }),
3164            ],
3165        },
3166        SettingsPage {
3167            title: "Version Control",
3168            items: vec![
3169                SettingsPageItem::SectionHeader("Git"),
3170                SettingsPageItem::SettingItem(SettingItem {
3171                    title: "Git Gutter",
3172                    description: "Control whether git status is shown in the editor's gutter",
3173                    field: Box::new(SettingField {
3174                        pick: |settings_content| {
3175                            if let Some(git) = &settings_content.git {
3176                                &git.git_gutter
3177                            } else {
3178                                &None
3179                            }
3180                        },
3181                        pick_mut: |settings_content| {
3182                            &mut settings_content.git.get_or_insert_default().git_gutter
3183                        },
3184                    }),
3185                    metadata: None,
3186                    files: USER,
3187                }),
3188                // todo(settings_ui): Figure out the right default for this value in default.json
3189                SettingsPageItem::SettingItem(SettingItem {
3190                    title: "Gutter Debounce",
3191                    description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
3192                    field: Box::new(SettingField {
3193                        pick: |settings_content| {
3194                            if let Some(git) = &settings_content.git {
3195                                &git.gutter_debounce
3196                            } else {
3197                                &None
3198                            }
3199                        },
3200                        pick_mut: |settings_content| {
3201                            &mut settings_content.git.get_or_insert_default().gutter_debounce
3202                        },
3203                    }),
3204                    metadata: None,
3205                    files: USER,
3206                }),
3207                SettingsPageItem::SettingItem(SettingItem {
3208                    title: "Inline Git Blame",
3209                    description: "Whether or not to show git blame data inline in the currently focused line",
3210                    field: Box::new(SettingField {
3211                        pick: |settings_content| {
3212                            if let Some(git) = &settings_content.git {
3213                                if let Some(inline_blame) = &git.inline_blame {
3214                                    &inline_blame.enabled
3215                                } else {
3216                                    &None
3217                                }
3218                            } else {
3219                                &None
3220                            }
3221                        },
3222                        pick_mut: |settings_content| {
3223                            &mut settings_content
3224                                .git
3225                                .get_or_insert_default()
3226                                .inline_blame
3227                                .get_or_insert_default()
3228                                .enabled
3229                        },
3230                    }),
3231                    metadata: None,
3232                    files: USER,
3233                }),
3234                SettingsPageItem::SettingItem(SettingItem {
3235                    title: "Inline Git Blame Delay",
3236                    description: "The delay after which the inline blame information is shown",
3237                    field: Box::new(SettingField {
3238                        pick: |settings_content| {
3239                            if let Some(git) = &settings_content.git {
3240                                if let Some(inline_blame) = &git.inline_blame {
3241                                    &inline_blame.delay_ms
3242                                } else {
3243                                    &None
3244                                }
3245                            } else {
3246                                &None
3247                            }
3248                        },
3249                        pick_mut: |settings_content| {
3250                            &mut settings_content
3251                                .git
3252                                .get_or_insert_default()
3253                                .inline_blame
3254                                .get_or_insert_default()
3255                                .delay_ms
3256                        },
3257                    }),
3258                    metadata: None,
3259                    files: USER,
3260                }),
3261                SettingsPageItem::SettingItem(SettingItem {
3262                    title: "Inline Git Blame Padding",
3263                    description: "Padding between the end of the source line and the start of the inline blame in columns",
3264                    field: Box::new(SettingField {
3265                        pick: |settings_content| {
3266                            if let Some(git) = &settings_content.git {
3267                                if let Some(inline_blame) = &git.inline_blame {
3268                                    &inline_blame.padding
3269                                } else {
3270                                    &None
3271                                }
3272                            } else {
3273                                &None
3274                            }
3275                        },
3276                        pick_mut: |settings_content| {
3277                            &mut settings_content
3278                                .git
3279                                .get_or_insert_default()
3280                                .inline_blame
3281                                .get_or_insert_default()
3282                                .padding
3283                        },
3284                    }),
3285                    metadata: None,
3286                    files: USER,
3287                }),
3288                SettingsPageItem::SettingItem(SettingItem {
3289                    title: "Inline Git Blame Min Column",
3290                    description: "The minimum column number to show the inline blame information at",
3291                    field: Box::new(SettingField {
3292                        pick: |settings_content| {
3293                            if let Some(git) = &settings_content.git {
3294                                if let Some(inline_blame) = &git.inline_blame {
3295                                    &inline_blame.min_column
3296                                } else {
3297                                    &None
3298                                }
3299                            } else {
3300                                &None
3301                            }
3302                        },
3303                        pick_mut: |settings_content| {
3304                            &mut settings_content
3305                                .git
3306                                .get_or_insert_default()
3307                                .inline_blame
3308                                .get_or_insert_default()
3309                                .min_column
3310                        },
3311                    }),
3312                    metadata: None,
3313                    files: USER,
3314                }),
3315                SettingsPageItem::SettingItem(SettingItem {
3316                    title: "Show Commit Summary",
3317                    description: "Whether to show commit summary as part of the inline blame",
3318                    field: Box::new(SettingField {
3319                        pick: |settings_content| {
3320                            if let Some(git) = &settings_content.git {
3321                                if let Some(inline_blame) = &git.inline_blame {
3322                                    &inline_blame.show_commit_summary
3323                                } else {
3324                                    &None
3325                                }
3326                            } else {
3327                                &None
3328                            }
3329                        },
3330                        pick_mut: |settings_content| {
3331                            &mut settings_content
3332                                .git
3333                                .get_or_insert_default()
3334                                .inline_blame
3335                                .get_or_insert_default()
3336                                .show_commit_summary
3337                        },
3338                    }),
3339                    metadata: None,
3340                    files: USER,
3341                }),
3342                SettingsPageItem::SettingItem(SettingItem {
3343                    title: "Show Avatar",
3344                    description: "Whether to show the avatar of the author of the commit",
3345                    field: Box::new(SettingField {
3346                        pick: |settings_content| {
3347                            if let Some(git) = &settings_content.git {
3348                                if let Some(blame) = &git.blame {
3349                                    &blame.show_avatar
3350                                } else {
3351                                    &None
3352                                }
3353                            } else {
3354                                &None
3355                            }
3356                        },
3357                        pick_mut: |settings_content| {
3358                            &mut settings_content
3359                                .git
3360                                .get_or_insert_default()
3361                                .blame
3362                                .get_or_insert_default()
3363                                .show_avatar
3364                        },
3365                    }),
3366                    metadata: None,
3367                    files: USER,
3368                }),
3369                SettingsPageItem::SettingItem(SettingItem {
3370                    title: "Show Author Name In Branch Picker",
3371                    description: "Whether to show author name as part of the commit information in branch picker",
3372                    field: Box::new(SettingField {
3373                        pick: |settings_content| {
3374                            if let Some(git) = &settings_content.git {
3375                                if let Some(branch_picker) = &git.branch_picker {
3376                                    &branch_picker.show_author_name
3377                                } else {
3378                                    &None
3379                                }
3380                            } else {
3381                                &None
3382                            }
3383                        },
3384                        pick_mut: |settings_content| {
3385                            &mut settings_content
3386                                .git
3387                                .get_or_insert_default()
3388                                .branch_picker
3389                                .get_or_insert_default()
3390                                .show_author_name
3391                        },
3392                    }),
3393                    metadata: None,
3394                    files: USER,
3395                }),
3396                SettingsPageItem::SettingItem(SettingItem {
3397                    title: "Hunk Style",
3398                    description: "How git hunks are displayed visually in the editor",
3399                    field: Box::new(SettingField {
3400                        pick: |settings_content| {
3401                            if let Some(git) = &settings_content.git {
3402                                &git.hunk_style
3403                            } else {
3404                                &None
3405                            }
3406                        },
3407                        pick_mut: |settings_content| {
3408                            &mut settings_content.git.get_or_insert_default().hunk_style
3409                        },
3410                    }),
3411                    metadata: None,
3412                    files: USER,
3413                }),
3414            ],
3415        },
3416        SettingsPage {
3417            title: "System & Network",
3418            items: vec![
3419                SettingsPageItem::SectionHeader("Network"),
3420                // todo(settings_ui): Proxy needs a default
3421                SettingsPageItem::SettingItem(SettingItem {
3422                    title: "Proxy",
3423                    description: "The proxy to use for network requests",
3424                    field: Box::new(
3425                        SettingField {
3426                            pick: |settings_content| &settings_content.proxy,
3427                            pick_mut: |settings_content| &mut settings_content.proxy,
3428                        }
3429                        .unimplemented(),
3430                    ),
3431                    metadata: Some(Box::new(SettingsFieldMetadata {
3432                        placeholder: Some("socks5h://localhost:10808"),
3433                    })),
3434                    files: USER,
3435                }),
3436                SettingsPageItem::SettingItem(SettingItem {
3437                    title: "Server URL",
3438                    description: "The URL of the Zed server to connect to",
3439                    field: Box::new(SettingField {
3440                        pick: |settings_content| &settings_content.server_url,
3441                        pick_mut: |settings_content| &mut settings_content.server_url,
3442                    }),
3443                    metadata: Some(Box::new(SettingsFieldMetadata {
3444                        placeholder: Some("https://zed.dev"),
3445                    })),
3446                    files: USER,
3447                }),
3448                SettingsPageItem::SectionHeader("System"),
3449                SettingsPageItem::SettingItem(SettingItem {
3450                    title: "Auto Update",
3451                    description: "Whether or not to automatically check for updates",
3452                    field: Box::new(SettingField {
3453                        pick: |settings_content| &settings_content.auto_update,
3454                        pick_mut: |settings_content| &mut settings_content.auto_update,
3455                    }),
3456                    metadata: None,
3457                    files: USER,
3458                }),
3459            ],
3460        },
3461        SettingsPage {
3462            title: "Diagnostics & Errors",
3463            items: vec![
3464                SettingsPageItem::SectionHeader("Filtering"),
3465                SettingsPageItem::SettingItem(SettingItem {
3466                    title: "Max Severity",
3467                    description: "Which level to use to filter out diagnostics displayed in the editor",
3468                    field: Box::new(SettingField {
3469                        pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
3470                        pick_mut: |settings_content| {
3471                            &mut settings_content.editor.diagnostics_max_severity
3472                        },
3473                    }),
3474                    metadata: None,
3475                    files: USER,
3476                }),
3477                SettingsPageItem::SettingItem(SettingItem {
3478                    title: "Include Warnings",
3479                    description: "Whether to show warnings or not by default",
3480                    field: Box::new(SettingField {
3481                        pick: |settings_content| {
3482                            if let Some(diagnostics) = &settings_content.diagnostics {
3483                                &diagnostics.include_warnings
3484                            } else {
3485                                &None
3486                            }
3487                        },
3488                        pick_mut: |settings_content| {
3489                            &mut settings_content
3490                                .diagnostics
3491                                .get_or_insert_default()
3492                                .include_warnings
3493                        },
3494                    }),
3495                    metadata: None,
3496                    files: USER,
3497                }),
3498                SettingsPageItem::SectionHeader("Inline"),
3499                SettingsPageItem::SettingItem(SettingItem {
3500                    title: "Inline Diagnostics Enabled",
3501                    description: "Whether to show diagnostics inline or not",
3502                    field: Box::new(SettingField {
3503                        pick: |settings_content| {
3504                            if let Some(diagnostics) = &settings_content.diagnostics {
3505                                if let Some(inline) = &diagnostics.inline {
3506                                    &inline.enabled
3507                                } else {
3508                                    &None
3509                                }
3510                            } else {
3511                                &None
3512                            }
3513                        },
3514                        pick_mut: |settings_content| {
3515                            &mut settings_content
3516                                .diagnostics
3517                                .get_or_insert_default()
3518                                .inline
3519                                .get_or_insert_default()
3520                                .enabled
3521                        },
3522                    }),
3523                    metadata: None,
3524                    files: USER,
3525                }),
3526                SettingsPageItem::SettingItem(SettingItem {
3527                    title: "Inline Update Debounce",
3528                    description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
3529                    field: Box::new(SettingField {
3530                        pick: |settings_content| {
3531                            if let Some(diagnostics) = &settings_content.diagnostics {
3532                                if let Some(inline) = &diagnostics.inline {
3533                                    &inline.update_debounce_ms
3534                                } else {
3535                                    &None
3536                                }
3537                            } else {
3538                                &None
3539                            }
3540                        },
3541                        pick_mut: |settings_content| {
3542                            &mut settings_content
3543                                .diagnostics
3544                                .get_or_insert_default()
3545                                .inline
3546                                .get_or_insert_default()
3547                                .update_debounce_ms
3548                        },
3549                    }),
3550                    metadata: None,
3551                    files: USER,
3552                }),
3553                SettingsPageItem::SettingItem(SettingItem {
3554                    title: "Inline Padding",
3555                    description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
3556                    field: Box::new(SettingField {
3557                        pick: |settings_content| {
3558                            if let Some(diagnostics) = &settings_content.diagnostics {
3559                                if let Some(inline) = &diagnostics.inline {
3560                                    &inline.padding
3561                                } else {
3562                                    &None
3563                                }
3564                            } else {
3565                                &None
3566                            }
3567                        },
3568                        pick_mut: |settings_content| {
3569                            &mut settings_content
3570                                .diagnostics
3571                                .get_or_insert_default()
3572                                .inline
3573                                .get_or_insert_default()
3574                                .padding
3575                        },
3576                    }),
3577                    metadata: None,
3578                    files: USER,
3579                }),
3580                SettingsPageItem::SettingItem(SettingItem {
3581                    title: "Inline Min Column",
3582                    description: "The minimum column to display inline diagnostics",
3583                    field: Box::new(SettingField {
3584                        pick: |settings_content| {
3585                            if let Some(diagnostics) = &settings_content.diagnostics {
3586                                if let Some(inline) = &diagnostics.inline {
3587                                    &inline.min_column
3588                                } else {
3589                                    &None
3590                                }
3591                            } else {
3592                                &None
3593                            }
3594                        },
3595                        pick_mut: |settings_content| {
3596                            &mut settings_content
3597                                .diagnostics
3598                                .get_or_insert_default()
3599                                .inline
3600                                .get_or_insert_default()
3601                                .min_column
3602                        },
3603                    }),
3604                    metadata: None,
3605                    files: USER,
3606                }),
3607                SettingsPageItem::SectionHeader("Performance"),
3608                SettingsPageItem::SettingItem(SettingItem {
3609                    title: "LSP Pull Diagnostics Enabled",
3610                    description: "Whether to pull for language server-powered diagnostics or not",
3611                    field: Box::new(SettingField {
3612                        pick: |settings_content| {
3613                            if let Some(diagnostics) = &settings_content.diagnostics {
3614                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3615                                    &lsp_pull.enabled
3616                                } else {
3617                                    &None
3618                                }
3619                            } else {
3620                                &None
3621                            }
3622                        },
3623                        pick_mut: |settings_content| {
3624                            &mut settings_content
3625                                .diagnostics
3626                                .get_or_insert_default()
3627                                .lsp_pull_diagnostics
3628                                .get_or_insert_default()
3629                                .enabled
3630                        },
3631                    }),
3632                    metadata: None,
3633                    files: USER,
3634                }),
3635                // todo(settings_ui): Needs unit
3636                SettingsPageItem::SettingItem(SettingItem {
3637                    title: "LSP Pull Debounce",
3638                    description: "Minimum time to wait before pulling diagnostics from the language server(s)",
3639                    field: Box::new(SettingField {
3640                        pick: |settings_content| {
3641                            if let Some(diagnostics) = &settings_content.diagnostics {
3642                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3643                                    &lsp_pull.debounce_ms
3644                                } else {
3645                                    &None
3646                                }
3647                            } else {
3648                                &None
3649                            }
3650                        },
3651                        pick_mut: |settings_content| {
3652                            &mut settings_content
3653                                .diagnostics
3654                                .get_or_insert_default()
3655                                .lsp_pull_diagnostics
3656                                .get_or_insert_default()
3657                                .debounce_ms
3658                        },
3659                    }),
3660                    metadata: None,
3661                    files: USER,
3662                }),
3663            ],
3664        },
3665        SettingsPage {
3666            title: "Debugger",
3667            items: vec![
3668                SettingsPageItem::SectionHeader("General"),
3669                SettingsPageItem::SettingItem(SettingItem {
3670                    title: "Stepping Granularity",
3671                    description: "Determines the stepping granularity for debug operations",
3672                    field: Box::new(SettingField {
3673                        pick: |settings_content| {
3674                            if let Some(debugger) = &settings_content.debugger {
3675                                &debugger.stepping_granularity
3676                            } else {
3677                                &None
3678                            }
3679                        },
3680                        pick_mut: |settings_content| {
3681                            &mut settings_content
3682                                .debugger
3683                                .get_or_insert_default()
3684                                .stepping_granularity
3685                        },
3686                    }),
3687                    metadata: None,
3688                    files: USER,
3689                }),
3690                SettingsPageItem::SettingItem(SettingItem {
3691                    title: "Save Breakpoints",
3692                    description: "Whether breakpoints should be reused across Zed sessions",
3693                    field: Box::new(SettingField {
3694                        pick: |settings_content| {
3695                            if let Some(debugger) = &settings_content.debugger {
3696                                &debugger.save_breakpoints
3697                            } else {
3698                                &None
3699                            }
3700                        },
3701                        pick_mut: |settings_content| {
3702                            &mut settings_content
3703                                .debugger
3704                                .get_or_insert_default()
3705                                .save_breakpoints
3706                        },
3707                    }),
3708                    metadata: None,
3709                    files: USER,
3710                }),
3711                SettingsPageItem::SettingItem(SettingItem {
3712                    title: "Timeout",
3713                    description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter",
3714                    field: Box::new(SettingField {
3715                        pick: |settings_content| {
3716                            if let Some(debugger) = &settings_content.debugger {
3717                                &debugger.timeout
3718                            } else {
3719                                &None
3720                            }
3721                        },
3722                        pick_mut: |settings_content| {
3723                            &mut settings_content.debugger.get_or_insert_default().timeout
3724                        },
3725                    }),
3726                    metadata: None,
3727                    files: USER,
3728                }),
3729                SettingsPageItem::SettingItem(SettingItem {
3730                    title: "Log DAP Communications",
3731                    description: "Whether to log messages between active debug adapters and Zed",
3732                    field: Box::new(SettingField {
3733                        pick: |settings_content| {
3734                            if let Some(debugger) = &settings_content.debugger {
3735                                &debugger.log_dap_communications
3736                            } else {
3737                                &None
3738                            }
3739                        },
3740                        pick_mut: |settings_content| {
3741                            &mut settings_content
3742                                .debugger
3743                                .get_or_insert_default()
3744                                .log_dap_communications
3745                        },
3746                    }),
3747                    metadata: None,
3748                    files: USER,
3749                }),
3750                SettingsPageItem::SettingItem(SettingItem {
3751                    title: "Format DAP Log Messages",
3752                    description: "Whether to format DAP messages when adding them to debug adapter logger",
3753                    field: Box::new(SettingField {
3754                        pick: |settings_content| {
3755                            if let Some(debugger) = &settings_content.debugger {
3756                                &debugger.format_dap_log_messages
3757                            } else {
3758                                &None
3759                            }
3760                        },
3761                        pick_mut: |settings_content| {
3762                            &mut settings_content
3763                                .debugger
3764                                .get_or_insert_default()
3765                                .format_dap_log_messages
3766                        },
3767                    }),
3768                    metadata: None,
3769                    files: USER,
3770                }),
3771            ],
3772        },
3773        SettingsPage {
3774            title: "Collaboration",
3775            items: vec![
3776                SettingsPageItem::SectionHeader("Calls"),
3777                SettingsPageItem::SettingItem(SettingItem {
3778                    title: "Mute On Join",
3779                    description: "Whether the microphone should be muted when joining a channel or a call",
3780                    field: Box::new(SettingField {
3781                        pick: |settings_content| {
3782                            if let Some(calls) = &settings_content.calls {
3783                                &calls.mute_on_join
3784                            } else {
3785                                &None
3786                            }
3787                        },
3788                        pick_mut: |settings_content| {
3789                            &mut settings_content.calls.get_or_insert_default().mute_on_join
3790                        },
3791                    }),
3792                    metadata: None,
3793                    files: USER,
3794                }),
3795                SettingsPageItem::SettingItem(SettingItem {
3796                    title: "Share On Join",
3797                    description: "Whether your current project should be shared when joining an empty channel",
3798                    field: Box::new(SettingField {
3799                        pick: |settings_content| {
3800                            if let Some(calls) = &settings_content.calls {
3801                                &calls.share_on_join
3802                            } else {
3803                                &None
3804                            }
3805                        },
3806                        pick_mut: |settings_content| {
3807                            &mut settings_content.calls.get_or_insert_default().share_on_join
3808                        },
3809                    }),
3810                    metadata: None,
3811                    files: USER,
3812                }),
3813                SettingsPageItem::SectionHeader("Experimental"),
3814                SettingsPageItem::SettingItem(SettingItem {
3815                    title: "Rodio Audio",
3816                    description: "Opt into the new audio system",
3817                    field: Box::new(SettingField {
3818                        pick: |settings_content| {
3819                            if let Some(audio) = &settings_content.audio {
3820                                &audio.rodio_audio
3821                            } else {
3822                                &None
3823                            }
3824                        },
3825                        pick_mut: |settings_content| {
3826                            &mut settings_content.audio.get_or_insert_default().rodio_audio
3827                        },
3828                    }),
3829                    metadata: None,
3830                    files: USER,
3831                }),
3832                SettingsPageItem::SettingItem(SettingItem {
3833                    title: "Auto Microphone Volume",
3834                    description: "Automatically adjust microphone volume (requires Rodio Audio)",
3835                    field: Box::new(SettingField {
3836                        pick: |settings_content| {
3837                            if let Some(audio) = &settings_content.audio {
3838                                &audio.auto_microphone_volume
3839                            } else {
3840                                &None
3841                            }
3842                        },
3843                        pick_mut: |settings_content| {
3844                            &mut settings_content
3845                                .audio
3846                                .get_or_insert_default()
3847                                .auto_microphone_volume
3848                        },
3849                    }),
3850                    metadata: None,
3851                    files: USER,
3852                }),
3853                SettingsPageItem::SettingItem(SettingItem {
3854                    title: "Auto Speaker Volume",
3855                    description: "Automatically adjust volume of other call members (requires Rodio Audio)",
3856                    field: Box::new(SettingField {
3857                        pick: |settings_content| {
3858                            if let Some(audio) = &settings_content.audio {
3859                                &audio.auto_speaker_volume
3860                            } else {
3861                                &None
3862                            }
3863                        },
3864                        pick_mut: |settings_content| {
3865                            &mut settings_content
3866                                .audio
3867                                .get_or_insert_default()
3868                                .auto_speaker_volume
3869                        },
3870                    }),
3871                    metadata: None,
3872                    files: USER,
3873                }),
3874                SettingsPageItem::SettingItem(SettingItem {
3875                    title: "Denoise",
3876                    description: "Remove background noises (requires Rodio Audio)",
3877                    field: Box::new(SettingField {
3878                        pick: |settings_content| {
3879                            if let Some(audio) = &settings_content.audio {
3880                                &audio.denoise
3881                            } else {
3882                                &None
3883                            }
3884                        },
3885                        pick_mut: |settings_content| {
3886                            &mut settings_content.audio.get_or_insert_default().denoise
3887                        },
3888                    }),
3889                    metadata: None,
3890                    files: USER,
3891                }),
3892                SettingsPageItem::SettingItem(SettingItem {
3893                    title: "Legacy Audio Compatible",
3894                    description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
3895                    field: Box::new(SettingField {
3896                        pick: |settings_content| {
3897                            if let Some(audio) = &settings_content.audio {
3898                                &audio.legacy_audio_compatible
3899                            } else {
3900                                &None
3901                            }
3902                        },
3903                        pick_mut: |settings_content| {
3904                            &mut settings_content
3905                                .audio
3906                                .get_or_insert_default()
3907                                .legacy_audio_compatible
3908                        },
3909                    }),
3910                    metadata: None,
3911                    files: USER,
3912                }),
3913            ],
3914        },
3915        SettingsPage {
3916            title: "AI",
3917            items: vec![
3918                SettingsPageItem::SectionHeader("General"),
3919                SettingsPageItem::SettingItem(SettingItem {
3920                    title: "Disable AI",
3921                    description: "Whether to disable all AI features in Zed",
3922                    field: Box::new(SettingField {
3923                        pick: |settings_content| &settings_content.disable_ai,
3924                        pick_mut: |settings_content| &mut settings_content.disable_ai,
3925                    }),
3926                    metadata: None,
3927                    files: USER,
3928                }),
3929            ],
3930        },
3931    ]
3932}
3933
3934const LANGUAGES_SECTION_HEADER: &'static str = "Languages";
3935
3936fn language_settings_data() -> Vec<SettingsPageItem> {
3937    fn current_language() -> Option<SharedString> {
3938        sub_page_stack().iter().find_map(|page| {
3939            (page.section_header == LANGUAGES_SECTION_HEADER)
3940                .then(|| SharedString::new_static(page.link.title))
3941        })
3942    }
3943
3944    fn language_settings_field<T>(
3945        settings_content: &SettingsContent,
3946        get: fn(&LanguageSettingsContent) -> &Option<T>,
3947    ) -> &Option<T> {
3948        let all_languages = &settings_content.project.all_languages;
3949        if let Some(current_language_name) = current_language() {
3950            if let Some(current_language) = all_languages.languages.0.get(&current_language_name) {
3951                let value = get(current_language);
3952                if value.is_some() {
3953                    return value;
3954                }
3955            }
3956        }
3957        let default_value = get(&all_languages.defaults);
3958        return default_value;
3959    }
3960
3961    fn language_settings_field_mut<T>(
3962        settings_content: &mut SettingsContent,
3963        get: fn(&mut LanguageSettingsContent) -> &mut Option<T>,
3964    ) -> &mut Option<T> {
3965        let all_languages = &mut settings_content.project.all_languages;
3966        let language_content = if let Some(current_language) = current_language() {
3967            all_languages
3968                .languages
3969                .0
3970                .entry(current_language)
3971                .or_default()
3972        } else {
3973            &mut all_languages.defaults
3974        };
3975        return get(language_content);
3976    }
3977
3978    vec![
3979        SettingsPageItem::SectionHeader("Indentation"),
3980        SettingsPageItem::SettingItem(SettingItem {
3981            title: "Tab Size",
3982            description: "How many columns a tab should occupy",
3983            field: Box::new(SettingField {
3984                pick: |settings_content| {
3985                    language_settings_field(settings_content, |language| &language.tab_size)
3986                },
3987                pick_mut: |settings_content| {
3988                    language_settings_field_mut(settings_content, |language| &mut language.tab_size)
3989                },
3990            }),
3991            metadata: None,
3992            files: USER | LOCAL,
3993        }),
3994        SettingsPageItem::SettingItem(SettingItem {
3995            title: "Hard Tabs",
3996            description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
3997            field: Box::new(SettingField {
3998                pick: |settings_content| {
3999                    language_settings_field(settings_content, |language| &language.hard_tabs)
4000                },
4001                pick_mut: |settings_content| {
4002                    language_settings_field_mut(settings_content, |language| {
4003                        &mut language.hard_tabs
4004                    })
4005                },
4006            }),
4007            metadata: None,
4008            files: USER | LOCAL,
4009        }),
4010        SettingsPageItem::SettingItem(SettingItem {
4011            title: "Auto Indent",
4012            description: "Whether indentation should be adjusted based on the context whilst typing",
4013            field: Box::new(SettingField {
4014                pick: |settings_content| {
4015                    language_settings_field(settings_content, |language| &language.auto_indent)
4016                },
4017                pick_mut: |settings_content| {
4018                    language_settings_field_mut(settings_content, |language| {
4019                        &mut language.auto_indent
4020                    })
4021                },
4022            }),
4023            metadata: None,
4024            files: USER | LOCAL,
4025        }),
4026        SettingsPageItem::SettingItem(SettingItem {
4027            title: "Auto Indent On Paste",
4028            description: "Whether indentation of pasted content should be adjusted based on the context",
4029            field: Box::new(SettingField {
4030                pick: |settings_content| {
4031                    language_settings_field(settings_content, |language| {
4032                        &language.auto_indent_on_paste
4033                    })
4034                },
4035                pick_mut: |settings_content| {
4036                    language_settings_field_mut(settings_content, |language| {
4037                        &mut language.auto_indent_on_paste
4038                    })
4039                },
4040            }),
4041            metadata: None,
4042            files: USER | LOCAL,
4043        }),
4044        SettingsPageItem::SectionHeader("Wrapping"),
4045        SettingsPageItem::SettingItem(SettingItem {
4046            title: "Soft Wrap",
4047            description: "How to soft-wrap long lines of text",
4048            field: Box::new(SettingField {
4049                pick: |settings_content| {
4050                    language_settings_field(settings_content, |language| &language.soft_wrap)
4051                },
4052                pick_mut: |settings_content| {
4053                    language_settings_field_mut(settings_content, |language| {
4054                        &mut language.soft_wrap
4055                    })
4056                },
4057            }),
4058            metadata: None,
4059            files: USER | LOCAL,
4060        }),
4061        SettingsPageItem::SettingItem(SettingItem {
4062            title: "Show Wrap Guides",
4063            description: "Whether to show wrap guides in the editor",
4064            field: Box::new(SettingField {
4065                pick: |settings_content| {
4066                    language_settings_field(settings_content, |language| &language.show_wrap_guides)
4067                },
4068                pick_mut: |settings_content| {
4069                    language_settings_field_mut(settings_content, |language| {
4070                        &mut language.show_wrap_guides
4071                    })
4072                },
4073            }),
4074            metadata: None,
4075            files: USER | LOCAL,
4076        }),
4077        SettingsPageItem::SettingItem(SettingItem {
4078            title: "Preferred Line Length",
4079            description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
4080            field: Box::new(SettingField {
4081                pick: |settings_content| {
4082                    language_settings_field(settings_content, |language| {
4083                        &language.preferred_line_length
4084                    })
4085                },
4086                pick_mut: |settings_content| {
4087                    language_settings_field_mut(settings_content, |language| {
4088                        &mut language.preferred_line_length
4089                    })
4090                },
4091            }),
4092            metadata: None,
4093            files: USER | LOCAL,
4094        }),
4095        SettingsPageItem::SettingItem(SettingItem {
4096            title: "Wrap Guides",
4097            description: "Character counts at which to show wrap guides in the editor",
4098            field: Box::new(
4099                SettingField {
4100                    pick: |settings_content| {
4101                        language_settings_field(settings_content, |language| &language.wrap_guides)
4102                    },
4103                    pick_mut: |settings_content| {
4104                        language_settings_field_mut(settings_content, |language| {
4105                            &mut language.wrap_guides
4106                        })
4107                    },
4108                }
4109                .unimplemented(),
4110            ),
4111            metadata: None,
4112            files: USER | LOCAL,
4113        }),
4114        SettingsPageItem::SettingItem(SettingItem {
4115            title: "Allow Rewrap",
4116            description: "Controls where the `editor::Rewrap` action is allowed for this language",
4117            field: Box::new(SettingField {
4118                pick: |settings_content| {
4119                    language_settings_field(settings_content, |language| &language.allow_rewrap)
4120                },
4121                pick_mut: |settings_content| {
4122                    language_settings_field_mut(settings_content, |language| {
4123                        &mut language.allow_rewrap
4124                    })
4125                },
4126            }),
4127            metadata: None,
4128            files: USER | LOCAL,
4129        }),
4130        SettingsPageItem::SectionHeader("Indent Guides"),
4131        SettingsPageItem::SettingItem(SettingItem {
4132            title: "Enabled",
4133            description: "Whether to display indent guides in the editor",
4134            field: Box::new(SettingField {
4135                pick: |settings_content| {
4136                    language_settings_field(settings_content, |language| {
4137                        if let Some(indent_guides) = &language.indent_guides {
4138                            &indent_guides.enabled
4139                        } else {
4140                            &None
4141                        }
4142                    })
4143                },
4144                pick_mut: |settings_content| {
4145                    language_settings_field_mut(settings_content, |language| {
4146                        &mut language.indent_guides.get_or_insert_default().enabled
4147                    })
4148                },
4149            }),
4150            metadata: None,
4151            files: USER | LOCAL,
4152        }),
4153        SettingsPageItem::SettingItem(SettingItem {
4154            title: "Line Width",
4155            description: "The width of the indent guides in pixels, between 1 and 10",
4156            field: Box::new(SettingField {
4157                pick: |settings_content| {
4158                    language_settings_field(settings_content, |language| {
4159                        if let Some(indent_guides) = &language.indent_guides {
4160                            &indent_guides.line_width
4161                        } else {
4162                            &None
4163                        }
4164                    })
4165                },
4166                pick_mut: |settings_content| {
4167                    language_settings_field_mut(settings_content, |language| {
4168                        &mut language.indent_guides.get_or_insert_default().line_width
4169                    })
4170                },
4171            }),
4172            metadata: None,
4173            files: USER | LOCAL,
4174        }),
4175        SettingsPageItem::SettingItem(SettingItem {
4176            title: "Active Line Width",
4177            description: "The width of the active indent guide in pixels, between 1 and 10",
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.active_line_width
4183                        } else {
4184                            &None
4185                        }
4186                    })
4187                },
4188                pick_mut: |settings_content| {
4189                    language_settings_field_mut(settings_content, |language| {
4190                        &mut language
4191                            .indent_guides
4192                            .get_or_insert_default()
4193                            .active_line_width
4194                    })
4195                },
4196            }),
4197            metadata: None,
4198            files: USER | LOCAL,
4199        }),
4200        SettingsPageItem::SettingItem(SettingItem {
4201            title: "Coloring",
4202            description: "Determines how indent guides are colored",
4203            field: Box::new(SettingField {
4204                pick: |settings_content| {
4205                    language_settings_field(settings_content, |language| {
4206                        if let Some(indent_guides) = &language.indent_guides {
4207                            &indent_guides.coloring
4208                        } else {
4209                            &None
4210                        }
4211                    })
4212                },
4213                pick_mut: |settings_content| {
4214                    language_settings_field_mut(settings_content, |language| {
4215                        &mut language.indent_guides.get_or_insert_default().coloring
4216                    })
4217                },
4218            }),
4219            metadata: None,
4220            files: USER | LOCAL,
4221        }),
4222        SettingsPageItem::SettingItem(SettingItem {
4223            title: "Background Coloring",
4224            description: "Determines how indent guide backgrounds are colored",
4225            field: Box::new(SettingField {
4226                pick: |settings_content| {
4227                    language_settings_field(settings_content, |language| {
4228                        if let Some(indent_guides) = &language.indent_guides {
4229                            &indent_guides.background_coloring
4230                        } else {
4231                            &None
4232                        }
4233                    })
4234                },
4235                pick_mut: |settings_content| {
4236                    language_settings_field_mut(settings_content, |language| {
4237                        &mut language
4238                            .indent_guides
4239                            .get_or_insert_default()
4240                            .background_coloring
4241                    })
4242                },
4243            }),
4244            metadata: None,
4245            files: USER | LOCAL,
4246        }),
4247        SettingsPageItem::SectionHeader("Formatting"),
4248        SettingsPageItem::SettingItem(SettingItem {
4249            title: "Format On Save",
4250            description: "Whether or not to perform a buffer format before saving",
4251            field: Box::new(
4252                // TODO(settings_ui): this setting should just be a bool
4253                SettingField {
4254                    pick: |settings_content| {
4255                        language_settings_field(settings_content, |language| {
4256                            &language.format_on_save
4257                        })
4258                    },
4259                    pick_mut: |settings_content| {
4260                        language_settings_field_mut(settings_content, |language| {
4261                            &mut language.format_on_save
4262                        })
4263                    },
4264                },
4265            ),
4266            metadata: None,
4267            files: USER | LOCAL,
4268        }),
4269        SettingsPageItem::SettingItem(SettingItem {
4270            title: "Remove Trailing Whitespace On Save",
4271            description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
4272            field: Box::new(SettingField {
4273                pick: |settings_content| {
4274                    language_settings_field(settings_content, |language| {
4275                        &language.remove_trailing_whitespace_on_save
4276                    })
4277                },
4278                pick_mut: |settings_content| {
4279                    language_settings_field_mut(settings_content, |language| {
4280                        &mut language.remove_trailing_whitespace_on_save
4281                    })
4282                },
4283            }),
4284            metadata: None,
4285            files: USER | LOCAL,
4286        }),
4287        SettingsPageItem::SettingItem(SettingItem {
4288            title: "Ensure Final Newline On Save",
4289            description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
4290            field: Box::new(SettingField {
4291                pick: |settings_content| {
4292                    language_settings_field(settings_content, |language| {
4293                        &language.ensure_final_newline_on_save
4294                    })
4295                },
4296                pick_mut: |settings_content| {
4297                    language_settings_field_mut(settings_content, |language| {
4298                        &mut language.ensure_final_newline_on_save
4299                    })
4300                },
4301            }),
4302            metadata: None,
4303            files: USER | LOCAL,
4304        }),
4305        SettingsPageItem::SettingItem(SettingItem {
4306            title: "Formatter",
4307            description: "How to perform a buffer format",
4308            field: Box::new(
4309                SettingField {
4310                    pick: |settings_content| {
4311                        language_settings_field(settings_content, |language| &language.formatter)
4312                    },
4313                    pick_mut: |settings_content| {
4314                        language_settings_field_mut(settings_content, |language| {
4315                            &mut language.formatter
4316                        })
4317                    },
4318                }
4319                .unimplemented(),
4320            ),
4321            metadata: None,
4322            files: USER | LOCAL,
4323        }),
4324        SettingsPageItem::SettingItem(SettingItem {
4325            title: "Use On Type Format",
4326            description: "Whether to use additional LSP queries to format (and amend) the code after every \"trigger\" symbol input, defined by LSP server capabilities",
4327            field: Box::new(SettingField {
4328                pick: |settings_content| {
4329                    language_settings_field(settings_content, |language| {
4330                        &language.use_on_type_format
4331                    })
4332                },
4333                pick_mut: |settings_content| {
4334                    language_settings_field_mut(settings_content, |language| {
4335                        &mut language.use_on_type_format
4336                    })
4337                },
4338            }),
4339            metadata: None,
4340            files: USER | LOCAL,
4341        }),
4342        SettingsPageItem::SettingItem(SettingItem {
4343            title: "Code Actions On Format",
4344            description: "Which code actions to run on save after the formatter. These are not run if formatting is off",
4345            field: Box::new(
4346                SettingField {
4347                    pick: |settings_content| {
4348                        language_settings_field(settings_content, |language| {
4349                            &language.code_actions_on_format
4350                        })
4351                    },
4352                    pick_mut: |settings_content| {
4353                        language_settings_field_mut(settings_content, |language| {
4354                            &mut language.code_actions_on_format
4355                        })
4356                    },
4357                }
4358                .unimplemented(),
4359            ),
4360            metadata: None,
4361            files: USER | LOCAL,
4362        }),
4363        SettingsPageItem::SectionHeader("Prettier"),
4364        SettingsPageItem::SettingItem(SettingItem {
4365            title: "Allowed",
4366            description: "Enables or disables formatting with Prettier for a given language",
4367            field: Box::new(SettingField {
4368                pick: |settings_content| {
4369                    language_settings_field(settings_content, |language| {
4370                        if let Some(prettier) = &language.prettier {
4371                            &prettier.allowed
4372                        } else {
4373                            &None
4374                        }
4375                    })
4376                },
4377                pick_mut: |settings_content| {
4378                    language_settings_field_mut(settings_content, |language| {
4379                        &mut language.prettier.get_or_insert_default().allowed
4380                    })
4381                },
4382            }),
4383            metadata: None,
4384            files: USER | LOCAL,
4385        }),
4386        SettingsPageItem::SettingItem(SettingItem {
4387            title: "Parser",
4388            description: "Forces Prettier integration to use a specific parser name when formatting files with the language",
4389            field: Box::new(SettingField {
4390                pick: |settings_content| {
4391                    language_settings_field(settings_content, |language| {
4392                        if let Some(prettier) = &language.prettier {
4393                            &prettier.parser
4394                        } else {
4395                            &None
4396                        }
4397                    })
4398                },
4399                pick_mut: |settings_content| {
4400                    language_settings_field_mut(settings_content, |language| {
4401                        &mut language.prettier.get_or_insert_default().parser
4402                    })
4403                },
4404            }),
4405            metadata: None,
4406            files: USER | LOCAL,
4407        }),
4408        SettingsPageItem::SettingItem(SettingItem {
4409            title: "Plugins",
4410            description: "Forces Prettier integration to use specific plugins when formatting files with the language",
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.plugins
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().plugins
4425                        })
4426                    },
4427                }
4428                .unimplemented(),
4429            ),
4430            metadata: None,
4431            files: USER | LOCAL,
4432        }),
4433        SettingsPageItem::SettingItem(SettingItem {
4434            title: "Options",
4435            description: "Default Prettier options, in the format as in package.json section for Prettier",
4436            field: Box::new(
4437                SettingField {
4438                    pick: |settings_content| {
4439                        language_settings_field(settings_content, |language| {
4440                            if let Some(prettier) = &language.prettier {
4441                                &prettier.options
4442                            } else {
4443                                &None
4444                            }
4445                        })
4446                    },
4447                    pick_mut: |settings_content| {
4448                        language_settings_field_mut(settings_content, |language| {
4449                            &mut language.prettier.get_or_insert_default().options
4450                        })
4451                    },
4452                }
4453                .unimplemented(),
4454            ),
4455            metadata: None,
4456            files: USER | LOCAL,
4457        }),
4458        SettingsPageItem::SectionHeader("Autoclose"),
4459        SettingsPageItem::SettingItem(SettingItem {
4460            title: "Use Autoclose",
4461            description: "Whether to automatically type closing characters for you. For example, when you type (, Zed will automatically add a closing ) at the correct position",
4462            field: Box::new(SettingField {
4463                pick: |settings_content| {
4464                    language_settings_field(settings_content, |language| &language.use_autoclose)
4465                },
4466                pick_mut: |settings_content| {
4467                    language_settings_field_mut(settings_content, |language| {
4468                        &mut language.use_autoclose
4469                    })
4470                },
4471            }),
4472            metadata: None,
4473            files: USER | LOCAL,
4474        }),
4475        SettingsPageItem::SettingItem(SettingItem {
4476            title: "Use Auto Surround",
4477            description: "Whether to automatically surround text with characters for you. For example, when you select text and type (, Zed will automatically surround text with ()",
4478            field: Box::new(SettingField {
4479                pick: |settings_content| {
4480                    language_settings_field(settings_content, |language| {
4481                        &language.use_auto_surround
4482                    })
4483                },
4484                pick_mut: |settings_content| {
4485                    language_settings_field_mut(settings_content, |language| {
4486                        &mut language.use_auto_surround
4487                    })
4488                },
4489            }),
4490            metadata: None,
4491            files: USER | LOCAL,
4492        }),
4493        SettingsPageItem::SettingItem(SettingItem {
4494            title: "Always Treat Brackets As Autoclosed",
4495            description: "Controls whether the closing characters are always skipped over and auto-removed no matter how they were inserted",
4496            field: Box::new(SettingField {
4497                pick: |settings_content| {
4498                    language_settings_field(settings_content, |language| {
4499                        &language.always_treat_brackets_as_autoclosed
4500                    })
4501                },
4502                pick_mut: |settings_content| {
4503                    language_settings_field_mut(settings_content, |language| {
4504                        &mut language.always_treat_brackets_as_autoclosed
4505                    })
4506                },
4507            }),
4508            metadata: None,
4509            files: USER | LOCAL,
4510        }),
4511        SettingsPageItem::SettingItem(SettingItem {
4512            title: "Jsx Tag Auto Close",
4513            description: "Whether to automatically close JSX tags",
4514            field: Box::new(SettingField {
4515                // TODO(settings_ui): this setting should just be a bool
4516                pick: |settings_content| {
4517                    language_settings_field(settings_content, |language| {
4518                        match language.jsx_tag_auto_close.as_ref() {
4519                            Some(s) => &s.enabled,
4520                            None => &None,
4521                        }
4522                    })
4523                },
4524                pick_mut: |settings_content| {
4525                    language_settings_field_mut(settings_content, |language| {
4526                        &mut language.jsx_tag_auto_close.get_or_insert_default().enabled
4527                    })
4528                },
4529            }),
4530            metadata: None,
4531            files: USER | LOCAL,
4532        }),
4533        SettingsPageItem::SectionHeader("LSP"),
4534        SettingsPageItem::SettingItem(SettingItem {
4535            title: "Enable Language Server",
4536            description: "Whether to use language servers to provide code intelligence",
4537            field: Box::new(SettingField {
4538                pick: |settings_content| {
4539                    language_settings_field(settings_content, |language| {
4540                        &language.enable_language_server
4541                    })
4542                },
4543                pick_mut: |settings_content| {
4544                    language_settings_field_mut(settings_content, |language| {
4545                        &mut language.enable_language_server
4546                    })
4547                },
4548            }),
4549            metadata: None,
4550            files: USER | LOCAL,
4551        }),
4552        SettingsPageItem::SettingItem(SettingItem {
4553            title: "Language Servers",
4554            description: "The list of language servers to use (or disable) for this language",
4555            field: Box::new(
4556                SettingField {
4557                    pick: |settings_content| {
4558                        language_settings_field(settings_content, |language| {
4559                            &language.language_servers
4560                        })
4561                    },
4562                    pick_mut: |settings_content| {
4563                        language_settings_field_mut(settings_content, |language| {
4564                            &mut language.language_servers
4565                        })
4566                    },
4567                }
4568                .unimplemented(),
4569            ),
4570            metadata: None,
4571            files: USER | LOCAL,
4572        }),
4573        SettingsPageItem::SettingItem(SettingItem {
4574            title: "Linked Edits",
4575            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",
4576            field: Box::new(SettingField {
4577                pick: |settings_content| {
4578                    language_settings_field(settings_content, |language| &language.linked_edits)
4579                },
4580                pick_mut: |settings_content| {
4581                    language_settings_field_mut(settings_content, |language| {
4582                        &mut language.linked_edits
4583                    })
4584                },
4585            }),
4586            metadata: None,
4587            files: USER | LOCAL,
4588        }),
4589        SettingsPageItem::SectionHeader("Edit Predictions"),
4590        SettingsPageItem::SettingItem(SettingItem {
4591            title: "Show Edit Predictions",
4592            description: "Controls whether edit predictions are shown immediately (true) or manually by triggering `editor::ShowEditPrediction` (false)",
4593            field: Box::new(SettingField {
4594                pick: |settings_content| {
4595                    language_settings_field(settings_content, |language| {
4596                        &language.show_edit_predictions
4597                    })
4598                },
4599                pick_mut: |settings_content| {
4600                    language_settings_field_mut(settings_content, |language| {
4601                        &mut language.show_edit_predictions
4602                    })
4603                },
4604            }),
4605            metadata: None,
4606            files: USER | LOCAL,
4607        }),
4608        SettingsPageItem::SettingItem(SettingItem {
4609            title: "Edit Predictions Disabled In",
4610            description: "Controls whether edit predictions are shown in the given language scopes",
4611            field: Box::new(
4612                SettingField {
4613                    pick: |settings_content| {
4614                        language_settings_field(settings_content, |language| {
4615                            &language.edit_predictions_disabled_in
4616                        })
4617                    },
4618                    pick_mut: |settings_content| {
4619                        language_settings_field_mut(settings_content, |language| {
4620                            &mut language.edit_predictions_disabled_in
4621                        })
4622                    },
4623                }
4624                .unimplemented(),
4625            ),
4626            metadata: None,
4627            files: USER | LOCAL,
4628        }),
4629        SettingsPageItem::SectionHeader("Whitespace"),
4630        SettingsPageItem::SettingItem(SettingItem {
4631            title: "Show Whitespaces",
4632            description: "Whether to show tabs and spaces in the editor",
4633            field: Box::new(SettingField {
4634                pick: |settings_content| {
4635                    language_settings_field(settings_content, |language| &language.show_whitespaces)
4636                },
4637                pick_mut: |settings_content| {
4638                    language_settings_field_mut(settings_content, |language| {
4639                        &mut language.show_whitespaces
4640                    })
4641                },
4642            }),
4643            metadata: None,
4644            files: USER | LOCAL,
4645        }),
4646        SettingsPageItem::SettingItem(SettingItem {
4647            title: "Space Whitespace Indicator",
4648            description: "Visible character used to render space 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.space
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().space
4663                        })
4664                    },
4665                }
4666                .unimplemented(),
4667            ),
4668            metadata: None,
4669            files: USER | LOCAL,
4670        }),
4671        SettingsPageItem::SettingItem(SettingItem {
4672            title: "Tab Whitespace Indicator",
4673            description: "Visible character used to render tab characters when show_whitespaces is enabled (default: \"\")",
4674            field: Box::new(
4675                SettingField {
4676                    pick: |settings_content| {
4677                        language_settings_field(settings_content, |language| {
4678                            if let Some(whitespace_map) = &language.whitespace_map {
4679                                &whitespace_map.tab
4680                            } else {
4681                                &None
4682                            }
4683                        })
4684                    },
4685                    pick_mut: |settings_content| {
4686                        language_settings_field_mut(settings_content, |language| {
4687                            &mut language.whitespace_map.get_or_insert_default().tab
4688                        })
4689                    },
4690                }
4691                .unimplemented(),
4692            ),
4693            metadata: None,
4694            files: USER | LOCAL,
4695        }),
4696        SettingsPageItem::SectionHeader("Completions"),
4697        SettingsPageItem::SettingItem(SettingItem {
4698            title: "Show Completions On Input",
4699            description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
4700            field: Box::new(SettingField {
4701                pick: |settings_content| {
4702                    language_settings_field(settings_content, |language| {
4703                        &language.show_completions_on_input
4704                    })
4705                },
4706                pick_mut: |settings_content| {
4707                    language_settings_field_mut(settings_content, |language| {
4708                        &mut language.show_completions_on_input
4709                    })
4710                },
4711            }),
4712            metadata: None,
4713            files: USER | LOCAL,
4714        }),
4715        SettingsPageItem::SettingItem(SettingItem {
4716            title: "Show Completion Documentation",
4717            description: "Whether to display inline and alongside documentation for items in the completions menu",
4718            field: Box::new(SettingField {
4719                pick: |settings_content| {
4720                    language_settings_field(settings_content, |language| {
4721                        &language.show_completion_documentation
4722                    })
4723                },
4724                pick_mut: |settings_content| {
4725                    language_settings_field_mut(settings_content, |language| {
4726                        &mut language.show_completion_documentation
4727                    })
4728                },
4729            }),
4730            metadata: None,
4731            files: USER | LOCAL,
4732        }),
4733        SettingsPageItem::SettingItem(SettingItem {
4734            title: "Words",
4735            description: "Controls how words are completed",
4736            field: Box::new(SettingField {
4737                pick: |settings_content| {
4738                    language_settings_field(settings_content, |language| {
4739                        if let Some(completions) = &language.completions {
4740                            &completions.words
4741                        } else {
4742                            &None
4743                        }
4744                    })
4745                },
4746                pick_mut: |settings_content| {
4747                    language_settings_field_mut(settings_content, |language| {
4748                        &mut language.completions.get_or_insert_default().words
4749                    })
4750                },
4751            }),
4752            metadata: None,
4753            files: USER | LOCAL,
4754        }),
4755        SettingsPageItem::SettingItem(SettingItem {
4756            title: "Words Min Length",
4757            description: "How many characters has to be in the completions query to automatically show the words-based completions",
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.words_min_length
4763                        } else {
4764                            &None
4765                        }
4766                    })
4767                },
4768                pick_mut: |settings_content| {
4769                    language_settings_field_mut(settings_content, |language| {
4770                        &mut language
4771                            .completions
4772                            .get_or_insert_default()
4773                            .words_min_length
4774                    })
4775                },
4776            }),
4777            metadata: None,
4778            files: USER | LOCAL,
4779        }),
4780        SettingsPageItem::SettingItem(SettingItem {
4781            title: "Lsp",
4782            description: "Whether to fetch LSP completions or not",
4783            field: Box::new(SettingField {
4784                pick: |settings_content| {
4785                    language_settings_field(settings_content, |language| {
4786                        if let Some(completions) = &language.completions {
4787                            &completions.lsp
4788                        } else {
4789                            &None
4790                        }
4791                    })
4792                },
4793                pick_mut: |settings_content| {
4794                    language_settings_field_mut(settings_content, |language| {
4795                        &mut language.completions.get_or_insert_default().lsp
4796                    })
4797                },
4798            }),
4799            metadata: None,
4800            files: USER | LOCAL,
4801        }),
4802        SettingsPageItem::SettingItem(SettingItem {
4803            title: "Lsp Fetch Timeout Ms",
4804            description: "When fetching LSP completions, determines how long to wait for a response of a particular server (set to 0 to wait indefinitely)",
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_fetch_timeout_ms
4810                        } else {
4811                            &None
4812                        }
4813                    })
4814                },
4815                pick_mut: |settings_content| {
4816                    language_settings_field_mut(settings_content, |language| {
4817                        &mut language
4818                            .completions
4819                            .get_or_insert_default()
4820                            .lsp_fetch_timeout_ms
4821                    })
4822                },
4823            }),
4824            metadata: None,
4825            files: USER | LOCAL,
4826        }),
4827        SettingsPageItem::SettingItem(SettingItem {
4828            title: "Lsp Insert Mode",
4829            description: "Controls how LSP completions are inserted",
4830            field: Box::new(SettingField {
4831                pick: |settings_content| {
4832                    language_settings_field(settings_content, |language| {
4833                        if let Some(completions) = &language.completions {
4834                            &completions.lsp_insert_mode
4835                        } else {
4836                            &None
4837                        }
4838                    })
4839                },
4840                pick_mut: |settings_content| {
4841                    language_settings_field_mut(settings_content, |language| {
4842                        &mut language.completions.get_or_insert_default().lsp_insert_mode
4843                    })
4844                },
4845            }),
4846            metadata: None,
4847            files: USER | LOCAL,
4848        }),
4849        SettingsPageItem::SectionHeader("Inlay Hints"),
4850        SettingsPageItem::SettingItem(SettingItem {
4851            title: "Enabled",
4852            description: "Global switch to toggle hints on and off",
4853            field: Box::new(SettingField {
4854                pick: |settings_content| {
4855                    language_settings_field(settings_content, |language| {
4856                        if let Some(inlay_hints) = &language.inlay_hints {
4857                            &inlay_hints.enabled
4858                        } else {
4859                            &None
4860                        }
4861                    })
4862                },
4863                pick_mut: |settings_content| {
4864                    language_settings_field_mut(settings_content, |language| {
4865                        &mut language.inlay_hints.get_or_insert_default().enabled
4866                    })
4867                },
4868            }),
4869            metadata: None,
4870            files: USER | LOCAL,
4871        }),
4872        SettingsPageItem::SettingItem(SettingItem {
4873            title: "Show Value Hints",
4874            description: "Global switch to toggle inline values on and off when debugging",
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_value_hints
4880                        } else {
4881                            &None
4882                        }
4883                    })
4884                },
4885                pick_mut: |settings_content| {
4886                    language_settings_field_mut(settings_content, |language| {
4887                        &mut language
4888                            .inlay_hints
4889                            .get_or_insert_default()
4890                            .show_value_hints
4891                    })
4892                },
4893            }),
4894            metadata: None,
4895            files: USER | LOCAL,
4896        }),
4897        SettingsPageItem::SettingItem(SettingItem {
4898            title: "Show Type Hints",
4899            description: "Whether type hints should be shown",
4900            field: Box::new(SettingField {
4901                pick: |settings_content| {
4902                    language_settings_field(settings_content, |language| {
4903                        if let Some(inlay_hints) = &language.inlay_hints {
4904                            &inlay_hints.show_type_hints
4905                        } else {
4906                            &None
4907                        }
4908                    })
4909                },
4910                pick_mut: |settings_content| {
4911                    language_settings_field_mut(settings_content, |language| {
4912                        &mut language.inlay_hints.get_or_insert_default().show_type_hints
4913                    })
4914                },
4915            }),
4916            metadata: None,
4917            files: USER | LOCAL,
4918        }),
4919        SettingsPageItem::SettingItem(SettingItem {
4920            title: "Show Parameter Hints",
4921            description: "Whether parameter 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_parameter_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_parameter_hints
4938                    })
4939                },
4940            }),
4941            metadata: None,
4942            files: USER | LOCAL,
4943        }),
4944        SettingsPageItem::SettingItem(SettingItem {
4945            title: "Show Other Hints",
4946            description: "Whether other hints should be shown",
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_other_hints
4952                        } else {
4953                            &None
4954                        }
4955                    })
4956                },
4957                pick_mut: |settings_content| {
4958                    language_settings_field_mut(settings_content, |language| {
4959                        &mut language
4960                            .inlay_hints
4961                            .get_or_insert_default()
4962                            .show_other_hints
4963                    })
4964                },
4965            }),
4966            metadata: None,
4967            files: USER | LOCAL,
4968        }),
4969        SettingsPageItem::SettingItem(SettingItem {
4970            title: "Show Background",
4971            description: "Whether to show a background for inlay hints",
4972            field: Box::new(SettingField {
4973                pick: |settings_content| {
4974                    language_settings_field(settings_content, |language| {
4975                        if let Some(inlay_hints) = &language.inlay_hints {
4976                            &inlay_hints.show_background
4977                        } else {
4978                            &None
4979                        }
4980                    })
4981                },
4982                pick_mut: |settings_content| {
4983                    language_settings_field_mut(settings_content, |language| {
4984                        &mut language.inlay_hints.get_or_insert_default().show_background
4985                    })
4986                },
4987            }),
4988            metadata: None,
4989            files: USER | LOCAL,
4990        }),
4991        SettingsPageItem::SettingItem(SettingItem {
4992            title: "Edit Debounce Ms",
4993            description: "Whether or not to debounce inlay hints updates after buffer edits (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.edit_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                            .edit_debounce_ms
5010                    })
5011                },
5012            }),
5013            metadata: None,
5014            files: USER | LOCAL,
5015        }),
5016        SettingsPageItem::SettingItem(SettingItem {
5017            title: "Scroll Debounce Ms",
5018            description: "Whether or not to debounce inlay hints updates after buffer scrolls (set to 0 to disable debouncing)",
5019            field: Box::new(SettingField {
5020                pick: |settings_content| {
5021                    language_settings_field(settings_content, |language| {
5022                        if let Some(inlay_hints) = &language.inlay_hints {
5023                            &inlay_hints.scroll_debounce_ms
5024                        } else {
5025                            &None
5026                        }
5027                    })
5028                },
5029                pick_mut: |settings_content| {
5030                    language_settings_field_mut(settings_content, |language| {
5031                        &mut language
5032                            .inlay_hints
5033                            .get_or_insert_default()
5034                            .scroll_debounce_ms
5035                    })
5036                },
5037            }),
5038            metadata: None,
5039            files: USER | LOCAL,
5040        }),
5041        SettingsPageItem::SettingItem(SettingItem {
5042            title: "Toggle On Modifiers Press",
5043            description: "Toggles inlay hints (hides or shows) when the user presses the modifiers specified",
5044            field: Box::new(
5045                SettingField {
5046                    pick: |settings_content| {
5047                        language_settings_field(settings_content, |language| {
5048                            if let Some(inlay_hints) = &language.inlay_hints {
5049                                &inlay_hints.toggle_on_modifiers_press
5050                            } else {
5051                                &None
5052                            }
5053                        })
5054                    },
5055                    pick_mut: |settings_content| {
5056                        language_settings_field_mut(settings_content, |language| {
5057                            &mut language
5058                                .inlay_hints
5059                                .get_or_insert_default()
5060                                .toggle_on_modifiers_press
5061                        })
5062                    },
5063                }
5064                .unimplemented(),
5065            ),
5066            metadata: None,
5067            files: USER | LOCAL,
5068        }),
5069        SettingsPageItem::SectionHeader("Tasks"),
5070        SettingsPageItem::SettingItem(SettingItem {
5071            title: "Enabled",
5072            description: "Whether tasks are enabled for this language",
5073            field: Box::new(SettingField {
5074                pick: |settings_content| {
5075                    language_settings_field(settings_content, |language| {
5076                        if let Some(tasks) = &language.tasks {
5077                            &tasks.enabled
5078                        } else {
5079                            &None
5080                        }
5081                    })
5082                },
5083                pick_mut: |settings_content| {
5084                    language_settings_field_mut(settings_content, |language| {
5085                        &mut language.tasks.get_or_insert_default().enabled
5086                    })
5087                },
5088            }),
5089            metadata: None,
5090            files: USER | LOCAL,
5091        }),
5092        SettingsPageItem::SettingItem(SettingItem {
5093            title: "Variables",
5094            description: "Extra task variables to set for a particular language",
5095            field: Box::new(
5096                SettingField {
5097                    pick: |settings_content| {
5098                        language_settings_field(settings_content, |language| {
5099                            if let Some(tasks) = &language.tasks {
5100                                &tasks.variables
5101                            } else {
5102                                &None
5103                            }
5104                        })
5105                    },
5106                    pick_mut: |settings_content| {
5107                        language_settings_field_mut(settings_content, |language| {
5108                            &mut language.tasks.get_or_insert_default().variables
5109                        })
5110                    },
5111                }
5112                .unimplemented(),
5113            ),
5114            metadata: None,
5115            files: USER | LOCAL,
5116        }),
5117        SettingsPageItem::SettingItem(SettingItem {
5118            title: "Prefer Lsp",
5119            description: "Use LSP tasks over Zed language extension ones",
5120            field: Box::new(SettingField {
5121                pick: |settings_content| {
5122                    language_settings_field(settings_content, |language| {
5123                        if let Some(tasks) = &language.tasks {
5124                            &tasks.prefer_lsp
5125                        } else {
5126                            &None
5127                        }
5128                    })
5129                },
5130                pick_mut: |settings_content| {
5131                    language_settings_field_mut(settings_content, |language| {
5132                        &mut language.tasks.get_or_insert_default().prefer_lsp
5133                    })
5134                },
5135            }),
5136            metadata: None,
5137            files: USER | LOCAL,
5138        }),
5139        SettingsPageItem::SectionHeader("Miscellaneous"),
5140        SettingsPageItem::SettingItem(SettingItem {
5141            title: "Debuggers",
5142            description: "Preferred debuggers for this language",
5143            field: Box::new(
5144                SettingField {
5145                    pick: |settings_content| {
5146                        language_settings_field(settings_content, |language| &language.debuggers)
5147                    },
5148                    pick_mut: |settings_content| {
5149                        language_settings_field_mut(settings_content, |language| {
5150                            &mut language.debuggers
5151                        })
5152                    },
5153                }
5154                .unimplemented(),
5155            ),
5156            metadata: None,
5157            files: USER | LOCAL,
5158        }),
5159        SettingsPageItem::SettingItem(SettingItem {
5160            title: "Extend Comment On Newline",
5161            description: "Whether to start a new line with a comment when a previous line is a comment as well",
5162            field: Box::new(SettingField {
5163                pick: |settings_content| {
5164                    language_settings_field(settings_content, |language| {
5165                        &language.extend_comment_on_newline
5166                    })
5167                },
5168                pick_mut: |settings_content| {
5169                    language_settings_field_mut(settings_content, |language| {
5170                        &mut language.extend_comment_on_newline
5171                    })
5172                },
5173            }),
5174            metadata: None,
5175            files: USER | LOCAL,
5176        }),
5177    ]
5178}