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