1mod base_keymap_setting;
2mod content_into_gpui;
3mod editable_setting_control;
4mod keymap_file;
5mod settings_file;
6mod settings_store;
7mod vscode_import;
8
9pub use settings_macros::RegisterSetting;
10
11pub mod settings_content {
12 pub use ::settings_content::*;
13}
14
15pub mod fallible_options {
16 pub use ::settings_content::{FallibleOption, parse_json};
17}
18
19#[doc(hidden)]
20pub mod private {
21 pub use crate::settings_store::{RegisteredSetting, SettingValue};
22 pub use inventory;
23}
24
25use gpui::{App, Global};
26use release_channel::ReleaseChannel;
27use rust_embed::RustEmbed;
28use std::env;
29use std::{borrow::Cow, fmt, str};
30use util::asset_str;
31
32pub use ::settings_content::*;
33pub use base_keymap_setting::*;
34pub use content_into_gpui::IntoGpui;
35pub use editable_setting_control::*;
36pub use keymap_file::{
37 KeyBindingValidator, KeyBindingValidatorRegistration, KeybindSource, KeybindUpdateOperation,
38 KeybindUpdateTarget, KeymapFile, KeymapFileLoadResult,
39};
40pub use settings_file::*;
41pub use settings_json::*;
42pub use settings_store::{
43 InvalidSettingsError, LSP_SETTINGS_SCHEMA_URL_PREFIX, LocalSettingsKind, MigrationStatus,
44 Settings, SettingsFile, SettingsJsonSchemaParams, SettingsKey, SettingsLocation,
45 SettingsParseResult, SettingsStore,
46};
47
48pub use vscode_import::{VsCodeSettings, VsCodeSettingsSource};
49
50pub use keymap_file::ActionSequence;
51
52#[derive(Clone, Debug, PartialEq)]
53pub struct ActiveSettingsProfileName(pub String);
54
55impl Global for ActiveSettingsProfileName {}
56
57pub trait UserSettingsContentExt {
58 fn for_profile(&self, cx: &App) -> Option<&SettingsContent>;
59 fn for_release_channel(&self) -> Option<&SettingsContent>;
60 fn for_os(&self) -> Option<&SettingsContent>;
61}
62
63impl UserSettingsContentExt for UserSettingsContent {
64 fn for_profile(&self, cx: &App) -> Option<&SettingsContent> {
65 let Some(active_profile) = cx.try_global::<ActiveSettingsProfileName>() else {
66 return None;
67 };
68 self.profiles.get(&active_profile.0)
69 }
70
71 fn for_release_channel(&self) -> Option<&SettingsContent> {
72 match *release_channel::RELEASE_CHANNEL {
73 ReleaseChannel::Dev => self.dev.as_deref(),
74 ReleaseChannel::Nightly => self.nightly.as_deref(),
75 ReleaseChannel::Preview => self.preview.as_deref(),
76 ReleaseChannel::Stable => self.stable.as_deref(),
77 }
78 }
79
80 fn for_os(&self) -> Option<&SettingsContent> {
81 match env::consts::OS {
82 "macos" => self.macos.as_deref(),
83 "linux" => self.linux.as_deref(),
84 "windows" => self.windows.as_deref(),
85 _ => None,
86 }
87 }
88}
89
90#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord, serde::Serialize)]
91pub struct WorktreeId(usize);
92
93impl From<WorktreeId> for usize {
94 fn from(value: WorktreeId) -> Self {
95 value.0
96 }
97}
98
99impl WorktreeId {
100 pub fn from_usize(handle_id: usize) -> Self {
101 Self(handle_id)
102 }
103
104 pub fn from_proto(id: u64) -> Self {
105 Self(id as usize)
106 }
107
108 pub fn to_proto(self) -> u64 {
109 self.0 as u64
110 }
111
112 pub fn to_usize(self) -> usize {
113 self.0
114 }
115}
116
117impl fmt::Display for WorktreeId {
118 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
119 std::fmt::Display::fmt(&self.0, f)
120 }
121}
122
123#[derive(RustEmbed)]
124#[folder = "../../assets"]
125#[include = "settings/*"]
126#[include = "keymaps/*"]
127#[exclude = "*.DS_Store"]
128pub struct SettingsAssets;
129
130pub fn init(cx: &mut App) {
131 let settings = SettingsStore::new(cx, &default_settings());
132 cx.set_global(settings);
133 SettingsStore::observe_active_settings_profile_name(cx).detach();
134}
135
136pub fn default_settings() -> Cow<'static, str> {
137 asset_str::<SettingsAssets>("settings/default.json")
138}
139
140#[cfg(target_os = "macos")]
141pub const DEFAULT_KEYMAP_PATH: &str = "keymaps/default-macos.json";
142
143#[cfg(target_os = "windows")]
144pub const DEFAULT_KEYMAP_PATH: &str = "keymaps/default-windows.json";
145
146#[cfg(not(any(target_os = "macos", target_os = "windows")))]
147pub const DEFAULT_KEYMAP_PATH: &str = "keymaps/default-linux.json";
148
149pub fn default_keymap() -> Cow<'static, str> {
150 asset_str::<SettingsAssets>(DEFAULT_KEYMAP_PATH)
151}
152
153pub const VIM_KEYMAP_PATH: &str = "keymaps/vim.json";
154
155pub fn vim_keymap() -> Cow<'static, str> {
156 asset_str::<SettingsAssets>(VIM_KEYMAP_PATH)
157}
158
159pub fn initial_user_settings_content() -> Cow<'static, str> {
160 asset_str::<SettingsAssets>("settings/initial_user_settings.json")
161}
162
163pub fn initial_server_settings_content() -> Cow<'static, str> {
164 asset_str::<SettingsAssets>("settings/initial_server_settings.json")
165}
166
167pub fn initial_project_settings_content() -> Cow<'static, str> {
168 asset_str::<SettingsAssets>("settings/initial_local_settings.json")
169}
170
171pub fn initial_keymap_content() -> Cow<'static, str> {
172 asset_str::<SettingsAssets>("keymaps/initial.json")
173}
174
175pub fn initial_tasks_content() -> Cow<'static, str> {
176 asset_str::<SettingsAssets>("settings/initial_tasks.json")
177}
178
179pub fn initial_debug_tasks_content() -> Cow<'static, str> {
180 asset_str::<SettingsAssets>("settings/initial_debug_tasks.json")
181}
182
183pub fn initial_local_debug_tasks_content() -> Cow<'static, str> {
184 asset_str::<SettingsAssets>("settings/initial_local_debug_tasks.json")
185}