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