Settings refactor (#38367)

Co-Authored-By: Ben K <ben@zed.dev>
Co-Authored-By: Anthony <anthony@zed.dev>
Co-Authored-By: Mikayla <mikayla@zed.dev>

Release Notes:

- settings: Major internal changes to settings. The primary user-facing
effect is that some settings which did not make sense in project
settings files are no-longer read from there. (For example the inline
blame settings)

---------

Co-authored-by: Ben Kunkle <ben@zed.dev>
Co-authored-by: Mikayla Maki <mikayla.c.maki@gmail.com>
Co-authored-by: Anthony <anthony@zed.dev>
This commit is contained in:
Conrad Irwin
2025-09-18 16:47:23 +00:00
committed by GitHub
co-authored by Ben Kunkle Mikayla Maki Anthony
parent 0a9023bce0
commit fcdab160f9
219 changed files with 11697 additions and 11894 deletions
-1
View File
@@ -614,7 +614,6 @@ pub fn main() {
markdown_preview::init(cx);
svg_preview::init(cx);
onboarding::init(cx);
settings_ui::init(cx);
keymap_editor::init(cx);
extensions_ui::init(cx);
zeta::init(cx);
+23 -45
View File
@@ -727,9 +727,10 @@ fn register_actions(
let fs = app_state.fs.clone();
move |_, action: &zed_actions::IncreaseUiFontSize, _window, cx| {
if action.persist {
update_settings_file::<ThemeSettings>(fs.clone(), cx, move |settings, cx| {
update_settings_file(fs.clone(), cx, move |settings, cx| {
let ui_font_size = ThemeSettings::get_global(cx).ui_font_size(cx) + px(1.0);
let _ = settings
.theme
.ui_font_size
.insert(theme::clamp_font_size(ui_font_size).0);
});
@@ -742,9 +743,10 @@ fn register_actions(
let fs = app_state.fs.clone();
move |_, action: &zed_actions::DecreaseUiFontSize, _window, cx| {
if action.persist {
update_settings_file::<ThemeSettings>(fs.clone(), cx, move |settings, cx| {
update_settings_file(fs.clone(), cx, move |settings, cx| {
let ui_font_size = ThemeSettings::get_global(cx).ui_font_size(cx) - px(1.0);
let _ = settings
.theme
.ui_font_size
.insert(theme::clamp_font_size(ui_font_size).0);
});
@@ -757,8 +759,8 @@ fn register_actions(
let fs = app_state.fs.clone();
move |_, action: &zed_actions::ResetUiFontSize, _window, cx| {
if action.persist {
update_settings_file::<ThemeSettings>(fs.clone(), cx, move |settings, _| {
settings.ui_font_size = None;
update_settings_file(fs.clone(), cx, move |settings, _| {
settings.theme.ui_font_size = None;
});
} else {
theme::reset_ui_font_size(cx);
@@ -769,10 +771,11 @@ fn register_actions(
let fs = app_state.fs.clone();
move |_, action: &zed_actions::IncreaseBufferFontSize, _window, cx| {
if action.persist {
update_settings_file::<ThemeSettings>(fs.clone(), cx, move |settings, cx| {
update_settings_file(fs.clone(), cx, move |settings, cx| {
let buffer_font_size =
ThemeSettings::get_global(cx).buffer_font_size(cx) + px(1.0);
let _ = settings
.theme
.buffer_font_size
.insert(theme::clamp_font_size(buffer_font_size).0);
});
@@ -785,10 +788,11 @@ fn register_actions(
let fs = app_state.fs.clone();
move |_, action: &zed_actions::DecreaseBufferFontSize, _window, cx| {
if action.persist {
update_settings_file::<ThemeSettings>(fs.clone(), cx, move |settings, cx| {
update_settings_file(fs.clone(), cx, move |settings, cx| {
let buffer_font_size =
ThemeSettings::get_global(cx).buffer_font_size(cx) - px(1.0);
let _ = settings
.theme
.buffer_font_size
.insert(theme::clamp_font_size(buffer_font_size).0);
});
@@ -801,8 +805,8 @@ fn register_actions(
let fs = app_state.fs.clone();
move |_, action: &zed_actions::ResetBufferFontSize, _window, cx| {
if action.persist {
update_settings_file::<ThemeSettings>(fs.clone(), cx, move |settings, _| {
settings.buffer_font_size = None;
update_settings_file(fs.clone(), cx, move |settings, _| {
settings.theme.buffer_font_size = None;
});
} else {
theme::reset_buffer_font_size(cx);
@@ -1944,7 +1948,7 @@ mod tests {
};
use language::{LanguageMatcher, LanguageRegistry};
use pretty_assertions::{assert_eq, assert_ne};
use project::{Project, ProjectPath, WorktreeSettings, project_settings::ProjectSettings};
use project::{Project, ProjectPath};
use serde_json::json;
use settings::{SettingsStore, watch_config_file};
use std::{
@@ -2249,8 +2253,11 @@ mod tests {
cx.update(|cx| {
SettingsStore::update_global(cx, |store, cx| {
store.update_user_settings::<ProjectSettings>(cx, |settings| {
settings.session.restore_unsaved_buffers = false
store.update_user_settings(cx, |settings| {
settings
.session
.get_or_insert_default()
.restore_unsaved_buffers = Some(false)
});
});
});
@@ -2965,8 +2972,8 @@ mod tests {
let app_state = init_test(cx);
cx.update(|cx| {
cx.update_global::<SettingsStore, _>(|store, cx| {
store.update_user_settings::<WorktreeSettings>(cx, |project_settings| {
project_settings.file_scan_exclusions =
store.update_user_settings(cx, |project_settings| {
project_settings.project.worktree.file_scan_exclusions =
Some(vec!["excluded_dir".to_string(), "**/.git".to_string()]);
});
});
@@ -4795,8 +4802,9 @@ mod tests {
// 3. Add .zed to file scan exclusions in user settings
cx.update_global::<SettingsStore, _>(|store, cx| {
store.update_user_settings::<WorktreeSettings>(cx, |worktree_settings| {
worktree_settings.file_scan_exclusions = Some(vec![".zed".to_string()]);
store.update_user_settings(cx, |worktree_settings| {
worktree_settings.project.worktree.file_scan_exclusions =
Some(vec![".zed".to_string()]);
});
});
@@ -4856,34 +4864,4 @@ mod tests {
"BUG FOUND: Project settings were overwritten when opening via command - original custom content was lost"
);
}
#[gpui::test]
fn test_settings_defaults(cx: &mut TestAppContext) {
cx.update(|cx| {
settings::init(cx);
workspace::init_settings(cx);
title_bar::init(cx);
editor::init_settings(cx);
debugger_ui::init(cx);
});
let default_json =
cx.read(|cx| cx.global::<SettingsStore>().raw_default_settings().clone());
let all_paths = cx.read(|cx| settings_ui::SettingsUiTree::new(cx).all_paths(cx));
let mut failures = Vec::new();
for path in all_paths {
if settings_ui::read_settings_value_from_path(&default_json, &path).is_none() {
failures.push(path);
}
}
if !failures.is_empty() {
panic!(
"No default value found for paths: {:#?}",
failures
.into_iter()
.map(|path| path.join("."))
.collect::<Vec<_>>()
);
}
}
}