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