settings.rs

  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}