From 516796b99338d1ceaabca714f3e18020e5ff3779 Mon Sep 17 00:00:00 2001 From: Katie Geer Date: Sat, 11 Oct 2025 16:40:51 -0700 Subject: [PATCH] settings ui: Rearrange sections (#39978) Closes #ISSUE Release Notes: - N/A *or* Added/Fixed/Improved ... --- crates/settings_ui/src/page_data.rs | 2264 +++++++++++++-------------- 1 file changed, 1118 insertions(+), 1146 deletions(-) diff --git a/crates/settings_ui/src/page_data.rs b/crates/settings_ui/src/page_data.rs index afedde65962ed21f57277d5d9be95ff67b83ad4d..1db443797d8503e79a31113379c6be6cba6f3676 100644 --- a/crates/settings_ui/src/page_data.rs +++ b/crates/settings_ui/src/page_data.rs @@ -15,7 +15,7 @@ pub(crate) fn settings_data() -> Vec { SettingsPageItem::SectionHeader("General Settings"), SettingsPageItem::SettingItem(SettingItem { title: "Confirm Quit", - description: "Whether to confirm before quitting Zed", + description: "Confirm before quitting Zed", field: Box::new(SettingField { pick: |settings_content| &settings_content.workspace.confirm_quit, pick_mut: |settings_content| &mut settings_content.workspace.confirm_quit, @@ -25,7 +25,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Restore On Startup", - description: "Whether to restore previous session when opening Zed", + description: "Restore previous session when opening Zed", field: Box::new(SettingField { pick: |settings_content| &settings_content.workspace.restore_on_startup, pick_mut: |settings_content| { @@ -35,30 +35,6 @@ pub(crate) fn settings_data() -> Vec { metadata: None, files: USER, }), - SettingsPageItem::SettingItem(SettingItem { - title: "Restore File State", - description: "Whether to restore previous file state when reopening", - field: Box::new(SettingField { - pick: |settings_content| &settings_content.workspace.restore_on_file_reopen, - pick_mut: |settings_content| { - &mut settings_content.workspace.restore_on_file_reopen - }, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Close on File Delete", - description: "Whether to automatically close files that have been deleted", - field: Box::new(SettingField { - pick: |settings_content| &settings_content.workspace.close_on_file_delete, - pick_mut: |settings_content| { - &mut settings_content.workspace.close_on_file_delete - }, - }), - metadata: None, - files: USER, - }), SettingsPageItem::SettingItem(SettingItem { title: "When Closing With No Tabs", description: "What to do when using the 'close active item' action with no tabs", @@ -87,7 +63,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Use System Path Prompts", - description: "Whether to use native OS dialogs for 'Open' and 'Save As'", + description: "Use native OS dialogs for 'Open' and 'Save As'", field: Box::new(SettingField { pick: |settings_content| { &settings_content.workspace.use_system_path_prompts @@ -101,7 +77,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Use System Prompts", - description: "Whether to use native OS dialogs for confirmations", + description: "Use native OS dialogs for confirmations", field: Box::new(SettingField { pick: |settings_content| &settings_content.workspace.use_system_prompts, pick_mut: |settings_content| { @@ -111,6 +87,18 @@ pub(crate) fn settings_data() -> Vec { metadata: None, files: USER, }), + SettingsPageItem::SettingItem(SettingItem { + title: "Redact Private Values", + description: "Hide the values of variables in private files", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.redact_private_values, + pick_mut: |settings_content| { + &mut settings_content.editor.redact_private_values + }, + }), + metadata: None, + files: USER, + }), SettingsPageItem::SectionHeader("Scoped Settings"), SettingsPageItem::SettingItem(SettingItem { // todo(settings_ui): Implement another setting item type that just shows an edit in settings.json @@ -338,7 +326,7 @@ pub(crate) fn settings_data() -> Vec { // behavior to have them both enabled at the same time SettingsPageItem::SettingItem(SettingItem { title: "Vim Mode", - description: "Whether to enable vim modes and key bindings", + description: "Enable vim modes and key bindings", field: Box::new(SettingField { pick: |settings_content| &settings_content.vim_mode, pick_mut: |settings_content| &mut settings_content.vim_mode, @@ -348,7 +336,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Helix Mode", - description: "Whether to enable helix modes and key bindings", + description: "Enable helix modes and key bindings", field: Box::new(SettingField { pick: |settings_content| &settings_content.helix_mode, pick_mut: |settings_content| &mut settings_content.helix_mode, @@ -426,7 +414,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Selection Highlight", - description: "Whether to highlight all occurrences of selected text", + description: "Highlight all occurrences of selected text", field: Box::new(SettingField { pick: |settings_content| &settings_content.editor.selection_highlight, pick_mut: |settings_content| { @@ -446,10 +434,24 @@ pub(crate) fn settings_data() -> Vec { metadata: None, files: USER, }), + SettingsPageItem::SettingItem(SettingItem { + title: "Minimum Contrast For Highlights", + description: "The minimum APCA perceptual contrast to maintain when rendering text over highlight backgrounds", + field: Box::new(SettingField { + pick: |settings_content| { + &settings_content.editor.minimum_contrast_for_highlights + }, + pick_mut: |settings_content| { + &mut settings_content.editor.minimum_contrast_for_highlights + }, + }), + metadata: None, + files: USER, + }), SettingsPageItem::SectionHeader("Guides"), SettingsPageItem::SettingItem(SettingItem { title: "Show Wrap Guides", - description: "Whether to show wrap guides (vertical rulers)", + description: "Show wrap guides (vertical rulers)", field: Box::new(SettingField { pick: |settings_content| { &settings_content @@ -487,29 +489,6 @@ pub(crate) fn settings_data() -> Vec { metadata: None, files: USER | LOCAL, }), - SettingsPageItem::SectionHeader("Whitespace"), - SettingsPageItem::SettingItem(SettingItem { - title: "Show Whitespace", - description: "Whether to show tabs and spaces", - field: Box::new(SettingField { - pick: |settings_content| { - &settings_content - .project - .all_languages - .defaults - .show_whitespaces - }, - pick_mut: |settings_content| { - &mut settings_content - .project - .all_languages - .defaults - .show_whitespaces - }, - }), - metadata: None, - files: USER | LOCAL, - }), SettingsPageItem::SectionHeader("Layout"), SettingsPageItem::SettingItem(SettingItem { title: "Bottom Dock Layout", @@ -573,7 +552,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Zoomed Padding", - description: "Whether to show padding for zoomed panels", + description: "Show padding for zoomed panels", field: Box::new(SettingField { pick: |settings_content| &settings_content.workspace.zoomed_padding, pick_mut: |settings_content| &mut settings_content.workspace.zoomed_padding, @@ -601,68 +580,7 @@ pub(crate) fn settings_data() -> Vec { title: "Editor", items: { let mut items = vec![ - SettingsPageItem::SectionHeader("Search"), - SettingsPageItem::SettingItem(SettingItem { - title: "Search Wrap", - description: "Whether the editor search results will loop", - field: Box::new(SettingField { - pick: |settings_content| &settings_content.editor.search_wrap, - pick_mut: |settings_content| &mut settings_content.editor.search_wrap, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Seed Search Query From Cursor", - description: "When to populate a new search's query based on the text under the cursor", - field: Box::new(SettingField { - pick: |settings_content| { - &settings_content.editor.seed_search_query_from_cursor - }, - pick_mut: |settings_content| { - &mut settings_content.editor.seed_search_query_from_cursor - }, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Use Smartcase Search", - description: "Whether to use smartcase (i.e., case-sensitive) search", - field: Box::new(SettingField { - pick: |settings_content| &settings_content.editor.use_smartcase_search, - pick_mut: |settings_content| { - &mut settings_content.editor.use_smartcase_search - }, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SectionHeader("Editor Behavior"), - SettingsPageItem::SettingItem(SettingItem { - title: "Redact Private Values", - description: "Hide the values of variables in private files", - field: Box::new(SettingField { - pick: |settings_content| &settings_content.editor.redact_private_values, - pick_mut: |settings_content| { - &mut settings_content.editor.redact_private_values - }, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Middle Click Paste", - description: "Whether to enable middle-click paste on Linux", - field: Box::new(SettingField { - pick: |settings_content| &settings_content.editor.middle_click_paste, - pick_mut: |settings_content| { - &mut settings_content.editor.middle_click_paste - }, - }), - metadata: None, - files: USER, - }), + SettingsPageItem::SectionHeader("Multibuffer"), SettingsPageItem::SettingItem(SettingItem { title: "Double Click In Multibuffer", description: "What to do when multibuffer is double-clicked in some of its excerpts", @@ -677,20 +595,6 @@ pub(crate) fn settings_data() -> Vec { metadata: None, files: USER, }), - SettingsPageItem::SettingItem(SettingItem { - title: "Go To Definition Fallback", - description: "Whether to follow-up empty go to definition responses from the language server", - field: Box::new(SettingField { - pick: |settings_content| { - &settings_content.editor.go_to_definition_fallback - }, - pick_mut: |settings_content| { - &mut settings_content.editor.go_to_definition_fallback - }, - }), - metadata: None, - files: USER, - }), SettingsPageItem::SettingItem(SettingItem { title: "Expand Excerpt Lines", description: "How many lines to expand the multibuffer excerpts by default", @@ -715,20 +619,6 @@ pub(crate) fn settings_data() -> Vec { metadata: None, files: USER, }), - SettingsPageItem::SettingItem(SettingItem { - title: "Minimum Contrast For Highlights", - description: "The minimum APCA perceptual contrast to maintain when rendering text over highlight backgrounds", - field: Box::new(SettingField { - pick: |settings_content| { - &settings_content.editor.minimum_contrast_for_highlights - }, - pick_mut: |settings_content| { - &mut settings_content.editor.minimum_contrast_for_highlights - }, - }), - metadata: None, - files: USER, - }), SettingsPageItem::SectionHeader("Scrolling"), SettingsPageItem::SettingItem(SettingItem { title: "Scroll Beyond Last Line", @@ -813,7 +703,7 @@ pub(crate) fn settings_data() -> Vec { SettingsPageItem::SectionHeader("Signature Help"), SettingsPageItem::SettingItem(SettingItem { title: "Auto Signature Help", - description: "Whether to automatically show a signature help pop-up or not", + description: "Automatically show a signature help pop-up", field: Box::new(SettingField { pick: |settings_content| &settings_content.editor.auto_signature_help, pick_mut: |settings_content| { @@ -825,7 +715,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Show Signature Help After Edits", - description: "Whether to show the signature help pop-up after completions or bracket pairs inserted", + description: "Show the signature help pop-up after completions or bracket pairs are inserted", field: Box::new(SettingField { pick: |settings_content| { &settings_content.editor.show_signature_help_after_edits @@ -852,7 +742,7 @@ pub(crate) fn settings_data() -> Vec { SettingsPageItem::SectionHeader("Hover"), SettingsPageItem::SettingItem(SettingItem { title: "Hover Popover Enabled", - description: "Whether to show the informational hover box when moving the mouse over symbols in the editor", + description: "Show the informational hover box when moving the mouse over symbols in the editor", field: Box::new(SettingField { pick: |settings_content| &settings_content.editor.hover_popover_enabled, pick_mut: |settings_content| { @@ -875,10 +765,10 @@ pub(crate) fn settings_data() -> Vec { metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Code Actions"), + SettingsPageItem::SectionHeader("Code Actions & Selection"), SettingsPageItem::SettingItem(SettingItem { title: "Inline Code Actions", - description: "Whether to show code action button at start of buffer line", + description: "Show code action button at start of buffer line", field: Box::new(SettingField { pick: |settings_content| &settings_content.editor.inline_code_actions, pick_mut: |settings_content| { @@ -888,10 +778,9 @@ pub(crate) fn settings_data() -> Vec { metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Selection"), SettingsPageItem::SettingItem(SettingItem { title: "Drag And Drop Selection", - description: "Whether to enable drag and drop selection", + description: "Enable drag and drop selection", field: Box::new(SettingField { pick: |settings_content| { if let Some(drag_and_drop) = @@ -940,7 +829,7 @@ pub(crate) fn settings_data() -> Vec { SettingsPageItem::SectionHeader("Gutter"), SettingsPageItem::SettingItem(SettingItem { title: "Show Line Numbers", - description: "Whether to show line numbers in the gutter", + description: "Show line numbers in the gutter", field: Box::new(SettingField { pick: |settings_content| { if let Some(gutter) = &settings_content.editor.gutter { @@ -962,7 +851,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Relative Line Numbers", - description: "Whether the line numbers on editors gutter are relative or not", + description: "Whether the line numbers in the editor's gutter are relative or not", field: Box::new(SettingField { pick: |settings_content| &settings_content.editor.relative_line_numbers, pick_mut: |settings_content| { @@ -974,7 +863,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Show Runnables", - description: "Whether to show runnable buttons in the gutter", + description: "Show runnable buttons in the gutter", field: Box::new(SettingField { pick: |settings_content| { if let Some(gutter) = &settings_content.editor.gutter { @@ -996,7 +885,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Show Breakpoints", - description: "Whether to show breakpoints in the gutter", + description: "Show breakpoints in the gutter", field: Box::new(SettingField { pick: |settings_content| { if let Some(gutter) = &settings_content.editor.gutter { @@ -1018,7 +907,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Show Folds", - description: "Whether to show code folding controls in the gutter", + description: "Show code folding controls in the gutter", field: Box::new(SettingField { pick: |settings_content| { if let Some(gutter) = &settings_content.editor.gutter { @@ -1081,7 +970,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Cursors", - description: "Whether to show cursor positions in the scrollbar", + description: "Show cursor positions in the scrollbar", field: Box::new(SettingField { pick: |settings_content| { if let Some(scrollbar) = &settings_content.editor.scrollbar { @@ -1103,7 +992,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Git Diff", - description: "Whether to show git diff indicators in the scrollbar", + description: "Show git diff indicators in the scrollbar", field: Box::new(SettingField { pick: |settings_content| { if let Some(scrollbar) = &settings_content.editor.scrollbar { @@ -1125,7 +1014,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Search Results", - description: "Whether to show buffer search result indicators in the scrollbar", + description: "Show buffer search result indicators in the scrollbar", field: Box::new(SettingField { pick: |settings_content| { if let Some(scrollbar) = &settings_content.editor.scrollbar { @@ -1147,7 +1036,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Selected Text", - description: "Whether to show selected text occurrences in the scrollbar", + description: "Show selected text occurrences in the scrollbar", field: Box::new(SettingField { pick: |settings_content| { if let Some(scrollbar) = &settings_content.editor.scrollbar { @@ -1169,7 +1058,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Selected Symbol", - description: "Whether to show selected symbol occurrences in the scrollbar", + description: "Show selected symbol occurrences in the scrollbar", field: Box::new(SettingField { pick: |settings_content| { if let Some(scrollbar) = &settings_content.editor.scrollbar { @@ -1398,100 +1287,10 @@ pub(crate) fn settings_data() -> Vec { metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Tabs"), - SettingsPageItem::SettingItem(SettingItem { - title: "Show Tab Bar", - description: "Whether or not to show the tab bar in the editor", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(tab_bar) = &settings_content.tab_bar { - &tab_bar.show - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content.tab_bar.get_or_insert_default().show - }, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Show Git Status In Tabs", - description: "Whether to show the Git file status on a tab item", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(tabs) = &settings_content.tabs { - &tabs.git_status - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content.tabs.get_or_insert_default().git_status - }, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Show File Icons In Tabs", - description: "Whether to show the file icon for a tab", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(tabs) = &settings_content.tabs { - &tabs.file_icons - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content.tabs.get_or_insert_default().file_icons - }, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Tab Close Position", - description: "Position of the close button in a tab", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(tabs) = &settings_content.tabs { - &tabs.close_position - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content.tabs.get_or_insert_default().close_position - }, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - files: USER, - title: "Maximum Tabs", - description: "Maximum open tabs in a pane. Will not close an unsaved tab", - // todo(settings_ui): The default for this value is null and it's use in code - // is complex, so I'm going to come back to this later - field: Box::new( - SettingField { - pick: |settings_content| &settings_content.workspace.max_tabs, - pick_mut: |settings_content| { - &mut settings_content.workspace.max_tabs - }, - } - .unimplemented(), - ), - metadata: None, - }), SettingsPageItem::SectionHeader("Toolbar"), SettingsPageItem::SettingItem(SettingItem { title: "Breadcrumbs", - description: "Whether to show breadcrumbs", + description: "Show breadcrumbs", field: Box::new(SettingField { pick: |settings_content| { if let Some(toolbar) = &settings_content.editor.toolbar { @@ -1513,7 +1312,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Quick Actions", - description: "Whether to show quick action buttons (e.g., search, selection, editor controls, etc.)", + description: "Show quick action buttons (e.g., search, selection, editor controls, etc.)", field: Box::new(SettingField { pick: |settings_content| { if let Some(toolbar) = &settings_content.editor.toolbar { @@ -1535,7 +1334,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Selections Menu", - description: "Whether to show the selections menu in the editor toolbar", + description: "Show the selections menu in the editor toolbar", field: Box::new(SettingField { pick: |settings_content| { if let Some(toolbar) = &settings_content.editor.toolbar { @@ -1557,7 +1356,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Agent Review", - description: "Whether to show agent review buttons in the editor toolbar", + description: "Show agent review buttons in the editor toolbar", field: Box::new(SettingField { pick: |settings_content| { if let Some(toolbar) = &settings_content.editor.toolbar { @@ -1579,7 +1378,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Code Actions", - description: "Whether to show code action buttons in the editor toolbar", + description: "Show code action buttons in the editor toolbar", field: Box::new(SettingField { pick: |settings_content| { if let Some(toolbar) = &settings_content.editor.toolbar { @@ -1676,656 +1475,809 @@ pub(crate) fn settings_data() -> Vec { ], }, SettingsPage { - title: "Workbench & Window", + title: "Search & Files", items: vec![ - SettingsPageItem::SectionHeader("Status Bar"), + SettingsPageItem::SectionHeader("Search"), SettingsPageItem::SettingItem(SettingItem { - title: "Project Panel Button", - description: "Whether to show the project panel button in the status bar", + title: "Whole Word", + description: "Search for whole words by default", field: Box::new(SettingField { pick: |settings_content| { - if let Some(project_panel) = &settings_content.project_panel { - &project_panel.button + if let Some(search) = &settings_content.editor.search { + &search.whole_word } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .project_panel + .editor + .search .get_or_insert_default() - .button + .whole_word }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Active Language Button", - description: "Whether to show the active language button in the status bar", + title: "Case Sensitive", + description: "Search case-sensitively by default", field: Box::new(SettingField { pick: |settings_content| { - if let Some(status_bar) = &settings_content.status_bar { - &status_bar.active_language_button + if let Some(search) = &settings_content.editor.search { + &search.case_sensitive } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .status_bar + .editor + .search .get_or_insert_default() - .active_language_button + .case_sensitive }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Cursor Position Button", - description: "Whether to show the cursor position button in the status bar", + title: "Include Ignored", + description: "Include ignored files in search results by default", field: Box::new(SettingField { pick: |settings_content| { - if let Some(status_bar) = &settings_content.status_bar { - &status_bar.cursor_position_button + if let Some(search) = &settings_content.editor.search { + &search.include_ignored } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .status_bar + .editor + .search .get_or_insert_default() - .cursor_position_button + .include_ignored }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Terminal Button", - description: "Whether to show the terminal button in the status bar", + title: "Regex", + description: "Use regex search by default", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.button + if let Some(search) = &settings_content.editor.search { + &search.regex } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.terminal.get_or_insert_default().button + &mut settings_content.editor.search.get_or_insert_default().regex }, }), metadata: None, files: USER, }), + // todo: null by default SettingsPageItem::SettingItem(SettingItem { - title: "Diagnostics Button", - description: "Whether to show the project diagnostics button in the status bar", + title: "Include Ignored in Search", + description: "Use gitignored files when searching", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.include_ignored + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .file_finder + .get_or_insert_default() + .include_ignored + }, + } + .unimplemented(), + ), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Search Wrap", + description: "Whether the editor search results will loop", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.search_wrap, + pick_mut: |settings_content| &mut settings_content.editor.search_wrap, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Seed Search Query From Cursor", + description: "When to populate a new search's query based on the text under the cursor", field: Box::new(SettingField { pick: |settings_content| { - if let Some(diagnostics) = &settings_content.diagnostics { - &diagnostics.button - } else { - &None - } + &settings_content.editor.seed_search_query_from_cursor }, pick_mut: |settings_content| { - &mut settings_content.diagnostics.get_or_insert_default().button + &mut settings_content.editor.seed_search_query_from_cursor }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Project Search Button", - description: "Whether to show the project search button in the status bar", + title: "Use Smartcase Search", + description: "Use smartcase (i.e., case-sensitive) search", field: Box::new(SettingField { - pick: |settings_content| { - if let Some(search) = &settings_content.editor.search { - &search.button + pick: |settings_content| &settings_content.editor.use_smartcase_search, + pick_mut: |settings_content| { + &mut settings_content.editor.use_smartcase_search + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SectionHeader("File Management"), + SettingsPageItem::SettingItem(SettingItem { + title: "File Icons", + description: "Show file icons in the file finder", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.file_icons } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .editor - .search + .file_finder .get_or_insert_default() - .button + .file_icons }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Debugger Button", - description: "Whether to show the debugger button in the status bar", + title: "Modal Max Width", + description: "Determines how much space the file finder can take up in relation to the available window width", field: Box::new(SettingField { pick: |settings_content| { - if let Some(debugger) = &settings_content.debugger { - &debugger.button + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.modal_max_width } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.debugger.get_or_insert_default().button + &mut settings_content + .file_finder + .get_or_insert_default() + .modal_max_width }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Tab Bar"), SettingsPageItem::SettingItem(SettingItem { - title: "Editor Tabs", - description: "Whether or not to show the tab bar in the editor", + title: "Restore File State", + description: "Restore previous file state when reopening", field: Box::new(SettingField { - pick: |settings_content| { - if let Some(tab_bar) = &settings_content.tab_bar { - &tab_bar.show - } else { - &None - } + pick: |settings_content| &settings_content.workspace.restore_on_file_reopen, + pick_mut: |settings_content| { + &mut settings_content.workspace.restore_on_file_reopen }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Close on File Delete", + description: "Automatically close files that have been deleted", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.workspace.close_on_file_delete, pick_mut: |settings_content| { - &mut settings_content.tab_bar.get_or_insert_default().show + &mut settings_content.workspace.close_on_file_delete }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show Navigation History Buttons", - description: "Whether or not to show the navigation history buttons in the tab bar", + title: "Skip Focus For Active In Search", + description: "Whether the file finder should skip focus for the active file in search results", field: Box::new(SettingField { pick: |settings_content| { - if let Some(tab_bar) = &settings_content.tab_bar { - &tab_bar.show_nav_history_buttons + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.skip_focus_for_active_in_search } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .tab_bar + .file_finder .get_or_insert_default() - .show_nav_history_buttons + .skip_focus_for_active_in_search }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Title Bar"), SettingsPageItem::SettingItem(SettingItem { - title: "Show Branch Icon", - description: "Whether to show the branch icon beside branch switcher in the titlebar", + title: "Git Status", + description: "Show the git status in the file finder", field: Box::new(SettingField { pick: |settings_content| { - if let Some(title_bar) = &settings_content.title_bar { - &title_bar.show_branch_icon + if let Some(file_finder) = &settings_content.file_finder { + &file_finder.git_status } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .title_bar + .file_finder .get_or_insert_default() - .show_branch_icon + .git_status }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("File Scan"), + ], + }, + SettingsPage { + title: "Workbench & Window", + items: vec![ + SettingsPageItem::SectionHeader("Status Bar"), SettingsPageItem::SettingItem(SettingItem { - title: "Show Branch Name", - description: "Whether to show the branch name button in the titlebar", + title: "Project Panel Button", + description: "Show the project panel button in the status bar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(title_bar) = &settings_content.title_bar { - &title_bar.show_branch_name + if let Some(project_panel) = &settings_content.project_panel { + &project_panel.button } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .title_bar + .project_panel .get_or_insert_default() - .show_branch_name + .button }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show Project Items", - description: "Whether to show the project host and name in the titlebar", + title: "Active Language Button", + description: "Show the active language button in the status bar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(title_bar) = &settings_content.title_bar { - &title_bar.show_project_items + if let Some(status_bar) = &settings_content.status_bar { + &status_bar.active_language_button } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .title_bar + .status_bar .get_or_insert_default() - .show_project_items + .active_language_button }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show Onboarding Banner", - description: "Whether to show banners announcing new features in the titlebar", + title: "Cursor Position Button", + description: "Show the cursor position button in the status bar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(title_bar) = &settings_content.title_bar { - &title_bar.show_onboarding_banner + if let Some(status_bar) = &settings_content.status_bar { + &status_bar.cursor_position_button } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .title_bar + .status_bar .get_or_insert_default() - .show_onboarding_banner + .cursor_position_button }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show User Picture", - description: "Whether to show user picture in the titlebar", + title: "Terminal Button", + description: "Show the terminal button in the status bar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(title_bar) = &settings_content.title_bar { - &title_bar.show_user_picture + if let Some(terminal) = &settings_content.terminal { + &terminal.button } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .title_bar - .get_or_insert_default() - .show_user_picture + &mut settings_content.terminal.get_or_insert_default().button }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show Sign In", - description: "Whether to show the sign in button in the titlebar", + title: "Diagnostics Button", + description: "Show the project diagnostics button in the status bar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(title_bar) = &settings_content.title_bar { - &title_bar.show_sign_in + if let Some(diagnostics) = &settings_content.diagnostics { + &diagnostics.button } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .title_bar - .get_or_insert_default() - .show_sign_in + &mut settings_content.diagnostics.get_or_insert_default().button }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show Menus", - description: "Whether to show the menus in the titlebar", + title: "Project Search Button", + description: "Show the project search button in the status bar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(title_bar) = &settings_content.title_bar { - &title_bar.show_menus + if let Some(search) = &settings_content.editor.search { + &search.button } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .title_bar + .editor + .search .get_or_insert_default() - .show_menus + .button }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Tab Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "Activate On Close", - description: "What to do after closing the current tab", + title: "Debugger Button", + description: "Show the debugger button in the status bar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(tabs) = &settings_content.tabs { - &tabs.activate_on_close + if let Some(debugger) = &settings_content.debugger { + &debugger.button } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .tabs - .get_or_insert_default() - .activate_on_close + &mut settings_content.debugger.get_or_insert_default().button }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Title Bar"), SettingsPageItem::SettingItem(SettingItem { - title: "Tab Show Diagnostics", - description: "Which files containing diagnostic errors/warnings to mark in the tabs", + title: "Show Branch Icon", + description: "Show the branch icon beside branch switcher in the titlebar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(tabs) = &settings_content.tabs { - &tabs.show_diagnostics + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_branch_icon } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .tabs + .title_bar .get_or_insert_default() - .show_diagnostics + .show_branch_icon }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show Close Button", - description: "Controls the appearance behavior of the tab's close button", + title: "Show Branch Name", + description: "Show the branch name button in the titlebar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(tabs) = &settings_content.tabs { - &tabs.show_close_button + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_branch_name } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .tabs + .title_bar .get_or_insert_default() - .show_close_button + .show_branch_name }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Preview Tabs"), SettingsPageItem::SettingItem(SettingItem { - title: "Preview Tabs Enabled", - description: "Whether to show opened editors as preview tabs", + title: "Show Project Items", + description: "Show the project host and name in the titlebar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(preview_tabs) = &settings_content.preview_tabs { - &preview_tabs.enabled + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_project_items } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .preview_tabs + .title_bar .get_or_insert_default() - .enabled + .show_project_items }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Enable Preview From File Finder", - description: "Whether to open tabs in preview mode when selected from the file finder", + title: "Show Onboarding Banner", + description: "Show banners announcing new features in the titlebar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(preview_tabs) = &settings_content.preview_tabs { - &preview_tabs.enable_preview_from_file_finder + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_onboarding_banner } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .preview_tabs + .title_bar .get_or_insert_default() - .enable_preview_from_file_finder + .show_onboarding_banner }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Enable Preview From Code Navigation", - description: "Whether a preview tab gets replaced when code navigation is used to navigate away from the tab", + title: "Show User Picture", + description: "Show user picture in the titlebar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(preview_tabs) = &settings_content.preview_tabs { - &preview_tabs.enable_preview_from_code_navigation + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_user_picture } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .preview_tabs + .title_bar .get_or_insert_default() - .enable_preview_from_code_navigation + .show_user_picture }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Search Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "Whole Word", - description: "Whether to search for whole words by default", + title: "Show Sign In", + description: "Show the sign in button in the titlebar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(search) = &settings_content.editor.search { - &search.whole_word + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_sign_in } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .editor - .search + .title_bar .get_or_insert_default() - .whole_word + .show_sign_in }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Case Sensitive", - description: "Whether to search case-sensitively by default", + title: "Show Menus", + description: "Show the menus in the titlebar", field: Box::new(SettingField { pick: |settings_content| { - if let Some(search) = &settings_content.editor.search { - &search.case_sensitive + if let Some(title_bar) = &settings_content.title_bar { + &title_bar.show_menus } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .editor - .search + .title_bar .get_or_insert_default() - .case_sensitive + .show_menus }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Tab Bar"), SettingsPageItem::SettingItem(SettingItem { - title: "Include Ignored", - description: "Whether to include ignored files in search results by default", + title: "Show Tab Bar", + description: "Show the tab bar in the editor", field: Box::new(SettingField { pick: |settings_content| { - if let Some(search) = &settings_content.editor.search { - &search.include_ignored + if let Some(tab_bar) = &settings_content.tab_bar { + &tab_bar.show } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .editor - .search - .get_or_insert_default() - .include_ignored + &mut settings_content.tab_bar.get_or_insert_default().show }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Regex", - description: "Whether to use regex search by default", + title: "Editor Tabs", + description: "Show the tab bar in the editor", field: Box::new(SettingField { pick: |settings_content| { - if let Some(search) = &settings_content.editor.search { - &search.regex + if let Some(tab_bar) = &settings_content.tab_bar { + &tab_bar.show } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.editor.search.get_or_insert_default().regex + &mut settings_content.tab_bar.get_or_insert_default().show }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("File Finder"), SettingsPageItem::SettingItem(SettingItem { - title: "File Icons", - description: "Whether to show file icons in the file finder", + title: "Show Git Status In Tabs", + description: "Show the Git file status on a tab item", field: Box::new(SettingField { pick: |settings_content| { - if let Some(file_finder) = &settings_content.file_finder { - &file_finder.file_icons + if let Some(tabs) = &settings_content.tabs { + &tabs.git_status + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.tabs.get_or_insert_default().git_status + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show File Icons In Tabs", + description: "Show the file icon for a tab", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tabs) = &settings_content.tabs { + &tabs.file_icons + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.tabs.get_or_insert_default().file_icons + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Tab Close Position", + description: "Position of the close button in a tab", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tabs) = &settings_content.tabs { + &tabs.close_position + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content.tabs.get_or_insert_default().close_position + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + files: USER, + title: "Maximum Tabs", + description: "Maximum open tabs in a pane. Will not close an unsaved tab", + // todo(settings_ui): The default for this value is null and it's use in code + // is complex, so I'm going to come back to this later + field: Box::new( + SettingField { + pick: |settings_content| &settings_content.workspace.max_tabs, + pick_mut: |settings_content| &mut settings_content.workspace.max_tabs, + } + .unimplemented(), + ), + metadata: None, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Show Navigation History Buttons", + description: "Show the navigation history buttons in the tab bar", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(tab_bar) = &settings_content.tab_bar { + &tab_bar.show_nav_history_buttons } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .file_finder + .tab_bar .get_or_insert_default() - .file_icons + .show_nav_history_buttons }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Tab Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "Modal Max Width", - description: "Determines how much space the file finder can take up in relation to the available window width", + title: "Activate On Close", + description: "What to do after closing the current tab", field: Box::new(SettingField { pick: |settings_content| { - if let Some(file_finder) = &settings_content.file_finder { - &file_finder.modal_max_width + if let Some(tabs) = &settings_content.tabs { + &tabs.activate_on_close } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .file_finder + .tabs .get_or_insert_default() - .modal_max_width + .activate_on_close }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Skip Focus For Active In Search", - description: "Whether the file finder should skip focus for the active file in search results", + title: "Tab Show Diagnostics", + description: "Which files containing diagnostic errors/warnings to mark in the tabs", field: Box::new(SettingField { pick: |settings_content| { - if let Some(file_finder) = &settings_content.file_finder { - &file_finder.skip_focus_for_active_in_search + if let Some(tabs) = &settings_content.tabs { + &tabs.show_diagnostics } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .file_finder + .tabs .get_or_insert_default() - .skip_focus_for_active_in_search + .show_diagnostics }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Git Status", - description: "Whether to show the git status in the file finder", + title: "Show Close Button", + description: "Controls the appearance behavior of the tab's close button", field: Box::new(SettingField { pick: |settings_content| { - if let Some(file_finder) = &settings_content.file_finder { - &file_finder.git_status + if let Some(tabs) = &settings_content.tabs { + &tabs.show_close_button } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .file_finder + .tabs .get_or_insert_default() - .git_status + .show_close_button }, }), metadata: None, files: USER, }), - // todo: null by default + SettingsPageItem::SectionHeader("Preview Tabs"), SettingsPageItem::SettingItem(SettingItem { - title: "Include Ignored", - description: "Whether to use gitignored files when searching", - field: Box::new( - SettingField { - pick: |settings_content| { - if let Some(file_finder) = &settings_content.file_finder { - &file_finder.include_ignored - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content - .file_finder - .get_or_insert_default() - .include_ignored - }, - } - .unimplemented(), - ), + title: "Preview Tabs Enabled", + description: "Show opened editors as preview tabs", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(preview_tabs) = &settings_content.preview_tabs { + &preview_tabs.enabled + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .preview_tabs + .get_or_insert_default() + .enabled + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Enable Preview From File Finder", + description: "Whether to open tabs in preview mode when selected from the file finder", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(preview_tabs) = &settings_content.preview_tabs { + &preview_tabs.enable_preview_from_file_finder + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .preview_tabs + .get_or_insert_default() + .enable_preview_from_file_finder + }, + }), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Enable Preview From Code Navigation", + description: "Whether a preview tab gets replaced when code navigation is used to navigate away from the tab", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(preview_tabs) = &settings_content.preview_tabs { + &preview_tabs.enable_preview_from_code_navigation + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .preview_tabs + .get_or_insert_default() + .enable_preview_from_code_navigation + }, + }), metadata: None, files: USER, }), @@ -2418,7 +2370,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "File Icons", - description: "Whether to show file icons in the project panel", + description: "Show file icons in the project panel", field: Box::new(SettingField { pick: |settings_content| { if let Some(project_panel) = &settings_content.project_panel { @@ -2460,7 +2412,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Git Status", - description: "Whether to show the git status in the project panel", + description: "Show the git status in the project panel", field: Box::new(SettingField { pick: |settings_content| { if let Some(project_panel) = &settings_content.project_panel { @@ -2502,7 +2454,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Auto Reveal Entries", - description: "Whether to reveal it in the project panel automatically when a corresponding project entry becomes active", + description: "Whether to reveal entries in the project panel automatically when a corresponding project entry becomes active", field: Box::new(SettingField { pick: |settings_content| { if let Some(project_panel) = &settings_content.project_panel { @@ -2565,7 +2517,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Scrollbar Show", - description: "When to show the scrollbar in the project panel", + description: "Show the scrollbar in the project panel", field: Box::new(SettingField { pick: |settings_content| { if let Some(project_panel) = &settings_content.project_panel @@ -2636,7 +2588,7 @@ pub(crate) fn settings_data() -> Vec { SettingsPageItem::SettingItem(SettingItem { files: USER, title: "Indent Guides Show", - description: "When to show indent guides in the project panel", + description: "Show indent guides in the project panel", field: Box::new( SettingField { pick: |settings_content| { @@ -2727,7 +2679,7 @@ pub(crate) fn settings_data() -> Vec { SettingsPageItem::SectionHeader("Outline Panel"), SettingsPageItem::SettingItem(SettingItem { title: "Outline Panel Button", - description: "Whether to show the outline panel button in the status bar", + description: "Show the outline panel button in the status bar", field: Box::new(SettingField { pick: |settings_content| { if let Some(outline_panel) = &settings_content.outline_panel { @@ -2787,7 +2739,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "File Icons", - description: "Whether to show file icons in the outline panel", + description: "Show file icons in the outline panel", field: Box::new(SettingField { pick: |settings_content| { if let Some(outline_panel) = &settings_content.outline_panel { @@ -2829,7 +2781,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Git Status", - description: "Whether to show the git status in the outline panel", + description: "Show the git status in the outline panel", field: Box::new(SettingField { pick: |settings_content| { if let Some(outline_panel) = &settings_content.outline_panel { @@ -2892,7 +2844,7 @@ pub(crate) fn settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Auto Fold Directories", - description: "Whether to fold directories automatically when a directory has only one directory inside", + description: "Whether to fold directories automatically when a directory contains only one subdirectory", field: Box::new(SettingField { pick: |settings_content| { if let Some(outline_panel) = &settings_content.outline_panel { @@ -2944,7 +2896,7 @@ pub(crate) fn settings_data() -> Vec { SettingsPageItem::SectionHeader("Git Panel"), SettingsPageItem::SettingItem(SettingItem { title: "Git Panel Button", - description: "Whether to show the Git panel button in the status bar", + description: "Show the Git panel button in the status bar", field: Box::new(SettingField { pick: |settings_content| { if let Some(git_panel) = &settings_content.git_panel { @@ -3021,7 +2973,7 @@ pub(crate) fn settings_data() -> Vec { SettingsPageItem::SectionHeader("Notification Panel"), SettingsPageItem::SettingItem(SettingItem { title: "Notification Panel Button", - description: "Whether to show the notification panel button in the status bar", + description: "Show the notification panel button in the status bar", field: Box::new(SettingField { pick: |settings_content| { if let Some(notification_panel) = &settings_content.notification_panel { @@ -3085,7 +3037,7 @@ pub(crate) fn settings_data() -> Vec { SettingsPageItem::SectionHeader("Collaboration Panel"), SettingsPageItem::SettingItem(SettingItem { title: "Collaboration Panel Button", - description: "Whether to show the collaboration panel button in the status bar", + description: "Show the collaboration panel button in the status bar", field: Box::new(SettingField { pick: |settings_content| { if let Some(collaboration_panel) = &settings_content.collaboration_panel @@ -3152,1277 +3104,1277 @@ pub(crate) fn settings_data() -> Vec { ], }, SettingsPage { - title: "Version Control", + title: "Debugger", items: vec![ - SettingsPageItem::SectionHeader("Git"), + SettingsPageItem::SectionHeader("General"), SettingsPageItem::SettingItem(SettingItem { - title: "Git Gutter", - description: "Control whether git status is shown in the editor's gutter", + title: "Stepping Granularity", + description: "Determines the stepping granularity for debug operations", field: Box::new(SettingField { pick: |settings_content| { - if let Some(git) = &settings_content.git { - &git.git_gutter + if let Some(debugger) = &settings_content.debugger { + &debugger.stepping_granularity } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.git.get_or_insert_default().git_gutter + &mut settings_content + .debugger + .get_or_insert_default() + .stepping_granularity }, }), metadata: None, files: USER, }), - // todo(settings_ui): Figure out the right default for this value in default.json SettingsPageItem::SettingItem(SettingItem { - title: "Gutter Debounce", - description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter", + title: "Save Breakpoints", + description: "Whether breakpoints should be reused across Zed sessions", field: Box::new(SettingField { pick: |settings_content| { - if let Some(git) = &settings_content.git { - &git.gutter_debounce + if let Some(debugger) = &settings_content.debugger { + &debugger.save_breakpoints } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.git.get_or_insert_default().gutter_debounce + &mut settings_content + .debugger + .get_or_insert_default() + .save_breakpoints }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Inline Git Blame", - description: "Whether or not to show git blame data inline in the currently focused line", + title: "Timeout", + description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter", field: Box::new(SettingField { pick: |settings_content| { - if let Some(git) = &settings_content.git { - if let Some(inline_blame) = &git.inline_blame { - &inline_blame.enabled - } else { - &None - } + if let Some(debugger) = &settings_content.debugger { + &debugger.timeout } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .git - .get_or_insert_default() - .inline_blame - .get_or_insert_default() - .enabled + &mut settings_content.debugger.get_or_insert_default().timeout }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Inline Git Blame Delay", - description: "The delay after which the inline blame information is shown", + title: "Log DAP Communications", + description: "Whether to log messages between active debug adapters and Zed", field: Box::new(SettingField { pick: |settings_content| { - if let Some(git) = &settings_content.git { - if let Some(inline_blame) = &git.inline_blame { - &inline_blame.delay_ms - } else { - &None - } + if let Some(debugger) = &settings_content.debugger { + &debugger.log_dap_communications } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .git - .get_or_insert_default() - .inline_blame + .debugger .get_or_insert_default() - .delay_ms + .log_dap_communications }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Inline Git Blame Padding", - description: "Padding between the end of the source line and the start of the inline blame in columns", + title: "Format DAP Log Messages", + description: "Whether to format DAP messages when adding them to debug adapter logger", field: Box::new(SettingField { pick: |settings_content| { - if let Some(git) = &settings_content.git { - if let Some(inline_blame) = &git.inline_blame { - &inline_blame.padding - } else { - &None - } + if let Some(debugger) = &settings_content.debugger { + &debugger.format_dap_log_messages } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .git - .get_or_insert_default() - .inline_blame + .debugger .get_or_insert_default() - .padding + .format_dap_log_messages }, }), metadata: None, files: USER, }), + ], + }, + SettingsPage { + title: "Terminal", + items: vec![ + SettingsPageItem::SectionHeader("Environment"), SettingsPageItem::SettingItem(SettingItem { - title: "Inline Git Blame Min Column", - description: "The minimum column number to show the inline blame information at", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(git) = &settings_content.git { - if let Some(inline_blame) = &git.inline_blame { - &inline_blame.min_column + title: "Shell", + description: "What shell to use when opening a terminal", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.project.shell } else { &None } - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content - .git - .get_or_insert_default() - .inline_blame - .get_or_insert_default() - .min_column - }, - }), + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .project + .shell + }, + } + .unimplemented(), + ), metadata: None, - files: USER, + files: USER | LOCAL, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show Commit Summary", - description: "Whether to show commit summary as part of the inline blame", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(git) = &settings_content.git { - if let Some(inline_blame) = &git.inline_blame { - &inline_blame.show_commit_summary + title: "Working Directory", + description: "What working directory to use when launching the terminal", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.project.working_directory } else { &None } - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content - .git - .get_or_insert_default() - .inline_blame - .get_or_insert_default() - .show_commit_summary - }, - }), + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .project + .working_directory + }, + } + .unimplemented(), + ), metadata: None, - files: USER, + files: USER | LOCAL, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show Avatar", - description: "Whether to show the avatar of the author of the commit", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(git) = &settings_content.git { - if let Some(blame) = &git.blame { - &blame.show_avatar + title: "Environment Variables", + description: "Key-value pairs to add to the terminal's environment", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.project.env } else { &None } - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content - .git - .get_or_insert_default() - .blame - .get_or_insert_default() - .show_avatar - }, - }), + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .project + .env + }, + } + .unimplemented(), + ), metadata: None, - files: USER, + files: USER | LOCAL, }), SettingsPageItem::SettingItem(SettingItem { - title: "Show Author Name In Branch Picker", - description: "Whether to show author name as part of the commit information in branch picker", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(git) = &settings_content.git { - if let Some(branch_picker) = &git.branch_picker { - &branch_picker.show_author_name + title: "Detect Virtual Environment", + description: "Activates the python virtual environment, if one is found, in the terminal's working directory", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.project.detect_venv } else { &None } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .project + .detect_venv + }, + } + .unimplemented(), + ), + metadata: None, + files: USER | LOCAL, + }), + SettingsPageItem::SectionHeader("Font"), + SettingsPageItem::SettingItem(SettingItem { + title: "Font Size", + description: "Font size for terminal text. If not set, defaults to buffer font size", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.font_size + } else if settings_content.theme.buffer_font_size.is_some() { + &settings_content.theme.buffer_font_size } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .git - .get_or_insert_default() - .branch_picker - .get_or_insert_default() - .show_author_name + &mut settings_content.terminal.get_or_insert_default().font_size }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Hunk Style", - description: "How git hunks are displayed visually in the editor", + title: "Font Family", + description: "Font family for terminal text. If not set, defaults to buffer font family", field: Box::new(SettingField { pick: |settings_content| { - if let Some(git) = &settings_content.git { - &git.hunk_style + if let Some(terminal) = &settings_content.terminal + && terminal.font_family.is_some() + { + &terminal.font_family + } else if settings_content.theme.buffer_font_family.is_some() { + &settings_content.theme.buffer_font_family } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.git.get_or_insert_default().hunk_style + &mut settings_content + .terminal + .get_or_insert_default() + .font_family }, }), metadata: None, files: USER, }), - ], - }, - SettingsPage { - title: "System & Network", - items: vec![ - SettingsPageItem::SectionHeader("Network"), - // todo(settings_ui): Proxy needs a default SettingsPageItem::SettingItem(SettingItem { - title: "Proxy", - description: "The proxy to use for network requests", + title: "Font Fallbacks", + description: "Font fallbacks for terminal text. If not set, defaults to buffer font fallbacks", field: Box::new( SettingField { - pick: |settings_content| &settings_content.proxy, - pick_mut: |settings_content| &mut settings_content.proxy, + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.font_fallbacks + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .font_fallbacks + }, } .unimplemented(), ), - metadata: Some(Box::new(SettingsFieldMetadata { - placeholder: Some("socks5h://localhost:10808"), - })), - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Server URL", - description: "The URL of the Zed server to connect to", - field: Box::new(SettingField { - pick: |settings_content| &settings_content.server_url, - pick_mut: |settings_content| &mut settings_content.server_url, - }), - metadata: Some(Box::new(SettingsFieldMetadata { - placeholder: Some("https://zed.dev"), - })), - files: USER, - }), - SettingsPageItem::SectionHeader("System"), - SettingsPageItem::SettingItem(SettingItem { - title: "Auto Update", - description: "Whether or not to automatically check for updates", - field: Box::new(SettingField { - pick: |settings_content| &settings_content.auto_update, - pick_mut: |settings_content| &mut settings_content.auto_update, - }), metadata: None, files: USER, }), - ], - }, - SettingsPage { - title: "Diagnostics & Errors", - items: vec![ - SettingsPageItem::SectionHeader("Filtering"), SettingsPageItem::SettingItem(SettingItem { - title: "Max Severity", - description: "Which level to use to filter out diagnostics displayed in the editor", - field: Box::new(SettingField { - pick: |settings_content| &settings_content.editor.diagnostics_max_severity, - pick_mut: |settings_content| { - &mut settings_content.editor.diagnostics_max_severity - }, - }), - metadata: None, - files: USER, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Include Warnings", - description: "Whether to show warnings or not by default", + title: "Font Weight", + description: "Font weight for terminal text in CSS weight units (100-900)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(diagnostics) = &settings_content.diagnostics { - &diagnostics.include_warnings + if let Some(terminal) = &settings_content.terminal { + &terminal.font_weight } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .diagnostics + .terminal .get_or_insert_default() - .include_warnings + .font_weight }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Inline"), SettingsPageItem::SettingItem(SettingItem { - title: "Inline Diagnostics Enabled", - description: "Whether to show diagnostics inline or not", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(diagnostics) = &settings_content.diagnostics { - if let Some(inline) = &diagnostics.inline { - &inline.enabled + title: "Font Features", + description: "Font features for terminal text", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.font_features } else { &None } - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content - .diagnostics - .get_or_insert_default() - .inline - .get_or_insert_default() - .enabled - }, - }), + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .font_features + }, + } + .unimplemented(), + ), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Display Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "Inline Update Debounce", - description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update", - field: Box::new(SettingField { - pick: |settings_content| { - if let Some(diagnostics) = &settings_content.diagnostics { - if let Some(inline) = &diagnostics.inline { - &inline.update_debounce_ms + title: "Line Height", + description: "Line height for terminal text", + field: Box::new( + SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.line_height } else { &None } + }, + pick_mut: |settings_content| { + &mut settings_content + .terminal + .get_or_insert_default() + .line_height + }, + } + .unimplemented(), + ), + metadata: None, + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Cursor Shape", + description: "Default cursor shape for the terminal (bar, block, underline, or hollow)", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.cursor_shape } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .diagnostics - .get_or_insert_default() - .inline + .terminal .get_or_insert_default() - .update_debounce_ms + .cursor_shape }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Inline Padding", - description: "The amount of padding between the end of the source line and the start of the inline diagnostic", + title: "Cursor Blinking", + description: "Sets the cursor blinking behavior in the terminal", field: Box::new(SettingField { pick: |settings_content| { - if let Some(diagnostics) = &settings_content.diagnostics { - if let Some(inline) = &diagnostics.inline { - &inline.padding - } else { - &None - } + if let Some(terminal) = &settings_content.terminal { + &terminal.blinking } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .diagnostics - .get_or_insert_default() - .inline - .get_or_insert_default() - .padding + &mut settings_content.terminal.get_or_insert_default().blinking }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Inline Min Column", - description: "The minimum column to display inline diagnostics", + title: "Alternate Scroll", + description: "Whether Alternate Scroll mode is active by default (converts mouse scroll to arrow keys in apps like vim)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(diagnostics) = &settings_content.diagnostics { - if let Some(inline) = &diagnostics.inline { - &inline.min_column - } else { - &None - } + if let Some(terminal) = &settings_content.terminal { + &terminal.alternate_scroll } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .diagnostics - .get_or_insert_default() - .inline + .terminal .get_or_insert_default() - .min_column + .alternate_scroll }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Performance"), SettingsPageItem::SettingItem(SettingItem { - title: "LSP Pull Diagnostics Enabled", - description: "Whether to pull for language server-powered diagnostics or not", + title: "Minimum Contrast", + description: "The minimum APCA perceptual contrast between foreground and background colors (0-106)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(diagnostics) = &settings_content.diagnostics { - if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics { - &lsp_pull.enabled - } else { - &None - } + if let Some(terminal) = &settings_content.terminal { + &terminal.minimum_contrast } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .diagnostics - .get_or_insert_default() - .lsp_pull_diagnostics + .terminal .get_or_insert_default() - .enabled + .minimum_contrast }, }), metadata: None, files: USER, }), - // todo(settings_ui): Needs unit + SettingsPageItem::SectionHeader("Behavior Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "LSP Pull Debounce", - description: "Minimum time to wait before pulling diagnostics from the language server(s)", + title: "Option As Meta", + description: "Whether the option key behaves as the meta key", field: Box::new(SettingField { pick: |settings_content| { - if let Some(diagnostics) = &settings_content.diagnostics { - if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics { - &lsp_pull.debounce_ms - } else { - &None - } + if let Some(terminal) = &settings_content.terminal { + &terminal.option_as_meta } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .diagnostics - .get_or_insert_default() - .lsp_pull_diagnostics + .terminal .get_or_insert_default() - .debounce_ms + .option_as_meta }, }), metadata: None, files: USER, }), - ], - }, - SettingsPage { - title: "Debugger", - items: vec![ - SettingsPageItem::SectionHeader("General"), SettingsPageItem::SettingItem(SettingItem { - title: "Stepping Granularity", - description: "Determines the stepping granularity for debug operations", + title: "Copy On Select", + description: "Whether selecting text in the terminal automatically copies to the system clipboard", field: Box::new(SettingField { pick: |settings_content| { - if let Some(debugger) = &settings_content.debugger { - &debugger.stepping_granularity + if let Some(terminal) = &settings_content.terminal { + &terminal.copy_on_select } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .debugger + .terminal .get_or_insert_default() - .stepping_granularity + .copy_on_select }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Save Breakpoints", - description: "Whether breakpoints should be reused across Zed sessions", + title: "Keep Selection On Copy", + description: "Whether to keep the text selection after copying it to the clipboard", field: Box::new(SettingField { - pick: |settings_content| { - if let Some(debugger) = &settings_content.debugger { - &debugger.save_breakpoints + pick: |settings_content| { + if let Some(terminal) = &settings_content.terminal { + &terminal.keep_selection_on_copy } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .debugger + .terminal .get_or_insert_default() - .save_breakpoints + .keep_selection_on_copy }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Layout Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "Timeout", - description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter", + title: "Default Width", + description: "Default width when the terminal is docked to the left or right (in pixels)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(debugger) = &settings_content.debugger { - &debugger.timeout + if let Some(terminal) = &settings_content.terminal { + &terminal.default_width } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.debugger.get_or_insert_default().timeout + &mut settings_content + .terminal + .get_or_insert_default() + .default_width }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Log DAP Communications", - description: "Whether to log messages between active debug adapters and Zed", + title: "Default Height", + description: "Default height when the terminal is docked to the bottom (in pixels)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(debugger) = &settings_content.debugger { - &debugger.log_dap_communications + if let Some(terminal) = &settings_content.terminal { + &terminal.default_height } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .debugger + .terminal .get_or_insert_default() - .log_dap_communications + .default_height }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Advanced Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "Format DAP Log Messages", - description: "Whether to format DAP messages when adding them to debug adapter logger", + title: "Max Scroll History Lines", + description: "Maximum number of lines to keep in scrollback history (max: 100,000; 0 disables scrolling)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(debugger) = &settings_content.debugger { - &debugger.format_dap_log_messages + if let Some(terminal) = &settings_content.terminal { + &terminal.max_scroll_history_lines } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .debugger + .terminal .get_or_insert_default() - .format_dap_log_messages + .max_scroll_history_lines }, }), metadata: None, files: USER, }), - ], - }, - SettingsPage { - title: "Collaboration", - items: vec![ - SettingsPageItem::SectionHeader("Calls"), + SettingsPageItem::SectionHeader("Toolbar"), SettingsPageItem::SettingItem(SettingItem { - title: "Mute On Join", - description: "Whether the microphone should be muted when joining a channel or a call", + title: "Breadcrumbs", + description: "Display the terminal title in breadcrumbs inside the terminal pane", field: Box::new(SettingField { pick: |settings_content| { - if let Some(calls) = &settings_content.calls { - &calls.mute_on_join + if let Some(terminal) = &settings_content.terminal { + if let Some(toolbar) = &terminal.toolbar { + &toolbar.breadcrumbs + } else { + &None + } } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.calls.get_or_insert_default().mute_on_join + &mut settings_content + .terminal + .get_or_insert_default() + .toolbar + .get_or_insert_default() + .breadcrumbs }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Scrollbar"), SettingsPageItem::SettingItem(SettingItem { - title: "Share On Join", - description: "Whether your current project should be shared when joining an empty channel", + title: "Show Scrollbar", + description: "When to show the scrollbar in the terminal", field: Box::new(SettingField { pick: |settings_content| { - if let Some(calls) = &settings_content.calls { - &calls.share_on_join + if let Some(terminal) = &settings_content.terminal + && let Some(scrollbar) = &terminal.scrollbar + && scrollbar.show.is_some() + { + &scrollbar.show + } else if let Some(scrollbar) = &settings_content.editor.scrollbar { + &scrollbar.show } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.calls.get_or_insert_default().share_on_join + &mut settings_content + .terminal + .get_or_insert_default() + .scrollbar + .get_or_insert_default() + .show }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Experimental"), + ], + }, + SettingsPage { + title: "Version Control", + items: vec![ + SettingsPageItem::SectionHeader("Git"), SettingsPageItem::SettingItem(SettingItem { - title: "Rodio Audio", - description: "Opt into the new audio system", + title: "Git Gutter", + description: "Control whether git status is shown in the editor's gutter", field: Box::new(SettingField { pick: |settings_content| { - if let Some(audio) = &settings_content.audio { - &audio.rodio_audio + if let Some(git) = &settings_content.git { + &git.git_gutter } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.audio.get_or_insert_default().rodio_audio + &mut settings_content.git.get_or_insert_default().git_gutter }, }), metadata: None, files: USER, }), + // todo(settings_ui): Figure out the right default for this value in default.json SettingsPageItem::SettingItem(SettingItem { - title: "Auto Microphone Volume", - description: "Automatically adjust microphone volume (requires Rodio Audio)", + title: "Gutter Debounce", + description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter", field: Box::new(SettingField { pick: |settings_content| { - if let Some(audio) = &settings_content.audio { - &audio.auto_microphone_volume + if let Some(git) = &settings_content.git { + &git.gutter_debounce } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .audio - .get_or_insert_default() - .auto_microphone_volume + &mut settings_content.git.get_or_insert_default().gutter_debounce }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Auto Speaker Volume", - description: "Automatically adjust volume of other call members (requires Rodio Audio)", + title: "Inline Git Blame", + description: "Whether or not to show git blame data inline in the currently focused line", field: Box::new(SettingField { pick: |settings_content| { - if let Some(audio) = &settings_content.audio { - &audio.auto_speaker_volume + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.enabled + } else { + &None + } } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .audio + .git .get_or_insert_default() - .auto_speaker_volume + .inline_blame + .get_or_insert_default() + .enabled }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Denoise", - description: "Remove background noises (requires Rodio Audio)", + title: "Inline Git Blame Delay", + description: "The delay after which the inline blame information is shown", field: Box::new(SettingField { pick: |settings_content| { - if let Some(audio) = &settings_content.audio { - &audio.denoise + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.delay_ms + } else { + &None + } } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.audio.get_or_insert_default().denoise + &mut settings_content + .git + .get_or_insert_default() + .inline_blame + .get_or_insert_default() + .delay_ms }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Legacy Audio Compatible", - description: "Use audio parameters compatible with previous versions (requires Rodio Audio)", + title: "Inline Git Blame Padding", + description: "Padding between the end of the source line and the start of the inline blame in columns", field: Box::new(SettingField { pick: |settings_content| { - if let Some(audio) = &settings_content.audio { - &audio.legacy_audio_compatible + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.padding + } else { + &None + } } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .audio + .git .get_or_insert_default() - .legacy_audio_compatible + .inline_blame + .get_or_insert_default() + .padding }, }), metadata: None, files: USER, }), - ], - }, - SettingsPage { - title: "AI", - items: vec![ - SettingsPageItem::SectionHeader("General"), SettingsPageItem::SettingItem(SettingItem { - title: "Disable AI", - description: "Whether to disable all AI features in Zed", + title: "Inline Git Blame Min Column", + description: "The minimum column number to show the inline blame information at", field: Box::new(SettingField { - pick: |settings_content| &settings_content.disable_ai, - pick_mut: |settings_content| &mut settings_content.disable_ai, - }), - metadata: None, - files: USER, - }), - ], - }, - SettingsPage { - title: "Terminal", - items: vec![ - SettingsPageItem::SectionHeader("Environment"), - SettingsPageItem::SettingItem(SettingItem { - title: "Shell", - description: "What shell to use when opening a terminal", - field: Box::new( - SettingField { - pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.project.shell - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .project - .shell - }, - } - .unimplemented(), - ), - metadata: None, - files: USER | LOCAL, - }), - SettingsPageItem::SettingItem(SettingItem { - title: "Working Directory", - description: "What working directory to use when launching the terminal", - field: Box::new( - SettingField { - pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.project.working_directory + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.min_column } else { &None } - }, - pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .project - .working_directory - }, - } - .unimplemented(), - ), + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .inline_blame + .get_or_insert_default() + .min_column + }, + }), metadata: None, - files: USER | LOCAL, + files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Environment Variables", - description: "Key-value pairs to add to the terminal's environment", - field: Box::new( - SettingField { - pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.project.env + title: "Show Commit Summary", + description: "Show commit summary as part of the inline blame", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(inline_blame) = &git.inline_blame { + &inline_blame.show_commit_summary } else { &None } - }, - pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .project - .env - }, - } - .unimplemented(), - ), + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .inline_blame + .get_or_insert_default() + .show_commit_summary + }, + }), metadata: None, - files: USER | LOCAL, + files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Detect Virtual Environment", - description: "Activates the python virtual environment, if one is found, in the terminal's working directory", - field: Box::new( - SettingField { - pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.project.detect_venv + title: "Show Avatar", + description: "Show the avatar of the author of the commit", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(git) = &settings_content.git { + if let Some(blame) = &git.blame { + &blame.show_avatar } else { &None } - }, - pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .project - .detect_venv - }, - } - .unimplemented(), - ), + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .git + .get_or_insert_default() + .blame + .get_or_insert_default() + .show_avatar + }, + }), metadata: None, - files: USER | LOCAL, + files: USER, }), - SettingsPageItem::SectionHeader("Font"), SettingsPageItem::SettingItem(SettingItem { - title: "Font Size", - description: "Font size for terminal text. If not set, defaults to buffer font size", + title: "Show Author Name In Branch Picker", + description: "Show author name as part of the commit information in branch picker", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.font_size - } else if settings_content.theme.buffer_font_size.is_some() { - &settings_content.theme.buffer_font_size + if let Some(git) = &settings_content.git { + if let Some(branch_picker) = &git.branch_picker { + &branch_picker.show_author_name + } else { + &None + } } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.terminal.get_or_insert_default().font_size + &mut settings_content + .git + .get_or_insert_default() + .branch_picker + .get_or_insert_default() + .show_author_name }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Font Family", - description: "Font family for terminal text. If not set, defaults to buffer font family", + title: "Hunk Style", + description: "How git hunks are displayed visually in the editor", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal - && terminal.font_family.is_some() - { - &terminal.font_family - } else if settings_content.theme.buffer_font_family.is_some() { - &settings_content.theme.buffer_font_family + if let Some(git) = &settings_content.git { + &git.hunk_style } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .font_family + &mut settings_content.git.get_or_insert_default().hunk_style }, }), metadata: None, files: USER, }), + ], + }, + SettingsPage { + title: "Diagnostics & Errors", + items: vec![ + SettingsPageItem::SectionHeader("Filtering"), SettingsPageItem::SettingItem(SettingItem { - title: "Font Fallbacks", - description: "Font fallbacks for terminal text. If not set, defaults to buffer font fallbacks", - field: Box::new( - SettingField { - pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.font_fallbacks - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .font_fallbacks - }, - } - .unimplemented(), - ), + title: "Max Severity", + description: "Which level to use to filter out diagnostics displayed in the editor", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.diagnostics_max_severity, + pick_mut: |settings_content| { + &mut settings_content.editor.diagnostics_max_severity + }, + }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Font Weight", - description: "Font weight for terminal text in CSS weight units (100-900)", + title: "Include Warnings", + description: "Whether to show warnings or not by default", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.font_weight + if let Some(diagnostics) = &settings_content.diagnostics { + &diagnostics.include_warnings } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .terminal + .diagnostics .get_or_insert_default() - .font_weight + .include_warnings }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Inline"), SettingsPageItem::SettingItem(SettingItem { - title: "Font Features", - description: "Font features for terminal text", - field: Box::new( - SettingField { - pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.font_features + title: "Inline Diagnostics Enabled", + description: "Whether to show diagnostics inline or not", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(inline) = &diagnostics.inline { + &inline.enabled } else { &None } - }, - pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .font_features - }, - } - .unimplemented(), - ), + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .diagnostics + .get_or_insert_default() + .inline + .get_or_insert_default() + .enabled + }, + }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Display Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "Line Height", - description: "Line height for terminal text", - field: Box::new( - SettingField { - pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.line_height + title: "Inline Update Debounce", + description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update", + field: Box::new(SettingField { + pick: |settings_content| { + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(inline) = &diagnostics.inline { + &inline.update_debounce_ms } else { &None } - }, - pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .line_height - }, - } - .unimplemented(), - ), + } else { + &None + } + }, + pick_mut: |settings_content| { + &mut settings_content + .diagnostics + .get_or_insert_default() + .inline + .get_or_insert_default() + .update_debounce_ms + }, + }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Cursor Shape", - description: "Default cursor shape for the terminal (bar, block, underline, or hollow)", + title: "Inline Padding", + description: "The amount of padding between the end of the source line and the start of the inline diagnostic", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.cursor_shape + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(inline) = &diagnostics.inline { + &inline.padding + } else { + &None + } } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .terminal + .diagnostics .get_or_insert_default() - .cursor_shape + .inline + .get_or_insert_default() + .padding }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Cursor Blinking", - description: "Sets the cursor blinking behavior in the terminal", + title: "Inline Min Column", + description: "The minimum column to display inline diagnostics", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.blinking + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(inline) = &diagnostics.inline { + &inline.min_column + } else { + &None + } } else { &None } }, pick_mut: |settings_content| { - &mut settings_content.terminal.get_or_insert_default().blinking + &mut settings_content + .diagnostics + .get_or_insert_default() + .inline + .get_or_insert_default() + .min_column }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Performance"), SettingsPageItem::SettingItem(SettingItem { - title: "Alternate Scroll", - description: "Whether Alternate Scroll mode is active by default (converts mouse scroll to arrow keys in apps like vim)", + title: "LSP Pull Diagnostics Enabled", + description: "Whether to pull for language server-powered diagnostics or not", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.alternate_scroll + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics { + &lsp_pull.enabled + } else { + &None + } } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .terminal + .diagnostics .get_or_insert_default() - .alternate_scroll + .lsp_pull_diagnostics + .get_or_insert_default() + .enabled }, }), metadata: None, files: USER, }), + // todo(settings_ui): Needs unit SettingsPageItem::SettingItem(SettingItem { - title: "Minimum Contrast", - description: "The minimum APCA perceptual contrast between foreground and background colors (0-106)", + title: "LSP Pull Debounce", + description: "Minimum time to wait before pulling diagnostics from the language server(s)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.minimum_contrast + if let Some(diagnostics) = &settings_content.diagnostics { + if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics { + &lsp_pull.debounce_ms + } else { + &None + } } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .terminal + .diagnostics .get_or_insert_default() - .minimum_contrast + .lsp_pull_diagnostics + .get_or_insert_default() + .debounce_ms }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Behavior Settings"), + ], + }, + SettingsPage { + title: "Collaboration", + items: vec![ + SettingsPageItem::SectionHeader("Calls"), SettingsPageItem::SettingItem(SettingItem { - title: "Option As Meta", - description: "Whether the option key behaves as the meta key", + title: "Mute On Join", + description: "Whether the microphone should be muted when joining a channel or a call", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.option_as_meta + if let Some(calls) = &settings_content.calls { + &calls.mute_on_join } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .option_as_meta + &mut settings_content.calls.get_or_insert_default().mute_on_join }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Copy On Select", - description: "Whether selecting text in the terminal automatically copies to the system clipboard", + title: "Share On Join", + description: "Whether your current project should be shared when joining an empty channel", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.copy_on_select + if let Some(calls) = &settings_content.calls { + &calls.share_on_join } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .copy_on_select + &mut settings_content.calls.get_or_insert_default().share_on_join }, }), metadata: None, files: USER, }), + SettingsPageItem::SectionHeader("Experimental"), SettingsPageItem::SettingItem(SettingItem { - title: "Keep Selection On Copy", - description: "Whether to keep the text selection after copying it to the clipboard", + title: "Rodio Audio", + description: "Opt into the new audio system", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.keep_selection_on_copy + if let Some(audio) = &settings_content.audio { + &audio.rodio_audio } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .keep_selection_on_copy + &mut settings_content.audio.get_or_insert_default().rodio_audio }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Layout Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "Default Width", - description: "Default width when the terminal is docked to the left or right (in pixels)", + title: "Auto Microphone Volume", + description: "Automatically adjust microphone volume (requires Rodio Audio)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.default_width + if let Some(audio) = &settings_content.audio { + &audio.auto_microphone_volume } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .terminal + .audio .get_or_insert_default() - .default_width + .auto_microphone_volume }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { - title: "Default Height", - description: "Default height when the terminal is docked to the bottom (in pixels)", + title: "Auto Speaker Volume", + description: "Automatically adjust volume of other call members (requires Rodio Audio)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.default_height + if let Some(audio) = &settings_content.audio { + &audio.auto_speaker_volume } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .terminal + .audio .get_or_insert_default() - .default_height + .auto_speaker_volume }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Advanced Settings"), SettingsPageItem::SettingItem(SettingItem { - title: "Max Scroll History Lines", - description: "Maximum number of lines to keep in scrollback history (max: 100,000; 0 disables scrolling)", + title: "Denoise", + description: "Remove background noises (requires Rodio Audio)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - &terminal.max_scroll_history_lines + if let Some(audio) = &settings_content.audio { + &audio.denoise } else { &None } }, pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .max_scroll_history_lines + &mut settings_content.audio.get_or_insert_default().denoise }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Toolbar"), SettingsPageItem::SettingItem(SettingItem { - title: "Breadcrumbs", - description: "Whether to display the terminal title in breadcrumbs inside the terminal pane", + title: "Legacy Audio Compatible", + description: "Use audio parameters compatible with previous versions (requires Rodio Audio)", field: Box::new(SettingField { pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal { - if let Some(toolbar) = &terminal.toolbar { - &toolbar.breadcrumbs - } else { - &None - } + if let Some(audio) = &settings_content.audio { + &audio.legacy_audio_compatible } else { &None } }, pick_mut: |settings_content| { &mut settings_content - .terminal - .get_or_insert_default() - .toolbar + .audio .get_or_insert_default() - .breadcrumbs + .legacy_audio_compatible }, }), metadata: None, files: USER, }), - SettingsPageItem::SectionHeader("Scrollbar"), + ], + }, + SettingsPage { + title: "AI", + items: vec![ + SettingsPageItem::SectionHeader("General"), SettingsPageItem::SettingItem(SettingItem { - title: "Show Scrollbar", - description: "When to show the scrollbar in the terminal", + title: "Disable AI", + description: "Whether to disable all AI features in Zed", field: Box::new(SettingField { - pick: |settings_content| { - if let Some(terminal) = &settings_content.terminal - && let Some(scrollbar) = &terminal.scrollbar - && scrollbar.show.is_some() - { - &scrollbar.show - } else if let Some(scrollbar) = &settings_content.editor.scrollbar { - &scrollbar.show - } else { - &None - } - }, - pick_mut: |settings_content| { - &mut settings_content - .terminal - .get_or_insert_default() - .scrollbar - .get_or_insert_default() - .show - }, + pick: |settings_content| &settings_content.disable_ai, + pick_mut: |settings_content| &mut settings_content.disable_ai, + }), + metadata: None, + files: USER, + }), + ], + }, + SettingsPage { + title: "System & Network", + items: vec![ + SettingsPageItem::SectionHeader("Network"), + // todo(settings_ui): Proxy needs a default + SettingsPageItem::SettingItem(SettingItem { + title: "Proxy", + description: "The proxy to use for network requests", + field: Box::new( + SettingField { + pick: |settings_content| &settings_content.proxy, + pick_mut: |settings_content| &mut settings_content.proxy, + } + .unimplemented(), + ), + metadata: Some(Box::new(SettingsFieldMetadata { + placeholder: Some("socks5h://localhost:10808"), + })), + files: USER, + }), + SettingsPageItem::SettingItem(SettingItem { + title: "Server URL", + description: "The URL of the Zed server to connect to", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.server_url, + pick_mut: |settings_content| &mut settings_content.server_url, + }), + metadata: Some(Box::new(SettingsFieldMetadata { + placeholder: Some("https://zed.dev"), + })), + files: USER, + }), + SettingsPageItem::SectionHeader("System"), + SettingsPageItem::SettingItem(SettingItem { + title: "Auto Update", + description: "Whether or not to automatically check for updates", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.auto_update, + pick_mut: |settings_content| &mut settings_content.auto_update, }), metadata: None, files: USER, @@ -4561,7 +4513,7 @@ fn language_settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Show Wrap Guides", - description: "Whether to show wrap guides in the editor", + description: "Show wrap guides in the editor", field: Box::new(SettingField { pick: |settings_content| { language_settings_field(settings_content, |language| &language.show_wrap_guides) @@ -4631,7 +4583,7 @@ fn language_settings_data() -> Vec { SettingsPageItem::SectionHeader("Indent Guides"), SettingsPageItem::SettingItem(SettingItem { title: "Enabled", - description: "Whether to display indent guides in the editor", + description: "Display indent guides in the editor", field: Box::new(SettingField { pick: |settings_content| { language_settings_field(settings_content, |language| { @@ -5066,6 +5018,16 @@ fn language_settings_data() -> Vec { metadata: None, files: USER | LOCAL, }), + SettingsPageItem::SettingItem(SettingItem { + title: "Go To Definition Fallback", + description: "Whether to follow-up empty go to definition responses from the language server", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.go_to_definition_fallback, + pick_mut: |settings_content| &mut settings_content.editor.go_to_definition_fallback, + }), + metadata: None, + files: USER, + }), SettingsPageItem::SectionHeader("Edit Predictions"), SettingsPageItem::SettingItem(SettingItem { title: "Show Edit Predictions", @@ -5448,7 +5410,7 @@ fn language_settings_data() -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Show Background", - description: "Whether to show a background for inlay hints", + description: "Show a background for inlay hints", field: Box::new(SettingField { pick: |settings_content| { language_settings_field(settings_content, |language| { @@ -5636,6 +5598,16 @@ fn language_settings_data() -> Vec { metadata: None, files: USER | LOCAL, }), + SettingsPageItem::SettingItem(SettingItem { + title: "Middle Click Paste", + description: "Enable middle-click paste on Linux", + field: Box::new(SettingField { + pick: |settings_content| &settings_content.editor.middle_click_paste, + pick_mut: |settings_content| &mut settings_content.editor.middle_click_paste, + }), + metadata: None, + files: USER, + }), SettingsPageItem::SettingItem(SettingItem { title: "Extend Comment On Newline", description: "Whether to start a new line with a comment when a previous line is a comment as well",