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::SettingItem(SettingItem {
2642                    title: "Default Width",
2643                    description: "Default width when the terminal is docked to the left or right",
2644                    field: Box::new(SettingField {
2645                        pick: |settings_content| {
2646                            if let Some(terminal) = &settings_content.terminal {
2647                                &terminal.default_width
2648                            } else {
2649                                &None
2650                            }
2651                        },
2652                        pick_mut: |settings_content| {
2653                            &mut settings_content
2654                                .terminal
2655                                .get_or_insert_default()
2656                                .default_width
2657                        },
2658                    }),
2659                    files: USER,
2660                    metadata: None,
2661                }),
2662                SettingsPageItem::SettingItem(SettingItem {
2663                    title: "Default Height",
2664                    description: "Default height when the terminal is docked to the bottom",
2665                    field: Box::new(SettingField {
2666                        pick: |settings_content| {
2667                            if let Some(terminal) = &settings_content.terminal {
2668                                &terminal.default_height
2669                            } else {
2670                                &None
2671                            }
2672                        },
2673                        pick_mut: |settings_content| {
2674                            &mut settings_content
2675                                .terminal
2676                                .get_or_insert_default()
2677                                .default_height
2678                        },
2679                    }),
2680                    files: USER,
2681                    metadata: None,
2682                }),
2683                SettingsPageItem::SettingItem(SettingItem {
2684                    title: "Blinking",
2685                    description: "Sets the cursor blinking behavior in the terminal",
2686                    field: Box::new(SettingField {
2687                        pick: |settings_content| {
2688                            if let Some(terminal) = &settings_content.terminal {
2689                                &terminal.blinking
2690                            } else {
2691                                &None
2692                            }
2693                        },
2694                        pick_mut: |settings_content| {
2695                            &mut settings_content.terminal.get_or_insert_default().blinking
2696                        },
2697                    }),
2698                    files: USER,
2699                    metadata: None,
2700                }),
2701                SettingsPageItem::SettingItem(SettingItem {
2702                    title: "Cursor Shape",
2703                    description: "Default cursor shape for the terminal",
2704                    field: Box::new(SettingField {
2705                        pick: |settings_content| {
2706                            if let Some(terminal) = &settings_content.terminal {
2707                                &terminal.cursor_shape
2708                            } else {
2709                                &None
2710                            }
2711                        },
2712                        pick_mut: |settings_content| {
2713                            &mut settings_content
2714                                .terminal
2715                                .get_or_insert_default()
2716                                .cursor_shape
2717                        },
2718                    }),
2719                    files: USER,
2720                    metadata: None,
2721                }),
2722                SettingsPageItem::SettingItem(SettingItem {
2723                    title: "Alternate Scroll",
2724                    description: "Sets whether Alternate Scroll mode is active by default",
2725                    field: Box::new(SettingField {
2726                        pick: |settings_content| {
2727                            if let Some(terminal) = &settings_content.terminal {
2728                                &terminal.alternate_scroll
2729                            } else {
2730                                &None
2731                            }
2732                        },
2733                        pick_mut: |settings_content| {
2734                            &mut settings_content
2735                                .terminal
2736                                .get_or_insert_default()
2737                                .alternate_scroll
2738                        },
2739                    }),
2740                    files: USER,
2741                    metadata: None,
2742                }),
2743                SettingsPageItem::SettingItem(SettingItem {
2744                    title: "Option As Meta",
2745                    description: "Sets whether the option key behaves as the meta key",
2746                    field: Box::new(SettingField {
2747                        pick: |settings_content| {
2748                            if let Some(terminal) = &settings_content.terminal {
2749                                &terminal.option_as_meta
2750                            } else {
2751                                &None
2752                            }
2753                        },
2754                        pick_mut: |settings_content| {
2755                            &mut settings_content
2756                                .terminal
2757                                .get_or_insert_default()
2758                                .option_as_meta
2759                        },
2760                    }),
2761                    files: USER,
2762                    metadata: None,
2763                }),
2764                SettingsPageItem::SettingItem(SettingItem {
2765                    title: "Copy On Select",
2766                    description: "Whether selecting text in the terminal automatically copies to clipboard",
2767                    field: Box::new(SettingField {
2768                        pick: |settings_content| {
2769                            if let Some(terminal) = &settings_content.terminal {
2770                                &terminal.copy_on_select
2771                            } else {
2772                                &None
2773                            }
2774                        },
2775                        pick_mut: |settings_content| {
2776                            &mut settings_content
2777                                .terminal
2778                                .get_or_insert_default()
2779                                .copy_on_select
2780                        },
2781                    }),
2782                    files: USER,
2783                    metadata: None,
2784                }),
2785                SettingsPageItem::SettingItem(SettingItem {
2786                    title: "Keep Selection On Copy",
2787                    description: "Whether to keep the text selection after copying it to the clipboard",
2788                    field: Box::new(SettingField {
2789                        pick: |settings_content| {
2790                            if let Some(terminal) = &settings_content.terminal {
2791                                &terminal.keep_selection_on_copy
2792                            } else {
2793                                &None
2794                            }
2795                        },
2796                        pick_mut: |settings_content| {
2797                            &mut settings_content
2798                                .terminal
2799                                .get_or_insert_default()
2800                                .keep_selection_on_copy
2801                        },
2802                    }),
2803                    metadata: None,
2804                    files: USER,
2805                }),
2806                SettingsPageItem::SettingItem(SettingItem {
2807                    title: "Max Scroll History Lines",
2808                    description: "The maximum number of lines to keep in the scrollback history",
2809                    field: Box::new(SettingField {
2810                        pick: |settings_content| {
2811                            if let Some(terminal) = &settings_content.terminal {
2812                                &terminal.max_scroll_history_lines
2813                            } else {
2814                                &None
2815                            }
2816                        },
2817                        pick_mut: |settings_content| {
2818                            &mut settings_content
2819                                .terminal
2820                                .get_or_insert_default()
2821                                .max_scroll_history_lines
2822                        },
2823                    }),
2824                    metadata: None,
2825                    files: USER,
2826                }),
2827                SettingsPageItem::SectionHeader("Outline Panel"),
2828                SettingsPageItem::SettingItem(SettingItem {
2829                    title: "Outline Panel Button",
2830                    description: "Whether to show the outline panel button in the status bar",
2831                    field: Box::new(SettingField {
2832                        pick: |settings_content| {
2833                            if let Some(outline_panel) = &settings_content.outline_panel {
2834                                &outline_panel.button
2835                            } else {
2836                                &None
2837                            }
2838                        },
2839                        pick_mut: |settings_content| {
2840                            &mut settings_content
2841                                .outline_panel
2842                                .get_or_insert_default()
2843                                .button
2844                        },
2845                    }),
2846                    metadata: None,
2847                    files: USER,
2848                }),
2849                SettingsPageItem::SettingItem(SettingItem {
2850                    title: "Outline Panel Dock",
2851                    description: "Where to dock the outline panel",
2852                    field: Box::new(SettingField {
2853                        pick: |settings_content| {
2854                            if let Some(outline_panel) = &settings_content.outline_panel {
2855                                &outline_panel.dock
2856                            } else {
2857                                &None
2858                            }
2859                        },
2860                        pick_mut: |settings_content| {
2861                            &mut settings_content.outline_panel.get_or_insert_default().dock
2862                        },
2863                    }),
2864                    metadata: None,
2865                    files: USER,
2866                }),
2867                SettingsPageItem::SettingItem(SettingItem {
2868                    title: "Outline Panel Default Width",
2869                    description: "Default width of the outline panel in pixels",
2870                    field: Box::new(SettingField {
2871                        pick: |settings_content| {
2872                            if let Some(outline_panel) = &settings_content.outline_panel {
2873                                &outline_panel.default_width
2874                            } else {
2875                                &None
2876                            }
2877                        },
2878                        pick_mut: |settings_content| {
2879                            &mut settings_content
2880                                .outline_panel
2881                                .get_or_insert_default()
2882                                .default_width
2883                        },
2884                    }),
2885                    metadata: None,
2886                    files: USER,
2887                }),
2888                SettingsPageItem::SettingItem(SettingItem {
2889                    title: "File Icons",
2890                    description: "Whether to show file icons in the outline panel",
2891                    field: Box::new(SettingField {
2892                        pick: |settings_content| {
2893                            if let Some(outline_panel) = &settings_content.outline_panel {
2894                                &outline_panel.file_icons
2895                            } else {
2896                                &None
2897                            }
2898                        },
2899                        pick_mut: |settings_content| {
2900                            &mut settings_content
2901                                .outline_panel
2902                                .get_or_insert_default()
2903                                .file_icons
2904                        },
2905                    }),
2906                    metadata: None,
2907                    files: USER,
2908                }),
2909                SettingsPageItem::SettingItem(SettingItem {
2910                    title: "Folder Icons",
2911                    description: "Whether to show folder icons or chevrons for directories in the outline panel",
2912                    field: Box::new(SettingField {
2913                        pick: |settings_content| {
2914                            if let Some(outline_panel) = &settings_content.outline_panel {
2915                                &outline_panel.folder_icons
2916                            } else {
2917                                &None
2918                            }
2919                        },
2920                        pick_mut: |settings_content| {
2921                            &mut settings_content
2922                                .outline_panel
2923                                .get_or_insert_default()
2924                                .folder_icons
2925                        },
2926                    }),
2927                    metadata: None,
2928                    files: USER,
2929                }),
2930                SettingsPageItem::SettingItem(SettingItem {
2931                    title: "Git Status",
2932                    description: "Whether to show the git status in the outline panel",
2933                    field: Box::new(SettingField {
2934                        pick: |settings_content| {
2935                            if let Some(outline_panel) = &settings_content.outline_panel {
2936                                &outline_panel.git_status
2937                            } else {
2938                                &None
2939                            }
2940                        },
2941                        pick_mut: |settings_content| {
2942                            &mut settings_content
2943                                .outline_panel
2944                                .get_or_insert_default()
2945                                .git_status
2946                        },
2947                    }),
2948                    metadata: None,
2949                    files: USER,
2950                }),
2951                SettingsPageItem::SettingItem(SettingItem {
2952                    title: "Indent Size",
2953                    description: "Amount of indentation for nested items",
2954                    field: Box::new(SettingField {
2955                        pick: |settings_content| {
2956                            if let Some(outline_panel) = &settings_content.outline_panel {
2957                                &outline_panel.indent_size
2958                            } else {
2959                                &None
2960                            }
2961                        },
2962                        pick_mut: |settings_content| {
2963                            &mut settings_content
2964                                .outline_panel
2965                                .get_or_insert_default()
2966                                .indent_size
2967                        },
2968                    }),
2969                    metadata: None,
2970                    files: USER,
2971                }),
2972                SettingsPageItem::SettingItem(SettingItem {
2973                    title: "Auto Reveal Entries",
2974                    description: "Whether to reveal when a corresponding outline entry becomes active",
2975                    field: Box::new(SettingField {
2976                        pick: |settings_content| {
2977                            if let Some(outline_panel) = &settings_content.outline_panel {
2978                                &outline_panel.auto_reveal_entries
2979                            } else {
2980                                &None
2981                            }
2982                        },
2983                        pick_mut: |settings_content| {
2984                            &mut settings_content
2985                                .outline_panel
2986                                .get_or_insert_default()
2987                                .auto_reveal_entries
2988                        },
2989                    }),
2990                    metadata: None,
2991                    files: USER,
2992                }),
2993                SettingsPageItem::SettingItem(SettingItem {
2994                    title: "Auto Fold Directories",
2995                    description: "Whether to fold directories automatically when a directory has only one directory inside",
2996                    field: Box::new(SettingField {
2997                        pick: |settings_content| {
2998                            if let Some(outline_panel) = &settings_content.outline_panel {
2999                                &outline_panel.auto_fold_dirs
3000                            } else {
3001                                &None
3002                            }
3003                        },
3004                        pick_mut: |settings_content| {
3005                            &mut settings_content
3006                                .outline_panel
3007                                .get_or_insert_default()
3008                                .auto_fold_dirs
3009                        },
3010                    }),
3011                    metadata: None,
3012                    files: USER,
3013                }),
3014                // files: USER,
3015                // SettingsPageItem::SettingItem(SettingItem {
3016                //     title: "Indent Guides Show",
3017                //     description: "When to show indent guides in the outline panel",
3018                //     field: Box::new(SettingField {
3019                //         pick: |settings_content| {
3020                //             if let Some(outline_panel) = &settings_content.outline_panel {
3021                //                 if let Some(indent_guides) = &outline_panel.indent_guides {
3022                //                     &indent_guides.show
3023                //                 } else {
3024                //                     &None
3025                //                 }
3026                //             } else {
3027                //                 &None
3028                //             }
3029                //         },
3030                //         pick_mut: |settings_content| {
3031                //             &mut settings_content
3032                //                 .outline_panel
3033                //                 .get_or_insert_default()
3034                //                 .indent_guides
3035                //                 .get_or_insert_default()
3036                //                 .show
3037                //         },
3038                //     }),
3039                //     metadata: None,
3040                // }),
3041                SettingsPageItem::SectionHeader("Git Panel"),
3042                SettingsPageItem::SettingItem(SettingItem {
3043                    title: "Button",
3044                    description: "Whether to show the git panel button in the status bar",
3045                    field: Box::new(SettingField {
3046                        pick: |settings_content| {
3047                            if let Some(git_panel) = &settings_content.git_panel {
3048                                &git_panel.button
3049                            } else {
3050                                &None
3051                            }
3052                        },
3053                        pick_mut: |settings_content| {
3054                            &mut settings_content.git_panel.get_or_insert_default().button
3055                        },
3056                    }),
3057                    metadata: None,
3058                    files: USER,
3059                }),
3060                SettingsPageItem::SettingItem(SettingItem {
3061                    title: "Dock",
3062                    description: "Where to dock the git panel",
3063                    field: Box::new(SettingField {
3064                        pick: |settings_content| {
3065                            if let Some(git_panel) = &settings_content.git_panel {
3066                                &git_panel.dock
3067                            } else {
3068                                &None
3069                            }
3070                        },
3071                        pick_mut: |settings_content| {
3072                            &mut settings_content.git_panel.get_or_insert_default().dock
3073                        },
3074                    }),
3075                    metadata: None,
3076                    files: USER,
3077                }),
3078                SettingsPageItem::SettingItem(SettingItem {
3079                    title: "Default Width",
3080                    description: "Default width of the git panel in pixels",
3081                    field: Box::new(SettingField {
3082                        pick: |settings_content| {
3083                            if let Some(git_panel) = &settings_content.git_panel {
3084                                &git_panel.default_width
3085                            } else {
3086                                &None
3087                            }
3088                        },
3089                        pick_mut: |settings_content| {
3090                            &mut settings_content
3091                                .git_panel
3092                                .get_or_insert_default()
3093                                .default_width
3094                        },
3095                    }),
3096                    metadata: None,
3097                    files: USER,
3098                }),
3099                SettingsPageItem::SectionHeader("Notification Panel"),
3100                SettingsPageItem::SettingItem(SettingItem {
3101                    title: "Notification Panel Button",
3102                    description: "Whether to show the notification panel button in the status bar",
3103                    field: Box::new(SettingField {
3104                        pick: |settings_content| {
3105                            if let Some(notification_panel) = &settings_content.notification_panel {
3106                                &notification_panel.button
3107                            } else {
3108                                &None
3109                            }
3110                        },
3111                        pick_mut: |settings_content| {
3112                            &mut settings_content
3113                                .notification_panel
3114                                .get_or_insert_default()
3115                                .button
3116                        },
3117                    }),
3118                    metadata: None,
3119                    files: USER,
3120                }),
3121                SettingsPageItem::SettingItem(SettingItem {
3122                    title: "Notification Panel Dock",
3123                    description: "Where to dock the notification panel",
3124                    field: Box::new(SettingField {
3125                        pick: |settings_content| {
3126                            if let Some(notification_panel) = &settings_content.notification_panel {
3127                                &notification_panel.dock
3128                            } else {
3129                                &None
3130                            }
3131                        },
3132                        pick_mut: |settings_content| {
3133                            &mut settings_content
3134                                .notification_panel
3135                                .get_or_insert_default()
3136                                .dock
3137                        },
3138                    }),
3139                    metadata: None,
3140                    files: USER,
3141                }),
3142                SettingsPageItem::SettingItem(SettingItem {
3143                    title: "Notification Panel Default Width",
3144                    description: "Default width of the notification panel in pixels",
3145                    field: Box::new(SettingField {
3146                        pick: |settings_content| {
3147                            if let Some(notification_panel) = &settings_content.notification_panel {
3148                                &notification_panel.default_width
3149                            } else {
3150                                &None
3151                            }
3152                        },
3153                        pick_mut: |settings_content| {
3154                            &mut settings_content
3155                                .notification_panel
3156                                .get_or_insert_default()
3157                                .default_width
3158                        },
3159                    }),
3160                    metadata: None,
3161                    files: USER,
3162                }),
3163                SettingsPageItem::SectionHeader("Collaboration Panel"),
3164                SettingsPageItem::SettingItem(SettingItem {
3165                    title: "Collaboration Panel Button",
3166                    description: "Whether to show the collaboration panel button in the status bar",
3167                    field: Box::new(SettingField {
3168                        pick: |settings_content| {
3169                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3170                            {
3171                                &collaboration_panel.button
3172                            } else {
3173                                &None
3174                            }
3175                        },
3176                        pick_mut: |settings_content| {
3177                            &mut settings_content
3178                                .collaboration_panel
3179                                .get_or_insert_default()
3180                                .button
3181                        },
3182                    }),
3183                    metadata: None,
3184                    files: USER,
3185                }),
3186                SettingsPageItem::SettingItem(SettingItem {
3187                    title: "Collaboration Panel Dock",
3188                    description: "Where to dock the collaboration panel",
3189                    field: Box::new(SettingField {
3190                        pick: |settings_content| {
3191                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3192                            {
3193                                &collaboration_panel.dock
3194                            } else {
3195                                &None
3196                            }
3197                        },
3198                        pick_mut: |settings_content| {
3199                            &mut settings_content
3200                                .collaboration_panel
3201                                .get_or_insert_default()
3202                                .dock
3203                        },
3204                    }),
3205                    metadata: None,
3206                    files: USER,
3207                }),
3208                SettingsPageItem::SettingItem(SettingItem {
3209                    title: "Collaboration Panel Default Width",
3210                    description: "Default width of the collaboration panel in pixels",
3211                    field: Box::new(SettingField {
3212                        pick: |settings_content| {
3213                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
3214                            {
3215                                &collaboration_panel.default_width
3216                            } else {
3217                                &None
3218                            }
3219                        },
3220                        pick_mut: |settings_content| {
3221                            &mut settings_content
3222                                .collaboration_panel
3223                                .get_or_insert_default()
3224                                .default_width
3225                        },
3226                    }),
3227                    metadata: None,
3228                    files: USER,
3229                }),
3230            ],
3231        },
3232        SettingsPage {
3233            title: "Version Control",
3234            items: vec![
3235                SettingsPageItem::SectionHeader("Git"),
3236                SettingsPageItem::SettingItem(SettingItem {
3237                    title: "Git Gutter",
3238                    description: "Control whether git status is shown in the editor's gutter",
3239                    field: Box::new(SettingField {
3240                        pick: |settings_content| {
3241                            if let Some(git) = &settings_content.git {
3242                                &git.git_gutter
3243                            } else {
3244                                &None
3245                            }
3246                        },
3247                        pick_mut: |settings_content| {
3248                            &mut settings_content.git.get_or_insert_default().git_gutter
3249                        },
3250                    }),
3251                    metadata: None,
3252                    files: USER,
3253                }),
3254                // todo(settings_ui): Figure out the right default for this value in default.json
3255                SettingsPageItem::SettingItem(SettingItem {
3256                    title: "Gutter Debounce",
3257                    description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
3258                    field: Box::new(SettingField {
3259                        pick: |settings_content| {
3260                            if let Some(git) = &settings_content.git {
3261                                &git.gutter_debounce
3262                            } else {
3263                                &None
3264                            }
3265                        },
3266                        pick_mut: |settings_content| {
3267                            &mut settings_content.git.get_or_insert_default().gutter_debounce
3268                        },
3269                    }),
3270                    metadata: None,
3271                    files: USER,
3272                }),
3273                SettingsPageItem::SettingItem(SettingItem {
3274                    title: "Inline Git Blame",
3275                    description: "Whether or not to show git blame data inline in the currently focused line",
3276                    field: Box::new(SettingField {
3277                        pick: |settings_content| {
3278                            if let Some(git) = &settings_content.git {
3279                                if let Some(inline_blame) = &git.inline_blame {
3280                                    &inline_blame.enabled
3281                                } else {
3282                                    &None
3283                                }
3284                            } else {
3285                                &None
3286                            }
3287                        },
3288                        pick_mut: |settings_content| {
3289                            &mut settings_content
3290                                .git
3291                                .get_or_insert_default()
3292                                .inline_blame
3293                                .get_or_insert_default()
3294                                .enabled
3295                        },
3296                    }),
3297                    metadata: None,
3298                    files: USER,
3299                }),
3300                SettingsPageItem::SettingItem(SettingItem {
3301                    title: "Inline Git Blame Delay",
3302                    description: "The delay after which the inline blame information is shown",
3303                    field: Box::new(SettingField {
3304                        pick: |settings_content| {
3305                            if let Some(git) = &settings_content.git {
3306                                if let Some(inline_blame) = &git.inline_blame {
3307                                    &inline_blame.delay_ms
3308                                } else {
3309                                    &None
3310                                }
3311                            } else {
3312                                &None
3313                            }
3314                        },
3315                        pick_mut: |settings_content| {
3316                            &mut settings_content
3317                                .git
3318                                .get_or_insert_default()
3319                                .inline_blame
3320                                .get_or_insert_default()
3321                                .delay_ms
3322                        },
3323                    }),
3324                    metadata: None,
3325                    files: USER,
3326                }),
3327                SettingsPageItem::SettingItem(SettingItem {
3328                    title: "Inline Git Blame Padding",
3329                    description: "Padding between the end of the source line and the start of the inline blame in columns",
3330                    field: Box::new(SettingField {
3331                        pick: |settings_content| {
3332                            if let Some(git) = &settings_content.git {
3333                                if let Some(inline_blame) = &git.inline_blame {
3334                                    &inline_blame.padding
3335                                } else {
3336                                    &None
3337                                }
3338                            } else {
3339                                &None
3340                            }
3341                        },
3342                        pick_mut: |settings_content| {
3343                            &mut settings_content
3344                                .git
3345                                .get_or_insert_default()
3346                                .inline_blame
3347                                .get_or_insert_default()
3348                                .padding
3349                        },
3350                    }),
3351                    metadata: None,
3352                    files: USER,
3353                }),
3354                SettingsPageItem::SettingItem(SettingItem {
3355                    title: "Inline Git Blame Min Column",
3356                    description: "The minimum column number to show the inline blame information at",
3357                    field: Box::new(SettingField {
3358                        pick: |settings_content| {
3359                            if let Some(git) = &settings_content.git {
3360                                if let Some(inline_blame) = &git.inline_blame {
3361                                    &inline_blame.min_column
3362                                } else {
3363                                    &None
3364                                }
3365                            } else {
3366                                &None
3367                            }
3368                        },
3369                        pick_mut: |settings_content| {
3370                            &mut settings_content
3371                                .git
3372                                .get_or_insert_default()
3373                                .inline_blame
3374                                .get_or_insert_default()
3375                                .min_column
3376                        },
3377                    }),
3378                    metadata: None,
3379                    files: USER,
3380                }),
3381                SettingsPageItem::SettingItem(SettingItem {
3382                    title: "Show Commit Summary",
3383                    description: "Whether to show commit summary as part of the inline blame",
3384                    field: Box::new(SettingField {
3385                        pick: |settings_content| {
3386                            if let Some(git) = &settings_content.git {
3387                                if let Some(inline_blame) = &git.inline_blame {
3388                                    &inline_blame.show_commit_summary
3389                                } else {
3390                                    &None
3391                                }
3392                            } else {
3393                                &None
3394                            }
3395                        },
3396                        pick_mut: |settings_content| {
3397                            &mut settings_content
3398                                .git
3399                                .get_or_insert_default()
3400                                .inline_blame
3401                                .get_or_insert_default()
3402                                .show_commit_summary
3403                        },
3404                    }),
3405                    metadata: None,
3406                    files: USER,
3407                }),
3408                SettingsPageItem::SettingItem(SettingItem {
3409                    title: "Show Avatar",
3410                    description: "Whether to show the avatar of the author of the commit",
3411                    field: Box::new(SettingField {
3412                        pick: |settings_content| {
3413                            if let Some(git) = &settings_content.git {
3414                                if let Some(blame) = &git.blame {
3415                                    &blame.show_avatar
3416                                } else {
3417                                    &None
3418                                }
3419                            } else {
3420                                &None
3421                            }
3422                        },
3423                        pick_mut: |settings_content| {
3424                            &mut settings_content
3425                                .git
3426                                .get_or_insert_default()
3427                                .blame
3428                                .get_or_insert_default()
3429                                .show_avatar
3430                        },
3431                    }),
3432                    metadata: None,
3433                    files: USER,
3434                }),
3435                SettingsPageItem::SettingItem(SettingItem {
3436                    title: "Show Author Name In Branch Picker",
3437                    description: "Whether to show author name as part of the commit information in branch picker",
3438                    field: Box::new(SettingField {
3439                        pick: |settings_content| {
3440                            if let Some(git) = &settings_content.git {
3441                                if let Some(branch_picker) = &git.branch_picker {
3442                                    &branch_picker.show_author_name
3443                                } else {
3444                                    &None
3445                                }
3446                            } else {
3447                                &None
3448                            }
3449                        },
3450                        pick_mut: |settings_content| {
3451                            &mut settings_content
3452                                .git
3453                                .get_or_insert_default()
3454                                .branch_picker
3455                                .get_or_insert_default()
3456                                .show_author_name
3457                        },
3458                    }),
3459                    metadata: None,
3460                    files: USER,
3461                }),
3462                SettingsPageItem::SettingItem(SettingItem {
3463                    title: "Hunk Style",
3464                    description: "How git hunks are displayed visually in the editor",
3465                    field: Box::new(SettingField {
3466                        pick: |settings_content| {
3467                            if let Some(git) = &settings_content.git {
3468                                &git.hunk_style
3469                            } else {
3470                                &None
3471                            }
3472                        },
3473                        pick_mut: |settings_content| {
3474                            &mut settings_content.git.get_or_insert_default().hunk_style
3475                        },
3476                    }),
3477                    metadata: None,
3478                    files: USER,
3479                }),
3480            ],
3481        },
3482        SettingsPage {
3483            title: "System & Network",
3484            items: vec![
3485                SettingsPageItem::SectionHeader("Network"),
3486                // todo(settings_ui): Proxy needs a default
3487                // files: USER,
3488                // SettingsPageItem::SettingItem(SettingItem {
3489                //     title: "Proxy",
3490                //     description: "The proxy to use for network requests",
3491                //     field: Box::new(SettingField {
3492                //         pick: |settings_content| &settings_content.proxy,
3493                //         pick_mut: |settings_content| &mut settings_content.proxy,
3494                //     }),
3495                //     metadata: Some(Box::new(SettingsFieldMetadata {
3496                //         placeholder: Some("socks5h://localhost:10808"),
3497                //     })),
3498                // }),
3499                SettingsPageItem::SettingItem(SettingItem {
3500                    title: "Server URL",
3501                    description: "The URL of the Zed server to connect to",
3502                    field: Box::new(SettingField {
3503                        pick: |settings_content| &settings_content.server_url,
3504                        pick_mut: |settings_content| &mut settings_content.server_url,
3505                    }),
3506                    metadata: Some(Box::new(SettingsFieldMetadata {
3507                        placeholder: Some("https://zed.dev"),
3508                    })),
3509                    files: USER,
3510                }),
3511                SettingsPageItem::SectionHeader("System"),
3512                SettingsPageItem::SettingItem(SettingItem {
3513                    title: "Auto Update",
3514                    description: "Whether or not to automatically check for updates",
3515                    field: Box::new(SettingField {
3516                        pick: |settings_content| &settings_content.auto_update,
3517                        pick_mut: |settings_content| &mut settings_content.auto_update,
3518                    }),
3519                    metadata: None,
3520                    files: USER,
3521                }),
3522            ],
3523        },
3524        SettingsPage {
3525            title: "Diagnostics & Errors",
3526            items: vec![
3527                SettingsPageItem::SectionHeader("Filtering"),
3528                SettingsPageItem::SettingItem(SettingItem {
3529                    title: "Max Severity",
3530                    description: "Which level to use to filter out diagnostics displayed in the editor",
3531                    field: Box::new(SettingField {
3532                        pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
3533                        pick_mut: |settings_content| {
3534                            &mut settings_content.editor.diagnostics_max_severity
3535                        },
3536                    }),
3537                    metadata: None,
3538                    files: USER,
3539                }),
3540                SettingsPageItem::SettingItem(SettingItem {
3541                    title: "Include Warnings",
3542                    description: "Whether to show warnings or not by default",
3543                    field: Box::new(SettingField {
3544                        pick: |settings_content| {
3545                            if let Some(diagnostics) = &settings_content.diagnostics {
3546                                &diagnostics.include_warnings
3547                            } else {
3548                                &None
3549                            }
3550                        },
3551                        pick_mut: |settings_content| {
3552                            &mut settings_content
3553                                .diagnostics
3554                                .get_or_insert_default()
3555                                .include_warnings
3556                        },
3557                    }),
3558                    metadata: None,
3559                    files: USER,
3560                }),
3561                SettingsPageItem::SectionHeader("Inline"),
3562                SettingsPageItem::SettingItem(SettingItem {
3563                    title: "Inline Diagnostics Enabled",
3564                    description: "Whether to show diagnostics inline or not",
3565                    field: Box::new(SettingField {
3566                        pick: |settings_content| {
3567                            if let Some(diagnostics) = &settings_content.diagnostics {
3568                                if let Some(inline) = &diagnostics.inline {
3569                                    &inline.enabled
3570                                } else {
3571                                    &None
3572                                }
3573                            } else {
3574                                &None
3575                            }
3576                        },
3577                        pick_mut: |settings_content| {
3578                            &mut settings_content
3579                                .diagnostics
3580                                .get_or_insert_default()
3581                                .inline
3582                                .get_or_insert_default()
3583                                .enabled
3584                        },
3585                    }),
3586                    metadata: None,
3587                    files: USER,
3588                }),
3589                SettingsPageItem::SettingItem(SettingItem {
3590                    title: "Inline Update Debounce",
3591                    description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
3592                    field: Box::new(SettingField {
3593                        pick: |settings_content| {
3594                            if let Some(diagnostics) = &settings_content.diagnostics {
3595                                if let Some(inline) = &diagnostics.inline {
3596                                    &inline.update_debounce_ms
3597                                } else {
3598                                    &None
3599                                }
3600                            } else {
3601                                &None
3602                            }
3603                        },
3604                        pick_mut: |settings_content| {
3605                            &mut settings_content
3606                                .diagnostics
3607                                .get_or_insert_default()
3608                                .inline
3609                                .get_or_insert_default()
3610                                .update_debounce_ms
3611                        },
3612                    }),
3613                    metadata: None,
3614                    files: USER,
3615                }),
3616                SettingsPageItem::SettingItem(SettingItem {
3617                    title: "Inline Padding",
3618                    description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
3619                    field: Box::new(SettingField {
3620                        pick: |settings_content| {
3621                            if let Some(diagnostics) = &settings_content.diagnostics {
3622                                if let Some(inline) = &diagnostics.inline {
3623                                    &inline.padding
3624                                } else {
3625                                    &None
3626                                }
3627                            } else {
3628                                &None
3629                            }
3630                        },
3631                        pick_mut: |settings_content| {
3632                            &mut settings_content
3633                                .diagnostics
3634                                .get_or_insert_default()
3635                                .inline
3636                                .get_or_insert_default()
3637                                .padding
3638                        },
3639                    }),
3640                    metadata: None,
3641                    files: USER,
3642                }),
3643                SettingsPageItem::SettingItem(SettingItem {
3644                    title: "Inline Min Column",
3645                    description: "The minimum column to display inline diagnostics",
3646                    field: Box::new(SettingField {
3647                        pick: |settings_content| {
3648                            if let Some(diagnostics) = &settings_content.diagnostics {
3649                                if let Some(inline) = &diagnostics.inline {
3650                                    &inline.min_column
3651                                } else {
3652                                    &None
3653                                }
3654                            } else {
3655                                &None
3656                            }
3657                        },
3658                        pick_mut: |settings_content| {
3659                            &mut settings_content
3660                                .diagnostics
3661                                .get_or_insert_default()
3662                                .inline
3663                                .get_or_insert_default()
3664                                .min_column
3665                        },
3666                    }),
3667                    metadata: None,
3668                    files: USER,
3669                }),
3670                SettingsPageItem::SectionHeader("Performance"),
3671                SettingsPageItem::SettingItem(SettingItem {
3672                    title: "LSP Pull Diagnostics Enabled",
3673                    description: "Whether to pull for language server-powered diagnostics or not",
3674                    field: Box::new(SettingField {
3675                        pick: |settings_content| {
3676                            if let Some(diagnostics) = &settings_content.diagnostics {
3677                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3678                                    &lsp_pull.enabled
3679                                } else {
3680                                    &None
3681                                }
3682                            } else {
3683                                &None
3684                            }
3685                        },
3686                        pick_mut: |settings_content| {
3687                            &mut settings_content
3688                                .diagnostics
3689                                .get_or_insert_default()
3690                                .lsp_pull_diagnostics
3691                                .get_or_insert_default()
3692                                .enabled
3693                        },
3694                    }),
3695                    metadata: None,
3696                    files: USER,
3697                }),
3698                // todo(settings_ui): Needs unit
3699                SettingsPageItem::SettingItem(SettingItem {
3700                    title: "LSP Pull Debounce",
3701                    description: "Minimum time to wait before pulling diagnostics from the language server(s)",
3702                    field: Box::new(SettingField {
3703                        pick: |settings_content| {
3704                            if let Some(diagnostics) = &settings_content.diagnostics {
3705                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
3706                                    &lsp_pull.debounce_ms
3707                                } else {
3708                                    &None
3709                                }
3710                            } else {
3711                                &None
3712                            }
3713                        },
3714                        pick_mut: |settings_content| {
3715                            &mut settings_content
3716                                .diagnostics
3717                                .get_or_insert_default()
3718                                .lsp_pull_diagnostics
3719                                .get_or_insert_default()
3720                                .debounce_ms
3721                        },
3722                    }),
3723                    metadata: None,
3724                    files: USER,
3725                }),
3726            ],
3727        },
3728        SettingsPage {
3729            title: "Debugger",
3730            items: vec![
3731                SettingsPageItem::SectionHeader("General"),
3732                SettingsPageItem::SettingItem(SettingItem {
3733                    title: "Stepping Granularity",
3734                    description: "Determines the stepping granularity for debug operations",
3735                    field: Box::new(SettingField {
3736                        pick: |settings_content| {
3737                            if let Some(debugger) = &settings_content.debugger {
3738                                &debugger.stepping_granularity
3739                            } else {
3740                                &None
3741                            }
3742                        },
3743                        pick_mut: |settings_content| {
3744                            &mut settings_content
3745                                .debugger
3746                                .get_or_insert_default()
3747                                .stepping_granularity
3748                        },
3749                    }),
3750                    metadata: None,
3751                    files: USER,
3752                }),
3753                SettingsPageItem::SettingItem(SettingItem {
3754                    title: "Save Breakpoints",
3755                    description: "Whether breakpoints should be reused across Zed sessions",
3756                    field: Box::new(SettingField {
3757                        pick: |settings_content| {
3758                            if let Some(debugger) = &settings_content.debugger {
3759                                &debugger.save_breakpoints
3760                            } else {
3761                                &None
3762                            }
3763                        },
3764                        pick_mut: |settings_content| {
3765                            &mut settings_content
3766                                .debugger
3767                                .get_or_insert_default()
3768                                .save_breakpoints
3769                        },
3770                    }),
3771                    metadata: None,
3772                    files: USER,
3773                }),
3774                SettingsPageItem::SettingItem(SettingItem {
3775                    title: "Timeout",
3776                    description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter",
3777                    field: Box::new(SettingField {
3778                        pick: |settings_content| {
3779                            if let Some(debugger) = &settings_content.debugger {
3780                                &debugger.timeout
3781                            } else {
3782                                &None
3783                            }
3784                        },
3785                        pick_mut: |settings_content| {
3786                            &mut settings_content.debugger.get_or_insert_default().timeout
3787                        },
3788                    }),
3789                    metadata: None,
3790                    files: USER,
3791                }),
3792                SettingsPageItem::SettingItem(SettingItem {
3793                    title: "Dock",
3794                    description: "The dock position of the debug panel",
3795                    field: Box::new(SettingField {
3796                        pick: |settings_content| {
3797                            if let Some(debugger) = &settings_content.debugger {
3798                                &debugger.dock
3799                            } else {
3800                                &None
3801                            }
3802                        },
3803                        pick_mut: |settings_content| {
3804                            &mut settings_content.debugger.get_or_insert_default().dock
3805                        },
3806                    }),
3807                    metadata: None,
3808                    files: USER,
3809                }),
3810                SettingsPageItem::SettingItem(SettingItem {
3811                    title: "Log DAP Communications",
3812                    description: "Whether to log messages between active debug adapters and Zed",
3813                    field: Box::new(SettingField {
3814                        pick: |settings_content| {
3815                            if let Some(debugger) = &settings_content.debugger {
3816                                &debugger.log_dap_communications
3817                            } else {
3818                                &None
3819                            }
3820                        },
3821                        pick_mut: |settings_content| {
3822                            &mut settings_content
3823                                .debugger
3824                                .get_or_insert_default()
3825                                .log_dap_communications
3826                        },
3827                    }),
3828                    metadata: None,
3829                    files: USER,
3830                }),
3831                SettingsPageItem::SettingItem(SettingItem {
3832                    title: "Format DAP Log Messages",
3833                    description: "Whether to format DAP messages when adding them to debug adapter logger",
3834                    field: Box::new(SettingField {
3835                        pick: |settings_content| {
3836                            if let Some(debugger) = &settings_content.debugger {
3837                                &debugger.format_dap_log_messages
3838                            } else {
3839                                &None
3840                            }
3841                        },
3842                        pick_mut: |settings_content| {
3843                            &mut settings_content
3844                                .debugger
3845                                .get_or_insert_default()
3846                                .format_dap_log_messages
3847                        },
3848                    }),
3849                    metadata: None,
3850                    files: USER,
3851                }),
3852                SettingsPageItem::SettingItem(SettingItem {
3853                    title: "Button",
3854                    description: "Whether to show the debug button in the status bar",
3855                    field: Box::new(SettingField {
3856                        pick: |settings_content| {
3857                            if let Some(debugger) = &settings_content.debugger {
3858                                &debugger.button
3859                            } else {
3860                                &None
3861                            }
3862                        },
3863                        pick_mut: |settings_content| {
3864                            &mut settings_content.debugger.get_or_insert_default().button
3865                        },
3866                    }),
3867                    metadata: None,
3868                    files: USER,
3869                }),
3870            ],
3871        },
3872        SettingsPage {
3873            title: "Collaboration",
3874            items: vec![
3875                SettingsPageItem::SectionHeader("Calls"),
3876                SettingsPageItem::SettingItem(SettingItem {
3877                    title: "Mute On Join",
3878                    description: "Whether the microphone should be muted when joining a channel or a call",
3879                    field: Box::new(SettingField {
3880                        pick: |settings_content| {
3881                            if let Some(calls) = &settings_content.calls {
3882                                &calls.mute_on_join
3883                            } else {
3884                                &None
3885                            }
3886                        },
3887                        pick_mut: |settings_content| {
3888                            &mut settings_content.calls.get_or_insert_default().mute_on_join
3889                        },
3890                    }),
3891                    metadata: None,
3892                    files: USER,
3893                }),
3894                SettingsPageItem::SettingItem(SettingItem {
3895                    title: "Share On Join",
3896                    description: "Whether your current project should be shared when joining an empty channel",
3897                    field: Box::new(SettingField {
3898                        pick: |settings_content| {
3899                            if let Some(calls) = &settings_content.calls {
3900                                &calls.share_on_join
3901                            } else {
3902                                &None
3903                            }
3904                        },
3905                        pick_mut: |settings_content| {
3906                            &mut settings_content.calls.get_or_insert_default().share_on_join
3907                        },
3908                    }),
3909                    metadata: None,
3910                    files: USER,
3911                }),
3912                SettingsPageItem::SectionHeader("Experimental"),
3913                SettingsPageItem::SettingItem(SettingItem {
3914                    title: "Rodio Audio",
3915                    description: "Opt into the new audio system",
3916                    field: Box::new(SettingField {
3917                        pick: |settings_content| {
3918                            if let Some(audio) = &settings_content.audio {
3919                                &audio.rodio_audio
3920                            } else {
3921                                &None
3922                            }
3923                        },
3924                        pick_mut: |settings_content| {
3925                            &mut settings_content.audio.get_or_insert_default().rodio_audio
3926                        },
3927                    }),
3928                    metadata: None,
3929                    files: USER,
3930                }),
3931                SettingsPageItem::SettingItem(SettingItem {
3932                    title: "Auto Microphone Volume",
3933                    description: "Automatically adjust microphone volume (requires Rodio Audio)",
3934                    field: Box::new(SettingField {
3935                        pick: |settings_content| {
3936                            if let Some(audio) = &settings_content.audio {
3937                                &audio.auto_microphone_volume
3938                            } else {
3939                                &None
3940                            }
3941                        },
3942                        pick_mut: |settings_content| {
3943                            &mut settings_content
3944                                .audio
3945                                .get_or_insert_default()
3946                                .auto_microphone_volume
3947                        },
3948                    }),
3949                    metadata: None,
3950                    files: USER,
3951                }),
3952                SettingsPageItem::SettingItem(SettingItem {
3953                    title: "Auto Speaker Volume",
3954                    description: "Automatically adjust volume of other call members (requires Rodio Audio)",
3955                    field: Box::new(SettingField {
3956                        pick: |settings_content| {
3957                            if let Some(audio) = &settings_content.audio {
3958                                &audio.auto_speaker_volume
3959                            } else {
3960                                &None
3961                            }
3962                        },
3963                        pick_mut: |settings_content| {
3964                            &mut settings_content
3965                                .audio
3966                                .get_or_insert_default()
3967                                .auto_speaker_volume
3968                        },
3969                    }),
3970                    metadata: None,
3971                    files: USER,
3972                }),
3973                SettingsPageItem::SettingItem(SettingItem {
3974                    title: "Denoise",
3975                    description: "Remove background noises (requires Rodio Audio)",
3976                    field: Box::new(SettingField {
3977                        pick: |settings_content| {
3978                            if let Some(audio) = &settings_content.audio {
3979                                &audio.denoise
3980                            } else {
3981                                &None
3982                            }
3983                        },
3984                        pick_mut: |settings_content| {
3985                            &mut settings_content.audio.get_or_insert_default().denoise
3986                        },
3987                    }),
3988                    metadata: None,
3989                    files: USER,
3990                }),
3991                SettingsPageItem::SettingItem(SettingItem {
3992                    title: "Legacy Audio Compatible",
3993                    description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
3994                    field: Box::new(SettingField {
3995                        pick: |settings_content| {
3996                            if let Some(audio) = &settings_content.audio {
3997                                &audio.legacy_audio_compatible
3998                            } else {
3999                                &None
4000                            }
4001                        },
4002                        pick_mut: |settings_content| {
4003                            &mut settings_content
4004                                .audio
4005                                .get_or_insert_default()
4006                                .legacy_audio_compatible
4007                        },
4008                    }),
4009                    metadata: None,
4010                    files: USER,
4011                }),
4012            ],
4013        },
4014        SettingsPage {
4015            title: "AI",
4016            items: vec![
4017                SettingsPageItem::SectionHeader("General"),
4018                SettingsPageItem::SettingItem(SettingItem {
4019                    title: "Disable AI",
4020                    description: "Whether to disable all AI features in Zed",
4021                    field: Box::new(SettingField {
4022                        pick: |settings_content| &settings_content.disable_ai,
4023                        pick_mut: |settings_content| &mut settings_content.disable_ai,
4024                    }),
4025                    metadata: None,
4026                    files: USER,
4027                }),
4028            ],
4029        },
4030    ]
4031}
4032
4033const LANGUAGES_SECTION_HEADER: &'static str = "Languages";
4034
4035fn language_settings_data() -> Vec<SettingsPageItem> {
4036    fn current_language() -> Option<SharedString> {
4037        sub_page_stack().iter().find_map(|page| {
4038            (page.section_header == LANGUAGES_SECTION_HEADER)
4039                .then(|| SharedString::new_static(page.link.title))
4040        })
4041    }
4042
4043    fn language_settings_field<T>(
4044        settings_content: &SettingsContent,
4045        get: fn(&LanguageSettingsContent) -> &Option<T>,
4046    ) -> &Option<T> {
4047        let all_languages = &settings_content.project.all_languages;
4048        if let Some(current_language_name) = current_language() {
4049            if let Some(current_language) = all_languages.languages.0.get(&current_language_name) {
4050                let value = get(current_language);
4051                if value.is_some() {
4052                    return value;
4053                }
4054            }
4055        }
4056        let default_value = get(&all_languages.defaults);
4057        return default_value;
4058    }
4059
4060    fn language_settings_field_mut<T>(
4061        settings_content: &mut SettingsContent,
4062        get: fn(&mut LanguageSettingsContent) -> &mut Option<T>,
4063    ) -> &mut Option<T> {
4064        let all_languages = &mut settings_content.project.all_languages;
4065        let language_content = if let Some(current_language) = current_language() {
4066            all_languages
4067                .languages
4068                .0
4069                .entry(current_language)
4070                .or_default()
4071        } else {
4072            &mut all_languages.defaults
4073        };
4074        return get(language_content);
4075    }
4076
4077    vec![
4078        SettingsPageItem::SectionHeader("Indentation"),
4079        SettingsPageItem::SettingItem(SettingItem {
4080            title: "Tab Size",
4081            description: "How many columns a tab should occupy",
4082            field: Box::new(SettingField {
4083                pick: |settings_content| {
4084                    language_settings_field(settings_content, |language| &language.tab_size)
4085                },
4086                pick_mut: |settings_content| {
4087                    language_settings_field_mut(settings_content, |language| &mut language.tab_size)
4088                },
4089            }),
4090            metadata: None,
4091            files: USER | LOCAL,
4092        }),
4093        SettingsPageItem::SettingItem(SettingItem {
4094            title: "Hard Tabs",
4095            description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
4096            field: Box::new(SettingField {
4097                pick: |settings_content| {
4098                    language_settings_field(settings_content, |language| &language.hard_tabs)
4099                },
4100                pick_mut: |settings_content| {
4101                    language_settings_field_mut(settings_content, |language| {
4102                        &mut language.hard_tabs
4103                    })
4104                },
4105            }),
4106            metadata: None,
4107            files: USER | LOCAL,
4108        }),
4109        SettingsPageItem::SettingItem(SettingItem {
4110            title: "Auto Indent",
4111            description: "Whether indentation should be adjusted based on the context whilst typing",
4112            field: Box::new(SettingField {
4113                pick: |settings_content| {
4114                    language_settings_field(settings_content, |language| &language.auto_indent)
4115                },
4116                pick_mut: |settings_content| {
4117                    language_settings_field_mut(settings_content, |language| {
4118                        &mut language.auto_indent
4119                    })
4120                },
4121            }),
4122            metadata: None,
4123            files: USER | LOCAL,
4124        }),
4125        SettingsPageItem::SettingItem(SettingItem {
4126            title: "Auto Indent On Paste",
4127            description: "Whether indentation of pasted content should be adjusted based on the context",
4128            field: Box::new(SettingField {
4129                pick: |settings_content| {
4130                    language_settings_field(settings_content, |language| {
4131                        &language.auto_indent_on_paste
4132                    })
4133                },
4134                pick_mut: |settings_content| {
4135                    language_settings_field_mut(settings_content, |language| {
4136                        &mut language.auto_indent_on_paste
4137                    })
4138                },
4139            }),
4140            metadata: None,
4141            files: USER | LOCAL,
4142        }),
4143        SettingsPageItem::SectionHeader("Wrapping"),
4144        SettingsPageItem::SettingItem(SettingItem {
4145            title: "Soft Wrap",
4146            description: "How to soft-wrap long lines of text",
4147            field: Box::new(SettingField {
4148                pick: |settings_content| {
4149                    language_settings_field(settings_content, |language| &language.soft_wrap)
4150                },
4151                pick_mut: |settings_content| {
4152                    language_settings_field_mut(settings_content, |language| {
4153                        &mut language.soft_wrap
4154                    })
4155                },
4156            }),
4157            metadata: None,
4158            files: USER | LOCAL,
4159        }),
4160        SettingsPageItem::SettingItem(SettingItem {
4161            title: "Show Wrap Guides",
4162            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",
4163            field: Box::new(SettingField {
4164                pick: |settings_content| {
4165                    language_settings_field(settings_content, |language| &language.show_wrap_guides)
4166                },
4167                pick_mut: |settings_content| {
4168                    language_settings_field_mut(settings_content, |language| {
4169                        &mut language.show_wrap_guides
4170                    })
4171                },
4172            }),
4173            metadata: None,
4174            files: USER | LOCAL,
4175        }),
4176        SettingsPageItem::SettingItem(SettingItem {
4177            title: "Preferred Line Length",
4178            description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
4179            field: Box::new(SettingField {
4180                pick: |settings_content| {
4181                    language_settings_field(settings_content, |language| {
4182                        &language.preferred_line_length
4183                    })
4184                },
4185                pick_mut: |settings_content| {
4186                    language_settings_field_mut(settings_content, |language| {
4187                        &mut language.preferred_line_length
4188                    })
4189                },
4190            }),
4191            metadata: None,
4192            files: USER | LOCAL,
4193        }),
4194        SettingsPageItem::SettingItem(SettingItem {
4195            title: "Wrap Guides",
4196            description: "Character counts at which to show wrap guides in the editor",
4197            field: Box::new(
4198                SettingField {
4199                    pick: |settings_content| {
4200                        language_settings_field(settings_content, |language| &language.wrap_guides)
4201                    },
4202                    pick_mut: |settings_content| {
4203                        language_settings_field_mut(settings_content, |language| {
4204                            &mut language.wrap_guides
4205                        })
4206                    },
4207                }
4208                .unimplemented(),
4209            ),
4210            metadata: None,
4211            files: USER | LOCAL,
4212        }),
4213        SettingsPageItem::SettingItem(SettingItem {
4214            title: "Allow Rewrap",
4215            description: "Controls where the `editor::Rewrap` action is allowed for this language",
4216            field: Box::new(SettingField {
4217                pick: |settings_content| {
4218                    language_settings_field(settings_content, |language| &language.allow_rewrap)
4219                },
4220                pick_mut: |settings_content| {
4221                    language_settings_field_mut(settings_content, |language| {
4222                        &mut language.allow_rewrap
4223                    })
4224                },
4225            }),
4226            metadata: None,
4227            files: USER | LOCAL,
4228        }),
4229        SettingsPageItem::SectionHeader("Indent Guides"),
4230        SettingsPageItem::SettingItem(SettingItem {
4231            title: "Enabled",
4232            description: "Whether to display indent guides in the editor",
4233            field: Box::new(SettingField {
4234                pick: |settings_content| {
4235                    language_settings_field(settings_content, |language| {
4236                        if let Some(indent_guides) = &language.indent_guides {
4237                            &indent_guides.enabled
4238                        } else {
4239                            &None
4240                        }
4241                    })
4242                },
4243                pick_mut: |settings_content| {
4244                    language_settings_field_mut(settings_content, |language| {
4245                        &mut language.indent_guides.get_or_insert_default().enabled
4246                    })
4247                },
4248            }),
4249            metadata: None,
4250            files: USER | LOCAL,
4251        }),
4252        SettingsPageItem::SettingItem(SettingItem {
4253            title: "Line Width",
4254            description: "The width of the indent guides in pixels, between 1 and 10",
4255            field: Box::new(SettingField {
4256                pick: |settings_content| {
4257                    language_settings_field(settings_content, |language| {
4258                        if let Some(indent_guides) = &language.indent_guides {
4259                            &indent_guides.line_width
4260                        } else {
4261                            &None
4262                        }
4263                    })
4264                },
4265                pick_mut: |settings_content| {
4266                    language_settings_field_mut(settings_content, |language| {
4267                        &mut language.indent_guides.get_or_insert_default().line_width
4268                    })
4269                },
4270            }),
4271            metadata: None,
4272            files: USER | LOCAL,
4273        }),
4274        SettingsPageItem::SettingItem(SettingItem {
4275            title: "Active Line Width",
4276            description: "The width of the active indent guide in pixels, between 1 and 10",
4277            field: Box::new(SettingField {
4278                pick: |settings_content| {
4279                    language_settings_field(settings_content, |language| {
4280                        if let Some(indent_guides) = &language.indent_guides {
4281                            &indent_guides.active_line_width
4282                        } else {
4283                            &None
4284                        }
4285                    })
4286                },
4287                pick_mut: |settings_content| {
4288                    language_settings_field_mut(settings_content, |language| {
4289                        &mut language
4290                            .indent_guides
4291                            .get_or_insert_default()
4292                            .active_line_width
4293                    })
4294                },
4295            }),
4296            metadata: None,
4297            files: USER | LOCAL,
4298        }),
4299        SettingsPageItem::SettingItem(SettingItem {
4300            title: "Coloring",
4301            description: "Determines how indent guides are colored",
4302            field: Box::new(SettingField {
4303                pick: |settings_content| {
4304                    language_settings_field(settings_content, |language| {
4305                        if let Some(indent_guides) = &language.indent_guides {
4306                            &indent_guides.coloring
4307                        } else {
4308                            &None
4309                        }
4310                    })
4311                },
4312                pick_mut: |settings_content| {
4313                    language_settings_field_mut(settings_content, |language| {
4314                        &mut language.indent_guides.get_or_insert_default().coloring
4315                    })
4316                },
4317            }),
4318            metadata: None,
4319            files: USER | LOCAL,
4320        }),
4321        SettingsPageItem::SettingItem(SettingItem {
4322            title: "Background Coloring",
4323            description: "Determines how indent guide backgrounds are colored",
4324            field: Box::new(SettingField {
4325                pick: |settings_content| {
4326                    language_settings_field(settings_content, |language| {
4327                        if let Some(indent_guides) = &language.indent_guides {
4328                            &indent_guides.background_coloring
4329                        } else {
4330                            &None
4331                        }
4332                    })
4333                },
4334                pick_mut: |settings_content| {
4335                    language_settings_field_mut(settings_content, |language| {
4336                        &mut language
4337                            .indent_guides
4338                            .get_or_insert_default()
4339                            .background_coloring
4340                    })
4341                },
4342            }),
4343            metadata: None,
4344            files: USER | LOCAL,
4345        }),
4346        SettingsPageItem::SectionHeader("Formatting"),
4347        SettingsPageItem::SettingItem(SettingItem {
4348            title: "Format On Save",
4349            description: "Whether or not to perform a buffer format before saving",
4350            field: Box::new(
4351                // TODO(settings_ui): this setting should just be a bool
4352                SettingField {
4353                    pick: |settings_content| {
4354                        language_settings_field(settings_content, |language| {
4355                            &language.format_on_save
4356                        })
4357                    },
4358                    pick_mut: |settings_content| {
4359                        language_settings_field_mut(settings_content, |language| {
4360                            &mut language.format_on_save
4361                        })
4362                    },
4363                },
4364            ),
4365            metadata: None,
4366            files: USER | LOCAL,
4367        }),
4368        SettingsPageItem::SettingItem(SettingItem {
4369            title: "Remove Trailing Whitespace On Save",
4370            description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
4371            field: Box::new(SettingField {
4372                pick: |settings_content| {
4373                    language_settings_field(settings_content, |language| {
4374                        &language.remove_trailing_whitespace_on_save
4375                    })
4376                },
4377                pick_mut: |settings_content| {
4378                    language_settings_field_mut(settings_content, |language| {
4379                        &mut language.remove_trailing_whitespace_on_save
4380                    })
4381                },
4382            }),
4383            metadata: None,
4384            files: USER | LOCAL,
4385        }),
4386        SettingsPageItem::SettingItem(SettingItem {
4387            title: "Ensure Final Newline On Save",
4388            description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
4389            field: Box::new(SettingField {
4390                pick: |settings_content| {
4391                    language_settings_field(settings_content, |language| {
4392                        &language.ensure_final_newline_on_save
4393                    })
4394                },
4395                pick_mut: |settings_content| {
4396                    language_settings_field_mut(settings_content, |language| {
4397                        &mut language.ensure_final_newline_on_save
4398                    })
4399                },
4400            }),
4401            metadata: None,
4402            files: USER | LOCAL,
4403        }),
4404        SettingsPageItem::SettingItem(SettingItem {
4405            title: "Formatter",
4406            description: "How to perform a buffer format",
4407            field: Box::new(
4408                SettingField {
4409                    pick: |settings_content| {
4410                        language_settings_field(settings_content, |language| &language.formatter)
4411                    },
4412                    pick_mut: |settings_content| {
4413                        language_settings_field_mut(settings_content, |language| {
4414                            &mut language.formatter
4415                        })
4416                    },
4417                }
4418                .unimplemented(),
4419            ),
4420            metadata: None,
4421            files: USER | LOCAL,
4422        }),
4423        SettingsPageItem::SettingItem(SettingItem {
4424            title: "Use On Type Format",
4425            description: "Whether to use additional LSP queries to format (and amend) the code after every \"trigger\" symbol input, defined by LSP server capabilities",
4426            field: Box::new(SettingField {
4427                pick: |settings_content| {
4428                    language_settings_field(settings_content, |language| {
4429                        &language.use_on_type_format
4430                    })
4431                },
4432                pick_mut: |settings_content| {
4433                    language_settings_field_mut(settings_content, |language| {
4434                        &mut language.use_on_type_format
4435                    })
4436                },
4437            }),
4438            metadata: None,
4439            files: USER | LOCAL,
4440        }),
4441        SettingsPageItem::SettingItem(SettingItem {
4442            title: "Code Actions On Format",
4443            description: "Which code actions to run on save after the formatter. These are not run if formatting is off",
4444            field: Box::new(
4445                SettingField {
4446                    pick: |settings_content| {
4447                        language_settings_field(settings_content, |language| {
4448                            &language.code_actions_on_format
4449                        })
4450                    },
4451                    pick_mut: |settings_content| {
4452                        language_settings_field_mut(settings_content, |language| {
4453                            &mut language.code_actions_on_format
4454                        })
4455                    },
4456                }
4457                .unimplemented(),
4458            ),
4459            metadata: None,
4460            files: USER | LOCAL,
4461        }),
4462        SettingsPageItem::SectionHeader("Prettier"),
4463        SettingsPageItem::SettingItem(SettingItem {
4464            title: "Allowed",
4465            description: "Enables or disables formatting with Prettier for a given language",
4466            field: Box::new(SettingField {
4467                pick: |settings_content| {
4468                    language_settings_field(settings_content, |language| {
4469                        if let Some(prettier) = &language.prettier {
4470                            &prettier.allowed
4471                        } else {
4472                            &None
4473                        }
4474                    })
4475                },
4476                pick_mut: |settings_content| {
4477                    language_settings_field_mut(settings_content, |language| {
4478                        &mut language.prettier.get_or_insert_default().allowed
4479                    })
4480                },
4481            }),
4482            metadata: None,
4483            files: USER | LOCAL,
4484        }),
4485        SettingsPageItem::SettingItem(SettingItem {
4486            title: "Parser",
4487            description: "Forces Prettier integration to use a specific parser name when formatting files with the language",
4488            field: Box::new(SettingField {
4489                pick: |settings_content| {
4490                    language_settings_field(settings_content, |language| {
4491                        if let Some(prettier) = &language.prettier {
4492                            &prettier.parser
4493                        } else {
4494                            &None
4495                        }
4496                    })
4497                },
4498                pick_mut: |settings_content| {
4499                    language_settings_field_mut(settings_content, |language| {
4500                        &mut language.prettier.get_or_insert_default().parser
4501                    })
4502                },
4503            }),
4504            metadata: None,
4505            files: USER | LOCAL,
4506        }),
4507        SettingsPageItem::SettingItem(SettingItem {
4508            title: "Plugins",
4509            description: "Forces Prettier integration to use specific plugins when formatting files with the language",
4510            field: Box::new(
4511                SettingField {
4512                    pick: |settings_content| {
4513                        language_settings_field(settings_content, |language| {
4514                            if let Some(prettier) = &language.prettier {
4515                                &prettier.plugins
4516                            } else {
4517                                &None
4518                            }
4519                        })
4520                    },
4521                    pick_mut: |settings_content| {
4522                        language_settings_field_mut(settings_content, |language| {
4523                            &mut language.prettier.get_or_insert_default().plugins
4524                        })
4525                    },
4526                }
4527                .unimplemented(),
4528            ),
4529            metadata: None,
4530            files: USER | LOCAL,
4531        }),
4532        SettingsPageItem::SettingItem(SettingItem {
4533            title: "Options",
4534            description: "Default Prettier options, in the format as in package.json section for Prettier",
4535            field: Box::new(
4536                SettingField {
4537                    pick: |settings_content| {
4538                        language_settings_field(settings_content, |language| {
4539                            if let Some(prettier) = &language.prettier {
4540                                &prettier.options
4541                            } else {
4542                                &None
4543                            }
4544                        })
4545                    },
4546                    pick_mut: |settings_content| {
4547                        language_settings_field_mut(settings_content, |language| {
4548                            &mut language.prettier.get_or_insert_default().options
4549                        })
4550                    },
4551                }
4552                .unimplemented(),
4553            ),
4554            metadata: None,
4555            files: USER | LOCAL,
4556        }),
4557        SettingsPageItem::SectionHeader("Autoclose"),
4558        SettingsPageItem::SettingItem(SettingItem {
4559            title: "Use Autoclose",
4560            description: "Whether to automatically type closing characters for you. For example, when you type (, Zed will automatically add a closing ) at the correct position",
4561            field: Box::new(SettingField {
4562                pick: |settings_content| {
4563                    language_settings_field(settings_content, |language| &language.use_autoclose)
4564                },
4565                pick_mut: |settings_content| {
4566                    language_settings_field_mut(settings_content, |language| {
4567                        &mut language.use_autoclose
4568                    })
4569                },
4570            }),
4571            metadata: None,
4572            files: USER | LOCAL,
4573        }),
4574        SettingsPageItem::SettingItem(SettingItem {
4575            title: "Use Auto Surround",
4576            description: "Whether to automatically surround text with characters for you. For example, when you select text and type (, Zed will automatically surround text with ()",
4577            field: Box::new(SettingField {
4578                pick: |settings_content| {
4579                    language_settings_field(settings_content, |language| {
4580                        &language.use_auto_surround
4581                    })
4582                },
4583                pick_mut: |settings_content| {
4584                    language_settings_field_mut(settings_content, |language| {
4585                        &mut language.use_auto_surround
4586                    })
4587                },
4588            }),
4589            metadata: None,
4590            files: USER | LOCAL,
4591        }),
4592        SettingsPageItem::SettingItem(SettingItem {
4593            title: "Always Treat Brackets As Autoclosed",
4594            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",
4595            field: Box::new(SettingField {
4596                pick: |settings_content| {
4597                    language_settings_field(settings_content, |language| {
4598                        &language.always_treat_brackets_as_autoclosed
4599                    })
4600                },
4601                pick_mut: |settings_content| {
4602                    language_settings_field_mut(settings_content, |language| {
4603                        &mut language.always_treat_brackets_as_autoclosed
4604                    })
4605                },
4606            }),
4607            metadata: None,
4608            files: USER | LOCAL,
4609        }),
4610        SettingsPageItem::SettingItem(SettingItem {
4611            title: "Jsx Tag Auto Close",
4612            description: "Whether to automatically close JSX tags",
4613            field: Box::new(SettingField {
4614                // TODO(settings_ui): this setting should just be a bool
4615                pick: |settings_content| {
4616                    language_settings_field(settings_content, |language| {
4617                        match language.jsx_tag_auto_close.as_ref() {
4618                            Some(s) => &s.enabled,
4619                            None => &None,
4620                        }
4621                    })
4622                },
4623                pick_mut: |settings_content| {
4624                    language_settings_field_mut(settings_content, |language| {
4625                        &mut language.jsx_tag_auto_close.get_or_insert_default().enabled
4626                    })
4627                },
4628            }),
4629            metadata: None,
4630            files: USER | LOCAL,
4631        }),
4632        SettingsPageItem::SectionHeader("LSP"),
4633        SettingsPageItem::SettingItem(SettingItem {
4634            title: "Enable Language Server",
4635            description: "Whether to use language servers to provide code intelligence",
4636            field: Box::new(SettingField {
4637                pick: |settings_content| {
4638                    language_settings_field(settings_content, |language| {
4639                        &language.enable_language_server
4640                    })
4641                },
4642                pick_mut: |settings_content| {
4643                    language_settings_field_mut(settings_content, |language| {
4644                        &mut language.enable_language_server
4645                    })
4646                },
4647            }),
4648            metadata: None,
4649            files: USER | LOCAL,
4650        }),
4651        SettingsPageItem::SettingItem(SettingItem {
4652            title: "Language Servers",
4653            description: "The list of language servers to use (or disable) for this language",
4654            field: Box::new(
4655                SettingField {
4656                    pick: |settings_content| {
4657                        language_settings_field(settings_content, |language| {
4658                            &language.language_servers
4659                        })
4660                    },
4661                    pick_mut: |settings_content| {
4662                        language_settings_field_mut(settings_content, |language| {
4663                            &mut language.language_servers
4664                        })
4665                    },
4666                }
4667                .unimplemented(),
4668            ),
4669            metadata: None,
4670            files: USER | LOCAL,
4671        }),
4672        SettingsPageItem::SettingItem(SettingItem {
4673            title: "Linked Edits",
4674            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",
4675            field: Box::new(SettingField {
4676                pick: |settings_content| {
4677                    language_settings_field(settings_content, |language| &language.linked_edits)
4678                },
4679                pick_mut: |settings_content| {
4680                    language_settings_field_mut(settings_content, |language| {
4681                        &mut language.linked_edits
4682                    })
4683                },
4684            }),
4685            metadata: None,
4686            files: USER | LOCAL,
4687        }),
4688        SettingsPageItem::SectionHeader("Edit Predictions"),
4689        SettingsPageItem::SettingItem(SettingItem {
4690            title: "Show Edit Predictions",
4691            description: "Controls whether edit predictions are shown immediately (true) or manually by triggering `editor::ShowEditPrediction` (false)",
4692            field: Box::new(SettingField {
4693                pick: |settings_content| {
4694                    language_settings_field(settings_content, |language| {
4695                        &language.show_edit_predictions
4696                    })
4697                },
4698                pick_mut: |settings_content| {
4699                    language_settings_field_mut(settings_content, |language| {
4700                        &mut language.show_edit_predictions
4701                    })
4702                },
4703            }),
4704            metadata: None,
4705            files: USER | LOCAL,
4706        }),
4707        SettingsPageItem::SettingItem(SettingItem {
4708            title: "Edit Predictions Disabled In",
4709            description: "Controls whether edit predictions are shown in the given language scopes",
4710            field: Box::new(
4711                SettingField {
4712                    pick: |settings_content| {
4713                        language_settings_field(settings_content, |language| {
4714                            &language.edit_predictions_disabled_in
4715                        })
4716                    },
4717                    pick_mut: |settings_content| {
4718                        language_settings_field_mut(settings_content, |language| {
4719                            &mut language.edit_predictions_disabled_in
4720                        })
4721                    },
4722                }
4723                .unimplemented(),
4724            ),
4725            metadata: None,
4726            files: USER | LOCAL,
4727        }),
4728        SettingsPageItem::SectionHeader("Whitespace"),
4729        SettingsPageItem::SettingItem(SettingItem {
4730            title: "Show Whitespaces",
4731            description: "Whether to show tabs and spaces in the editor",
4732            field: Box::new(SettingField {
4733                pick: |settings_content| {
4734                    language_settings_field(settings_content, |language| &language.show_whitespaces)
4735                },
4736                pick_mut: |settings_content| {
4737                    language_settings_field_mut(settings_content, |language| {
4738                        &mut language.show_whitespaces
4739                    })
4740                },
4741            }),
4742            metadata: None,
4743            files: USER | LOCAL,
4744        }),
4745        SettingsPageItem::SettingItem(SettingItem {
4746            title: "Space Whitespace Indicator",
4747            description: "Visible character used to render space characters when show_whitespaces is enabled (default: \"\")",
4748            field: Box::new(
4749                SettingField {
4750                    pick: |settings_content| {
4751                        language_settings_field(settings_content, |language| {
4752                            if let Some(whitespace_map) = &language.whitespace_map {
4753                                &whitespace_map.space
4754                            } else {
4755                                &None
4756                            }
4757                        })
4758                    },
4759                    pick_mut: |settings_content| {
4760                        language_settings_field_mut(settings_content, |language| {
4761                            &mut language.whitespace_map.get_or_insert_default().space
4762                        })
4763                    },
4764                }
4765                .unimplemented(),
4766            ),
4767            metadata: None,
4768            files: USER | LOCAL,
4769        }),
4770        SettingsPageItem::SettingItem(SettingItem {
4771            title: "Tab Whitespace Indicator",
4772            description: "Visible character used to render tab characters when show_whitespaces is enabled (default: \"\")",
4773            field: Box::new(
4774                SettingField {
4775                    pick: |settings_content| {
4776                        language_settings_field(settings_content, |language| {
4777                            if let Some(whitespace_map) = &language.whitespace_map {
4778                                &whitespace_map.tab
4779                            } else {
4780                                &None
4781                            }
4782                        })
4783                    },
4784                    pick_mut: |settings_content| {
4785                        language_settings_field_mut(settings_content, |language| {
4786                            &mut language.whitespace_map.get_or_insert_default().tab
4787                        })
4788                    },
4789                }
4790                .unimplemented(),
4791            ),
4792            metadata: None,
4793            files: USER | LOCAL,
4794        }),
4795        SettingsPageItem::SectionHeader("Completions"),
4796        SettingsPageItem::SettingItem(SettingItem {
4797            title: "Show Completions On Input",
4798            description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
4799            field: Box::new(SettingField {
4800                pick: |settings_content| {
4801                    language_settings_field(settings_content, |language| {
4802                        &language.show_completions_on_input
4803                    })
4804                },
4805                pick_mut: |settings_content| {
4806                    language_settings_field_mut(settings_content, |language| {
4807                        &mut language.show_completions_on_input
4808                    })
4809                },
4810            }),
4811            metadata: None,
4812            files: USER | LOCAL,
4813        }),
4814        SettingsPageItem::SettingItem(SettingItem {
4815            title: "Show Completion Documentation",
4816            description: "Whether to display inline and alongside documentation for items in the completions menu",
4817            field: Box::new(SettingField {
4818                pick: |settings_content| {
4819                    language_settings_field(settings_content, |language| {
4820                        &language.show_completion_documentation
4821                    })
4822                },
4823                pick_mut: |settings_content| {
4824                    language_settings_field_mut(settings_content, |language| {
4825                        &mut language.show_completion_documentation
4826                    })
4827                },
4828            }),
4829            metadata: None,
4830            files: USER | LOCAL,
4831        }),
4832        SettingsPageItem::SettingItem(SettingItem {
4833            title: "Words",
4834            description: "Controls how words are completed",
4835            field: Box::new(SettingField {
4836                pick: |settings_content| {
4837                    language_settings_field(settings_content, |language| {
4838                        if let Some(completions) = &language.completions {
4839                            &completions.words
4840                        } else {
4841                            &None
4842                        }
4843                    })
4844                },
4845                pick_mut: |settings_content| {
4846                    language_settings_field_mut(settings_content, |language| {
4847                        &mut language.completions.get_or_insert_default().words
4848                    })
4849                },
4850            }),
4851            metadata: None,
4852            files: USER | LOCAL,
4853        }),
4854        SettingsPageItem::SettingItem(SettingItem {
4855            title: "Words Min Length",
4856            description: "How many characters has to be in the completions query to automatically show the words-based completions",
4857            field: Box::new(SettingField {
4858                pick: |settings_content| {
4859                    language_settings_field(settings_content, |language| {
4860                        if let Some(completions) = &language.completions {
4861                            &completions.words_min_length
4862                        } else {
4863                            &None
4864                        }
4865                    })
4866                },
4867                pick_mut: |settings_content| {
4868                    language_settings_field_mut(settings_content, |language| {
4869                        &mut language
4870                            .completions
4871                            .get_or_insert_default()
4872                            .words_min_length
4873                    })
4874                },
4875            }),
4876            metadata: None,
4877            files: USER | LOCAL,
4878        }),
4879        SettingsPageItem::SettingItem(SettingItem {
4880            title: "Lsp",
4881            description: "Whether to fetch LSP completions or not",
4882            field: Box::new(SettingField {
4883                pick: |settings_content| {
4884                    language_settings_field(settings_content, |language| {
4885                        if let Some(completions) = &language.completions {
4886                            &completions.lsp
4887                        } else {
4888                            &None
4889                        }
4890                    })
4891                },
4892                pick_mut: |settings_content| {
4893                    language_settings_field_mut(settings_content, |language| {
4894                        &mut language.completions.get_or_insert_default().lsp
4895                    })
4896                },
4897            }),
4898            metadata: None,
4899            files: USER | LOCAL,
4900        }),
4901        SettingsPageItem::SettingItem(SettingItem {
4902            title: "Lsp Fetch Timeout Ms",
4903            description: "When fetching LSP completions, determines how long to wait for a response of a particular server (set to 0 to wait indefinitely)",
4904            field: Box::new(SettingField {
4905                pick: |settings_content| {
4906                    language_settings_field(settings_content, |language| {
4907                        if let Some(completions) = &language.completions {
4908                            &completions.lsp_fetch_timeout_ms
4909                        } else {
4910                            &None
4911                        }
4912                    })
4913                },
4914                pick_mut: |settings_content| {
4915                    language_settings_field_mut(settings_content, |language| {
4916                        &mut language
4917                            .completions
4918                            .get_or_insert_default()
4919                            .lsp_fetch_timeout_ms
4920                    })
4921                },
4922            }),
4923            metadata: None,
4924            files: USER | LOCAL,
4925        }),
4926        SettingsPageItem::SettingItem(SettingItem {
4927            title: "Lsp Insert Mode",
4928            description: "Controls how LSP completions are inserted",
4929            field: Box::new(SettingField {
4930                pick: |settings_content| {
4931                    language_settings_field(settings_content, |language| {
4932                        if let Some(completions) = &language.completions {
4933                            &completions.lsp_insert_mode
4934                        } else {
4935                            &None
4936                        }
4937                    })
4938                },
4939                pick_mut: |settings_content| {
4940                    language_settings_field_mut(settings_content, |language| {
4941                        &mut language.completions.get_or_insert_default().lsp_insert_mode
4942                    })
4943                },
4944            }),
4945            metadata: None,
4946            files: USER | LOCAL,
4947        }),
4948        SettingsPageItem::SectionHeader("Inlay Hints"),
4949        SettingsPageItem::SettingItem(SettingItem {
4950            title: "Enabled",
4951            description: "Global switch to toggle hints on and off",
4952            field: Box::new(SettingField {
4953                pick: |settings_content| {
4954                    language_settings_field(settings_content, |language| {
4955                        if let Some(inlay_hints) = &language.inlay_hints {
4956                            &inlay_hints.enabled
4957                        } else {
4958                            &None
4959                        }
4960                    })
4961                },
4962                pick_mut: |settings_content| {
4963                    language_settings_field_mut(settings_content, |language| {
4964                        &mut language.inlay_hints.get_or_insert_default().enabled
4965                    })
4966                },
4967            }),
4968            metadata: None,
4969            files: USER | LOCAL,
4970        }),
4971        SettingsPageItem::SettingItem(SettingItem {
4972            title: "Show Value Hints",
4973            description: "Global switch to toggle inline values on and off when debugging",
4974            field: Box::new(SettingField {
4975                pick: |settings_content| {
4976                    language_settings_field(settings_content, |language| {
4977                        if let Some(inlay_hints) = &language.inlay_hints {
4978                            &inlay_hints.show_value_hints
4979                        } else {
4980                            &None
4981                        }
4982                    })
4983                },
4984                pick_mut: |settings_content| {
4985                    language_settings_field_mut(settings_content, |language| {
4986                        &mut language
4987                            .inlay_hints
4988                            .get_or_insert_default()
4989                            .show_value_hints
4990                    })
4991                },
4992            }),
4993            metadata: None,
4994            files: USER | LOCAL,
4995        }),
4996        SettingsPageItem::SettingItem(SettingItem {
4997            title: "Show Type Hints",
4998            description: "Whether type hints should be shown",
4999            field: Box::new(SettingField {
5000                pick: |settings_content| {
5001                    language_settings_field(settings_content, |language| {
5002                        if let Some(inlay_hints) = &language.inlay_hints {
5003                            &inlay_hints.show_type_hints
5004                        } else {
5005                            &None
5006                        }
5007                    })
5008                },
5009                pick_mut: |settings_content| {
5010                    language_settings_field_mut(settings_content, |language| {
5011                        &mut language.inlay_hints.get_or_insert_default().show_type_hints
5012                    })
5013                },
5014            }),
5015            metadata: None,
5016            files: USER | LOCAL,
5017        }),
5018        SettingsPageItem::SettingItem(SettingItem {
5019            title: "Show Parameter Hints",
5020            description: "Whether parameter hints should be shown",
5021            field: Box::new(SettingField {
5022                pick: |settings_content| {
5023                    language_settings_field(settings_content, |language| {
5024                        if let Some(inlay_hints) = &language.inlay_hints {
5025                            &inlay_hints.show_parameter_hints
5026                        } else {
5027                            &None
5028                        }
5029                    })
5030                },
5031                pick_mut: |settings_content| {
5032                    language_settings_field_mut(settings_content, |language| {
5033                        &mut language
5034                            .inlay_hints
5035                            .get_or_insert_default()
5036                            .show_parameter_hints
5037                    })
5038                },
5039            }),
5040            metadata: None,
5041            files: USER | LOCAL,
5042        }),
5043        SettingsPageItem::SettingItem(SettingItem {
5044            title: "Show Other Hints",
5045            description: "Whether other hints should be shown",
5046            field: Box::new(SettingField {
5047                pick: |settings_content| {
5048                    language_settings_field(settings_content, |language| {
5049                        if let Some(inlay_hints) = &language.inlay_hints {
5050                            &inlay_hints.show_other_hints
5051                        } else {
5052                            &None
5053                        }
5054                    })
5055                },
5056                pick_mut: |settings_content| {
5057                    language_settings_field_mut(settings_content, |language| {
5058                        &mut language
5059                            .inlay_hints
5060                            .get_or_insert_default()
5061                            .show_other_hints
5062                    })
5063                },
5064            }),
5065            metadata: None,
5066            files: USER | LOCAL,
5067        }),
5068        SettingsPageItem::SettingItem(SettingItem {
5069            title: "Show Background",
5070            description: "Whether to show a background for inlay hints",
5071            field: Box::new(SettingField {
5072                pick: |settings_content| {
5073                    language_settings_field(settings_content, |language| {
5074                        if let Some(inlay_hints) = &language.inlay_hints {
5075                            &inlay_hints.show_background
5076                        } else {
5077                            &None
5078                        }
5079                    })
5080                },
5081                pick_mut: |settings_content| {
5082                    language_settings_field_mut(settings_content, |language| {
5083                        &mut language.inlay_hints.get_or_insert_default().show_background
5084                    })
5085                },
5086            }),
5087            metadata: None,
5088            files: USER | LOCAL,
5089        }),
5090        SettingsPageItem::SettingItem(SettingItem {
5091            title: "Edit Debounce Ms",
5092            description: "Whether or not to debounce inlay hints updates after buffer edits (set to 0 to disable debouncing)",
5093            field: Box::new(SettingField {
5094                pick: |settings_content| {
5095                    language_settings_field(settings_content, |language| {
5096                        if let Some(inlay_hints) = &language.inlay_hints {
5097                            &inlay_hints.edit_debounce_ms
5098                        } else {
5099                            &None
5100                        }
5101                    })
5102                },
5103                pick_mut: |settings_content| {
5104                    language_settings_field_mut(settings_content, |language| {
5105                        &mut language
5106                            .inlay_hints
5107                            .get_or_insert_default()
5108                            .edit_debounce_ms
5109                    })
5110                },
5111            }),
5112            metadata: None,
5113            files: USER | LOCAL,
5114        }),
5115        SettingsPageItem::SettingItem(SettingItem {
5116            title: "Scroll Debounce Ms",
5117            description: "Whether or not to debounce inlay hints updates after buffer scrolls (set to 0 to disable debouncing)",
5118            field: Box::new(SettingField {
5119                pick: |settings_content| {
5120                    language_settings_field(settings_content, |language| {
5121                        if let Some(inlay_hints) = &language.inlay_hints {
5122                            &inlay_hints.scroll_debounce_ms
5123                        } else {
5124                            &None
5125                        }
5126                    })
5127                },
5128                pick_mut: |settings_content| {
5129                    language_settings_field_mut(settings_content, |language| {
5130                        &mut language
5131                            .inlay_hints
5132                            .get_or_insert_default()
5133                            .scroll_debounce_ms
5134                    })
5135                },
5136            }),
5137            metadata: None,
5138            files: USER | LOCAL,
5139        }),
5140        SettingsPageItem::SettingItem(SettingItem {
5141            title: "Toggle On Modifiers Press",
5142            description: "Toggles inlay hints (hides or shows) when the user | LOCAL presses the modifiers specified",
5143            field: Box::new(
5144                SettingField {
5145                    pick: |settings_content| {
5146                        language_settings_field(settings_content, |language| {
5147                            if let Some(inlay_hints) = &language.inlay_hints {
5148                                &inlay_hints.toggle_on_modifiers_press
5149                            } else {
5150                                &None
5151                            }
5152                        })
5153                    },
5154                    pick_mut: |settings_content| {
5155                        language_settings_field_mut(settings_content, |language| {
5156                            &mut language
5157                                .inlay_hints
5158                                .get_or_insert_default()
5159                                .toggle_on_modifiers_press
5160                        })
5161                    },
5162                }
5163                .unimplemented(),
5164            ),
5165            metadata: None,
5166            files: USER | LOCAL,
5167        }),
5168        SettingsPageItem::SectionHeader("Tasks"),
5169        SettingsPageItem::SettingItem(SettingItem {
5170            title: "Enabled",
5171            description: "Whether tasks are enabled for this language",
5172            field: Box::new(SettingField {
5173                pick: |settings_content| {
5174                    language_settings_field(settings_content, |language| {
5175                        if let Some(tasks) = &language.tasks {
5176                            &tasks.enabled
5177                        } else {
5178                            &None
5179                        }
5180                    })
5181                },
5182                pick_mut: |settings_content| {
5183                    language_settings_field_mut(settings_content, |language| {
5184                        &mut language.tasks.get_or_insert_default().enabled
5185                    })
5186                },
5187            }),
5188            metadata: None,
5189            files: USER | LOCAL,
5190        }),
5191        SettingsPageItem::SettingItem(SettingItem {
5192            title: "Variables",
5193            description: "Extra task variables to set for a particular language",
5194            field: Box::new(
5195                SettingField {
5196                    pick: |settings_content| {
5197                        language_settings_field(settings_content, |language| {
5198                            if let Some(tasks) = &language.tasks {
5199                                &tasks.variables
5200                            } else {
5201                                &None
5202                            }
5203                        })
5204                    },
5205                    pick_mut: |settings_content| {
5206                        language_settings_field_mut(settings_content, |language| {
5207                            &mut language.tasks.get_or_insert_default().variables
5208                        })
5209                    },
5210                }
5211                .unimplemented(),
5212            ),
5213            metadata: None,
5214            files: USER | LOCAL,
5215        }),
5216        SettingsPageItem::SettingItem(SettingItem {
5217            title: "Prefer Lsp",
5218            description: "Use LSP tasks over Zed language extension ones",
5219            field: Box::new(SettingField {
5220                pick: |settings_content| {
5221                    language_settings_field(settings_content, |language| {
5222                        if let Some(tasks) = &language.tasks {
5223                            &tasks.prefer_lsp
5224                        } else {
5225                            &None
5226                        }
5227                    })
5228                },
5229                pick_mut: |settings_content| {
5230                    language_settings_field_mut(settings_content, |language| {
5231                        &mut language.tasks.get_or_insert_default().prefer_lsp
5232                    })
5233                },
5234            }),
5235            metadata: None,
5236            files: USER | LOCAL,
5237        }),
5238        SettingsPageItem::SectionHeader("Miscellaneous"),
5239        SettingsPageItem::SettingItem(SettingItem {
5240            title: "Debuggers",
5241            description: "Preferred debuggers for this language",
5242            field: Box::new(
5243                SettingField {
5244                    pick: |settings_content| {
5245                        language_settings_field(settings_content, |language| &language.debuggers)
5246                    },
5247                    pick_mut: |settings_content| {
5248                        language_settings_field_mut(settings_content, |language| {
5249                            &mut language.debuggers
5250                        })
5251                    },
5252                }
5253                .unimplemented(),
5254            ),
5255            metadata: None,
5256            files: USER | LOCAL,
5257        }),
5258        SettingsPageItem::SettingItem(SettingItem {
5259            title: "Extend Comment On Newline",
5260            description: "Whether to start a new line with a comment when a previous line is a comment as well",
5261            field: Box::new(SettingField {
5262                pick: |settings_content| {
5263                    language_settings_field(settings_content, |language| {
5264                        &language.extend_comment_on_newline
5265                    })
5266                },
5267                pick_mut: |settings_content| {
5268                    language_settings_field_mut(settings_content, |language| {
5269                        &mut language.extend_comment_on_newline
5270                    })
5271                },
5272            }),
5273            metadata: None,
5274            files: USER | LOCAL,
5275        }),
5276    ]
5277}