use gpui::{Action as _, App};use itertools::Itertools as _;use settings::{ AudioInputDeviceName, AudioOutputDeviceName, EditPredictionDataCollectionChoice, LanguageSettingsContent, SemanticTokens, SettingsContent,};use std::sync::{Arc, OnceLock};use strum::{EnumMessage, IntoDiscriminant as _, VariantArray};use theme::SystemAppearance;use ui::IntoElement; use crate::{ ActionLink, DynamicItem, PROJECT, SettingField, SettingItem, SettingsFieldMetadata, SettingsPage, SettingsPageItem, SubPageLink, USER, active_language, all_language_names, pages::{ open_audio_test_window, render_edit_prediction_setup_page, render_external_agents_page, render_llm_providers_page, render_mcp_servers_page, render_sandbox_settings_page, render_skills_setup_page, render_tool_permissions_setup_page, },}; const DEFAULT_STRING: String = String::new();/// A default empty string reference. Useful in `pick` functions for cases either in dynamic item fields, or when dealing with `settings::Maybe`/// to avoid the "NO DEFAULT" case.const DEFAULT_EMPTY_STRING: Option<&String> = Some(&DEFAULT_STRING); const DEFAULT_AUDIO_OUTPUT: AudioOutputDeviceName = AudioOutputDeviceName(None);const DEFAULT_EMPTY_AUDIO_OUTPUT: Option<&AudioOutputDeviceName> = Some(&DEFAULT_AUDIO_OUTPUT);const DEFAULT_AUDIO_INPUT: AudioInputDeviceName = AudioInputDeviceName(None);const DEFAULT_EMPTY_AUDIO_INPUT: Option<&AudioInputDeviceName> = Some(&DEFAULT_AUDIO_INPUT); macro_rules! concat_sections { (@vec, $($arr:expr),+ $(,)?) => {{ let total_len = 0_usize $(+ $arr.len())+; let mut out = Vec::with_capacity(total_len); $( out.extend($arr); )+ out }}; ($($arr:expr),+ $(,)?) => {{ let total_len = 0_usize $(+ $arr.len())+; let mut out: Box<[std::mem::MaybeUninit<_>]> = Box::new_uninit_slice(total_len); let mut index = 0usize; $( let array = $arr; for item in array { out[index].write(item); index += 1; } )+ debug_assert_eq!(index, total_len); // SAFETY: we wrote exactly `total_len` elements. unsafe { out.assume_init() } }};} pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> { vec![ general_page(cx), appearance_page(), keymap_page(), editor_page(), languages_and_tools_page(cx), search_and_files_page(), window_and_layout_page(), panels_page(), debugger_page(), terminal_page(), version_control_page(), collaboration_page(), ai_page(cx), network_page(), developer_page(cx), ]} fn developer_page(cx: &App) -> SettingsPage { use feature_flags::FeatureFlagAppExt as _; let mut items: Vec<SettingsPageItem> = Vec::new(); // Feature flag overrides are a staff-only affordance, so only surface the section when the overrides are enabled. if cx.feature_flag_overrides_enabled() { items.push(SettingsPageItem::SectionHeader("Feature Flags")); items.push(SettingsPageItem::SubPageLink(SubPageLink { title: "Feature Flags".into(), r#type: Default::default(), description: None, search_aliases: &[], json_path: Some("feature_flags"), in_json: true, files: USER, render: crate::pages::render_feature_flags_page, })); } items.push(SettingsPageItem::SectionHeader("Instrumentation")); items.push(SettingsPageItem::SettingItem(SettingItem { title: "Performance Profiler", description: "Collect timing data for foreground and background executor tasks so they can be inspected via `zed: open performance profiler`. May lead to increased memory usage.", field: Box::new(SettingField { organization_override: None, json_path: Some("instrumentation.performance_profiler.enabled"), pick: |settings_content| { settings_content .instrumentation .as_ref() .and_then(|i| i.performance_profiler.as_ref()) .and_then(|p| p.enabled.as_ref()) }, write: |settings_content, value, _| { settings_content .instrumentation .get_or_insert_default() .performance_profiler .get_or_insert_default() .enabled = value; }, }), metadata: None, files: USER, })); SettingsPage { title: "Developer", items: items.into_boxed_slice(), }} fn general_page(cx: &App) -> SettingsPage { fn general_settings_section(_cx: &App) -> Vec<SettingsPageItem> { vec![ SettingsPageItem::SectionHeader("General Settings"), SettingsPageItem::SettingItem(SettingItem { title: "Accessible Mode", description: "Optimize Zed's interface for assistive technology such as screen readers. When enabled, otherwise-collapsed controls stay expanded and keyboard-reachable.", field: Box::new(SettingField { organization_override: None, json_path: Some("accessible_mode"), pick: |settings_content| settings_content.workspace.accessible_mode.as_ref(), write: |settings_content, value, _| { settings_content.workspace.accessible_mode = value; }, }), 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.", field: Box::new(SettingField { organization_override: None, json_path: Some("when_closing_with_no_tabs"), pick: |settings_content| { settings_content .workspace .when_closing_with_no_tabs .as_ref() }, write: |settings_content, value, _| { settings_content.workspace.when_closing_with_no_tabs = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "On Last Window Closed", description: "What to do when the last window is closed.", field: Box::new(SettingField { organization_override: None, json_path: Some("on_last_window_closed"), pick: |settings_content| { settings_content.workspace.on_last_window_closed.as_ref() }, write: |settings_content, value, _| { settings_content.workspace.on_last_window_closed = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Use System Path Prompts", description: "Use native OS dialogs for 'Open' and 'Save As'.", field: Box::new(SettingField { organization_override: None, json_path: Some("use_system_path_prompts"), pick: |settings_content| { settings_content.workspace.use_system_path_prompts.as_ref() }, write: |settings_content, value, _| { settings_content.workspace.use_system_path_prompts = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Use System Prompts", description: "Use native OS dialogs for confirmations.", field: Box::new(SettingField { organization_override: None, json_path: Some("use_system_prompts"), pick: |settings_content| settings_content.workspace.use_system_prompts.as_ref(), write: |settings_content, value, _| { settings_content.workspace.use_system_prompts = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Redact Private Values", description: "Hide the values of variables in private files.", field: Box::new(SettingField { organization_override: None, json_path: Some("redact_private_values"), pick: |settings_content| settings_content.editor.redact_private_values.as_ref(), write: |settings_content, value, _| { settings_content.editor.redact_private_values = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Private Files", description: "Globs to match against file paths to determine if a file is private.", field: Box::new( SettingField { organization_override: None, json_path: Some("worktree.private_files"), pick: |settings_content| { settings_content.project.worktree.private_files.as_ref() }, write: |settings_content, value, _| { settings_content.project.worktree.private_files = value; }, } .unimplemented(), ), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "CLI Default Open Behavior", description: "How `zed <path>` opens directories when no flag is specified.", field: Box::new(SettingField { organization_override: None, json_path: Some("cli_default_open_behavior"), pick: |settings_content| { settings_content .workspace .cli_default_open_behavior .as_ref() }, write: |settings_content, value, _| { settings_content.workspace.cli_default_open_behavior = value; }, }), metadata: Some(Box::new(SettingsFieldMetadata { should_do_titlecase: Some(false), ..Default::default() })), files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Default Open Behavior", description: "How projects open from the UI by default.", field: Box::new(SettingField { organization_override: None, json_path: Some("default_open_behavior"), pick: |settings_content| { settings_content.workspace.default_open_behavior.as_ref() }, write: |settings_content, value, _| { settings_content.workspace.default_open_behavior = value; }, }), metadata: Some(Box::new(SettingsFieldMetadata { should_do_titlecase: Some(false), ..Default::default() })), files: USER, }), ] } fn security_section() -> [SettingsPageItem; 2] { [ SettingsPageItem::SectionHeader("Security"), SettingsPageItem::SettingItem(SettingItem { title: "Trust All Projects By Default", description: "When opening Zed, avoid Restricted Mode by auto-trusting all projects, enabling use of all features without having to give permission to each new project.", field: Box::new(SettingField { organization_override: None, json_path: Some("session.trust_all_projects"), pick: |settings_content| { settings_content .session .as_ref() .and_then(|session| session.trust_all_worktrees.as_ref()) }, write: |settings_content, value, _| { settings_content .session .get_or_insert_default() .trust_all_worktrees = value; }, }), metadata: None, files: USER, }), ] } fn workspace_restoration_section() -> [SettingsPageItem; 3] { [ SettingsPageItem::SectionHeader("Workspace Restoration"), SettingsPageItem::SettingItem(SettingItem { title: "Restore Unsaved Buffers", description: "Whether or not to restore unsaved buffers on restart.", field: Box::new(SettingField { organization_override: None, json_path: Some("session.restore_unsaved_buffers"), pick: |settings_content| { settings_content .session .as_ref() .and_then(|session| session.restore_unsaved_buffers.as_ref()) }, write: |settings_content, value, _| { settings_content .session .get_or_insert_default() .restore_unsaved_buffers = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Restore On Startup", description: "What to restore from the previous session when opening Zed.", field: Box::new(SettingField { organization_override: None, json_path: Some("restore_on_startup"), pick: |settings_content| settings_content.workspace.restore_on_startup.as_ref(), write: |settings_content, value, _| { settings_content.workspace.restore_on_startup = value; }, }), metadata: None, files: USER, }), ] } fn scoped_settings_section() -> [SettingsPageItem; 3] { [ SettingsPageItem::SectionHeader("Scoped Settings"), SettingsPageItem::SettingItem(SettingItem { files: USER, title: "Preview Channel", description: "Which settings should be activated only in Preview build of Zed.", field: Box::new( SettingField { organization_override: None, json_path: Some("preview_channel_settings"), pick: |settings_content| Some(settings_content), write: |_settings_content, _value, _| {}, } .unimplemented(), ), metadata: None, }), SettingsPageItem::SettingItem(SettingItem { files: USER, title: "Settings Profiles", description: "Any number of settings profiles that are temporarily applied on top of your existing user settings.", field: Box::new( SettingField { organization_override: None, json_path: Some("settings_profiles"), pick: |settings_content| Some(settings_content), write: |_settings_content, _value, _| {}, } .unimplemented(), ), metadata: None, }), ] } fn privacy_section() -> [SettingsPageItem; 4] { [ SettingsPageItem::SectionHeader("Privacy"), SettingsPageItem::SettingItem(SettingItem { title: "Telemetry Diagnostics", description: "Send debug information like crash reports.", field: Box::new(SettingField { organization_override: None, json_path: Some("telemetry.diagnostics"), pick: |settings_content| { settings_content .telemetry .as_ref() .and_then(|telemetry| telemetry.diagnostics.as_ref()) }, write: |settings_content, value, _| { settings_content .telemetry .get_or_insert_default() .diagnostics = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Telemetry Metrics", description: "Send anonymized usage data like what languages you're using Zed with.", field: Box::new(SettingField { organization_override: None, json_path: Some("telemetry.metrics"), pick: |settings_content| { settings_content .telemetry .as_ref() .and_then(|telemetry| telemetry.metrics.as_ref()) }, write: |settings_content, value, _| { settings_content.telemetry.get_or_insert_default().metrics = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Anthropic Data Retention", description: "Allow sending requests to Anthropic models that cannot be offered with Zero Data Retention.", field: Box::new(SettingField { organization_override: None, json_path: Some("telemetry.anthropic_retention"), pick: |settings_content| { settings_content .telemetry .as_ref() .and_then(|telemetry| telemetry.anthropic_retention.as_ref()) }, write: |settings_content, value, _| { settings_content .telemetry .get_or_insert_default() .anthropic_retention = value; }, }), metadata: None, files: USER, }), ] } fn auto_update_section() -> [SettingsPageItem; 2] { [ SettingsPageItem::SectionHeader("Auto Update"), SettingsPageItem::SettingItem(SettingItem { title: "Auto Update", description: "Whether or not to automatically check for updates.", field: Box::new(SettingField { organization_override: None, json_path: Some("auto_update"), pick: |settings_content| settings_content.auto_update.as_ref(), write: |settings_content, value, _| { settings_content.auto_update = value; }, }), metadata: None, files: USER, }), ] } SettingsPage { title: "General", items: concat_sections!( @vec, general_settings_section(cx), security_section(), workspace_restoration_section(), scoped_settings_section(), privacy_section(),Lines 1–500 of 10601. Load more
use gpui::{Action as _, App}; use itertools::Itertools as _; use settings::{ AudioInputDeviceName, AudioOutputDeviceName, EditPredictionDataCollectionChoice, LanguageSettingsContent, SemanticTokens, SettingsContent, }; use std::sync::{Arc, OnceLock}; use strum::{EnumMessage, IntoDiscriminant as _, VariantArray}; use theme::SystemAppearance; use ui::IntoElement; use crate::{ ActionLink, DynamicItem, PROJECT, SettingField, SettingItem, SettingsFieldMetadata, SettingsPage, SettingsPageItem, SubPageLink, USER, active_language, all_language_names, pages::{ open_audio_test_window, render_edit_prediction_setup_page, render_external_agents_page, render_llm_providers_page, render_mcp_servers_page, render_sandbox_settings_page, render_skills_setup_page, render_tool_permissions_setup_page, }, }; const DEFAULT_STRING: String = String::new(); /// A default empty string reference. Useful in `pick` functions for cases either in dynamic item fields, or when dealing with `settings::Maybe` /// to avoid the "NO DEFAULT" case. const DEFAULT_EMPTY_STRING: Option<&String> = Some(&DEFAULT_STRING); const DEFAULT_AUDIO_OUTPUT: AudioOutputDeviceName = AudioOutputDeviceName(None); const DEFAULT_EMPTY_AUDIO_OUTPUT: Option<&AudioOutputDeviceName> = Some(&DEFAULT_AUDIO_OUTPUT); const DEFAULT_AUDIO_INPUT: AudioInputDeviceName = AudioInputDeviceName(None); const DEFAULT_EMPTY_AUDIO_INPUT: Option<&AudioInputDeviceName> = Some(&DEFAULT_AUDIO_INPUT); macro_rules! concat_sections { (@vec, $($arr:expr),+ $(,)?) => {{ let total_len = 0_usize $(+ $arr.len())+; let mut out = Vec::with_capacity(total_len); $( out.extend($arr); )+ out }}; ($($arr:expr),+ $(,)?) => {{ let total_len = 0_usize $(+ $arr.len())+; let mut out: Box<[std::mem::MaybeUninit<_>]> = Box::new_uninit_slice(total_len); let mut index = 0usize; $( let array = $arr; for item in array { out[index].write(item); index += 1; } )+ debug_assert_eq!(index, total_len); // SAFETY: we wrote exactly `total_len` elements. unsafe { out.assume_init() } }}; } pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> { vec![ general_page(cx), appearance_page(), keymap_page(), editor_page(), languages_and_tools_page(cx), search_and_files_page(), window_and_layout_page(), panels_page(), debugger_page(), terminal_page(), version_control_page(), collaboration_page(), ai_page(cx), network_page(), developer_page(cx), ] } fn developer_page(cx: &App) -> SettingsPage { use feature_flags::FeatureFlagAppExt as _; let mut items: Vec<SettingsPageItem> = Vec::new(); // Feature flag overrides are a staff-only affordance, so only surface the section when the overrides are enabled. if cx.feature_flag_overrides_enabled() { items.push(SettingsPageItem::SectionHeader("Feature Flags")); items.push(SettingsPageItem::SubPageLink(SubPageLink { title: "Feature Flags".into(), r#type: Default::default(), description: None, search_aliases: &[], json_path: Some("feature_flags"), in_json: true, files: USER, render: crate::pages::render_feature_flags_page, })); } items.push(SettingsPageItem::SectionHeader("Instrumentation")); items.push(SettingsPageItem::SettingItem(SettingItem { title: "Performance Profiler", description: "Collect timing data for foreground and background executor tasks so they can be inspected via `zed: open performance profiler`. May lead to increased memory usage.", field: Box::new(SettingField { organization_override: None, json_path: Some("instrumentation.performance_profiler.enabled"), pick: |settings_content| { settings_content .instrumentation .as_ref() .and_then(|i| i.performance_profiler.as_ref()) .and_then(|p| p.enabled.as_ref()) }, write: |settings_content, value, _| { settings_content .instrumentation .get_or_insert_default() .performance_profiler .get_or_insert_default() .enabled = value; }, }), metadata: None, files: USER, })); SettingsPage { title: "Developer", items: items.into_boxed_slice(), } } fn general_page(cx: &App) -> SettingsPage { fn general_settings_section(_cx: &App) -> Vec<SettingsPageItem> { vec![ SettingsPageItem::SectionHeader("General Settings"), SettingsPageItem::SettingItem(SettingItem { title: "Accessible Mode", description: "Optimize Zed's interface for assistive technology such as screen readers. When enabled, otherwise-collapsed controls stay expanded and keyboard-reachable.", field: Box::new(SettingField { organization_override: None, json_path: Some("accessible_mode"), pick: |settings_content| settings_content.workspace.accessible_mode.as_ref(), write: |settings_content, value, _| { settings_content.workspace.accessible_mode = value; }, }), 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.", field: Box::new(SettingField { organization_override: None, json_path: Some("when_closing_with_no_tabs"), pick: |settings_content| { settings_content .workspace .when_closing_with_no_tabs .as_ref() }, write: |settings_content, value, _| { settings_content.workspace.when_closing_with_no_tabs = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "On Last Window Closed", description: "What to do when the last window is closed.", field: Box::new(SettingField { organization_override: None, json_path: Some("on_last_window_closed"), pick: |settings_content| { settings_content.workspace.on_last_window_closed.as_ref() }, write: |settings_content, value, _| { settings_content.workspace.on_last_window_closed = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Use System Path Prompts", description: "Use native OS dialogs for 'Open' and 'Save As'.", field: Box::new(SettingField { organization_override: None, json_path: Some("use_system_path_prompts"), pick: |settings_content| { settings_content.workspace.use_system_path_prompts.as_ref() }, write: |settings_content, value, _| { settings_content.workspace.use_system_path_prompts = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Use System Prompts", description: "Use native OS dialogs for confirmations.", field: Box::new(SettingField { organization_override: None, json_path: Some("use_system_prompts"), pick: |settings_content| settings_content.workspace.use_system_prompts.as_ref(), write: |settings_content, value, _| { settings_content.workspace.use_system_prompts = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Redact Private Values", description: "Hide the values of variables in private files.", field: Box::new(SettingField { organization_override: None, json_path: Some("redact_private_values"), pick: |settings_content| settings_content.editor.redact_private_values.as_ref(), write: |settings_content, value, _| { settings_content.editor.redact_private_values = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Private Files", description: "Globs to match against file paths to determine if a file is private.", field: Box::new( SettingField { organization_override: None, json_path: Some("worktree.private_files"), pick: |settings_content| { settings_content.project.worktree.private_files.as_ref() }, write: |settings_content, value, _| { settings_content.project.worktree.private_files = value; }, } .unimplemented(), ), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "CLI Default Open Behavior", description: "How `zed <path>` opens directories when no flag is specified.", field: Box::new(SettingField { organization_override: None, json_path: Some("cli_default_open_behavior"), pick: |settings_content| { settings_content .workspace .cli_default_open_behavior .as_ref() }, write: |settings_content, value, _| { settings_content.workspace.cli_default_open_behavior = value; }, }), metadata: Some(Box::new(SettingsFieldMetadata { should_do_titlecase: Some(false), ..Default::default() })), files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Default Open Behavior", description: "How projects open from the UI by default.", field: Box::new(SettingField { organization_override: None, json_path: Some("default_open_behavior"), pick: |settings_content| { settings_content.workspace.default_open_behavior.as_ref() }, write: |settings_content, value, _| { settings_content.workspace.default_open_behavior = value; }, }), metadata: Some(Box::new(SettingsFieldMetadata { should_do_titlecase: Some(false), ..Default::default() })), files: USER, }), ] } fn security_section() -> [SettingsPageItem; 2] { [ SettingsPageItem::SectionHeader("Security"), SettingsPageItem::SettingItem(SettingItem { title: "Trust All Projects By Default", description: "When opening Zed, avoid Restricted Mode by auto-trusting all projects, enabling use of all features without having to give permission to each new project.", field: Box::new(SettingField { organization_override: None, json_path: Some("session.trust_all_projects"), pick: |settings_content| { settings_content .session .as_ref() .and_then(|session| session.trust_all_worktrees.as_ref()) }, write: |settings_content, value, _| { settings_content .session .get_or_insert_default() .trust_all_worktrees = value; }, }), metadata: None, files: USER, }), ] } fn workspace_restoration_section() -> [SettingsPageItem; 3] { [ SettingsPageItem::SectionHeader("Workspace Restoration"), SettingsPageItem::SettingItem(SettingItem { title: "Restore Unsaved Buffers", description: "Whether or not to restore unsaved buffers on restart.", field: Box::new(SettingField { organization_override: None, json_path: Some("session.restore_unsaved_buffers"), pick: |settings_content| { settings_content .session .as_ref() .and_then(|session| session.restore_unsaved_buffers.as_ref()) }, write: |settings_content, value, _| { settings_content .session .get_or_insert_default() .restore_unsaved_buffers = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Restore On Startup", description: "What to restore from the previous session when opening Zed.", field: Box::new(SettingField { organization_override: None, json_path: Some("restore_on_startup"), pick: |settings_content| settings_content.workspace.restore_on_startup.as_ref(), write: |settings_content, value, _| { settings_content.workspace.restore_on_startup = value; }, }), metadata: None, files: USER, }), ] } fn scoped_settings_section() -> [SettingsPageItem; 3] { [ SettingsPageItem::SectionHeader("Scoped Settings"), SettingsPageItem::SettingItem(SettingItem { files: USER, title: "Preview Channel", description: "Which settings should be activated only in Preview build of Zed.", field: Box::new( SettingField { organization_override: None, json_path: Some("preview_channel_settings"), pick: |settings_content| Some(settings_content), write: |_settings_content, _value, _| {}, } .unimplemented(), ), metadata: None, }), SettingsPageItem::SettingItem(SettingItem { files: USER, title: "Settings Profiles", description: "Any number of settings profiles that are temporarily applied on top of your existing user settings.", field: Box::new( SettingField { organization_override: None, json_path: Some("settings_profiles"), pick: |settings_content| Some(settings_content), write: |_settings_content, _value, _| {}, } .unimplemented(), ), metadata: None, }), ] } fn privacy_section() -> [SettingsPageItem; 4] { [ SettingsPageItem::SectionHeader("Privacy"), SettingsPageItem::SettingItem(SettingItem { title: "Telemetry Diagnostics", description: "Send debug information like crash reports.", field: Box::new(SettingField { organization_override: None, json_path: Some("telemetry.diagnostics"), pick: |settings_content| { settings_content .telemetry .as_ref() .and_then(|telemetry| telemetry.diagnostics.as_ref()) }, write: |settings_content, value, _| { settings_content .telemetry .get_or_insert_default() .diagnostics = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Telemetry Metrics", description: "Send anonymized usage data like what languages you're using Zed with.", field: Box::new(SettingField { organization_override: None, json_path: Some("telemetry.metrics"), pick: |settings_content| { settings_content .telemetry .as_ref() .and_then(|telemetry| telemetry.metrics.as_ref()) }, write: |settings_content, value, _| { settings_content.telemetry.get_or_insert_default().metrics = value; }, }), metadata: None, files: USER, }), SettingsPageItem::SettingItem(SettingItem { title: "Anthropic Data Retention", description: "Allow sending requests to Anthropic models that cannot be offered with Zero Data Retention.", field: Box::new(SettingField { organization_override: None, json_path: Some("telemetry.anthropic_retention"), pick: |settings_content| { settings_content .telemetry .as_ref() .and_then(|telemetry| telemetry.anthropic_retention.as_ref()) }, write: |settings_content, value, _| { settings_content .telemetry .get_or_insert_default() .anthropic_retention = value; }, }), metadata: None, files: USER, }), ] } fn auto_update_section() -> [SettingsPageItem; 2] { [ SettingsPageItem::SectionHeader("Auto Update"), SettingsPageItem::SettingItem(SettingItem { title: "Auto Update", description: "Whether or not to automatically check for updates.", field: Box::new(SettingField { organization_override: None, json_path: Some("auto_update"), pick: |settings_content| settings_content.auto_update.as_ref(), write: |settings_content, value, _| { settings_content.auto_update = value; }, }), metadata: None, files: USER, }), ] } SettingsPage { title: "General", items: concat_sections!( @vec, general_settings_section(cx), security_section(), workspace_restoration_section(), scoped_settings_section(), privacy_section(),