
When launching Zed from the CLI via `cargo run`, we'll always prompt load templates from the repo. This restores behavior that I reverted last night in #16403. Also, I've improved the `script/prompts link/unlink` workflow for overriding prompts of your production copy of Zed. Zed now detects when the overrides directory is created or removed, and does the right thing. You can link and unlink repeatedly without restarting Zed. Release Notes: - N/A
284 lines
9.6 KiB
Rust
284 lines
9.6 KiB
Rust
//! Paths to locations used by Zed.
|
|
|
|
use std::path::{Path, PathBuf};
|
|
use std::sync::OnceLock;
|
|
|
|
pub use util::paths::home_dir;
|
|
|
|
/// Returns the path to the configuration directory used by Zed.
|
|
pub fn config_dir() -> &'static PathBuf {
|
|
static CONFIG_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
CONFIG_DIR.get_or_init(|| {
|
|
if cfg!(target_os = "windows") {
|
|
return dirs::config_dir()
|
|
.expect("failed to determine RoamingAppData directory")
|
|
.join("Zed");
|
|
}
|
|
|
|
if cfg!(target_os = "linux") {
|
|
return if let Ok(flatpak_xdg_config) = std::env::var("FLATPAK_XDG_CONFIG_HOME") {
|
|
flatpak_xdg_config.into()
|
|
} else {
|
|
dirs::config_dir().expect("failed to determine XDG_CONFIG_HOME directory")
|
|
}
|
|
.join("zed");
|
|
}
|
|
|
|
home_dir().join(".config").join("zed")
|
|
})
|
|
}
|
|
|
|
/// Returns the path to the support directory used by Zed.
|
|
pub fn support_dir() -> &'static PathBuf {
|
|
static SUPPORT_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
SUPPORT_DIR.get_or_init(|| {
|
|
if cfg!(target_os = "macos") {
|
|
return home_dir().join("Library/Application Support/Zed");
|
|
}
|
|
|
|
if cfg!(target_os = "linux") {
|
|
return if let Ok(flatpak_xdg_data) = std::env::var("FLATPAK_XDG_DATA_HOME") {
|
|
flatpak_xdg_data.into()
|
|
} else {
|
|
dirs::data_local_dir().expect("failed to determine XDG_DATA_HOME directory")
|
|
}
|
|
.join("zed");
|
|
}
|
|
|
|
if cfg!(target_os = "windows") {
|
|
return dirs::data_local_dir()
|
|
.expect("failed to determine LocalAppData directory")
|
|
.join("Zed");
|
|
}
|
|
|
|
config_dir().clone()
|
|
})
|
|
}
|
|
|
|
/// Returns the path to the temp directory used by Zed.
|
|
pub fn temp_dir() -> &'static PathBuf {
|
|
static TEMP_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
TEMP_DIR.get_or_init(|| {
|
|
if cfg!(target_os = "windows") {
|
|
return dirs::cache_dir()
|
|
.expect("failed to determine LocalAppData directory")
|
|
.join("Zed");
|
|
}
|
|
|
|
if cfg!(target_os = "linux") {
|
|
return if let Ok(flatpak_xdg_cache) = std::env::var("FLATPAK_XDG_CACHE_HOME") {
|
|
flatpak_xdg_cache.into()
|
|
} else {
|
|
dirs::cache_dir().expect("failed to determine XDG_CACHE_HOME directory")
|
|
}
|
|
.join("zed");
|
|
}
|
|
|
|
home_dir().join(".cache").join("zed")
|
|
})
|
|
}
|
|
|
|
/// Returns the path to the logs directory.
|
|
pub fn logs_dir() -> &'static PathBuf {
|
|
static LOGS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
LOGS_DIR.get_or_init(|| {
|
|
if cfg!(target_os = "macos") {
|
|
home_dir().join("Library/Logs/Zed")
|
|
} else {
|
|
support_dir().join("logs")
|
|
}
|
|
})
|
|
}
|
|
|
|
/// Returns the path to the `Zed.log` file.
|
|
pub fn log_file() -> &'static PathBuf {
|
|
static LOG_FILE: OnceLock<PathBuf> = OnceLock::new();
|
|
LOG_FILE.get_or_init(|| logs_dir().join("Zed.log"))
|
|
}
|
|
|
|
/// Returns the path to the `Zed.log.old` file.
|
|
pub fn old_log_file() -> &'static PathBuf {
|
|
static OLD_LOG_FILE: OnceLock<PathBuf> = OnceLock::new();
|
|
OLD_LOG_FILE.get_or_init(|| logs_dir().join("Zed.log.old"))
|
|
}
|
|
|
|
/// Returns the path to the database directory.
|
|
pub fn database_dir() -> &'static PathBuf {
|
|
static DATABASE_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
DATABASE_DIR.get_or_init(|| support_dir().join("db"))
|
|
}
|
|
|
|
/// Returns the path to the crashes directory, if it exists for the current platform.
|
|
pub fn crashes_dir() -> &'static Option<PathBuf> {
|
|
static CRASHES_DIR: OnceLock<Option<PathBuf>> = OnceLock::new();
|
|
CRASHES_DIR.get_or_init(|| {
|
|
cfg!(target_os = "macos").then_some(home_dir().join("Library/Logs/DiagnosticReports"))
|
|
})
|
|
}
|
|
|
|
/// Returns the path to the retired crashes directory, if it exists for the current platform.
|
|
pub fn crashes_retired_dir() -> &'static Option<PathBuf> {
|
|
static CRASHES_RETIRED_DIR: OnceLock<Option<PathBuf>> = OnceLock::new();
|
|
CRASHES_RETIRED_DIR.get_or_init(|| crashes_dir().as_ref().map(|dir| dir.join("Retired")))
|
|
}
|
|
|
|
/// Returns the path to the `settings.json` file.
|
|
pub fn settings_file() -> &'static PathBuf {
|
|
static SETTINGS_FILE: OnceLock<PathBuf> = OnceLock::new();
|
|
SETTINGS_FILE.get_or_init(|| config_dir().join("settings.json"))
|
|
}
|
|
|
|
/// Returns the path to the `keymap.json` file.
|
|
pub fn keymap_file() -> &'static PathBuf {
|
|
static KEYMAP_FILE: OnceLock<PathBuf> = OnceLock::new();
|
|
KEYMAP_FILE.get_or_init(|| config_dir().join("keymap.json"))
|
|
}
|
|
|
|
/// Returns the path to the `tasks.json` file.
|
|
pub fn tasks_file() -> &'static PathBuf {
|
|
static TASKS_FILE: OnceLock<PathBuf> = OnceLock::new();
|
|
TASKS_FILE.get_or_init(|| config_dir().join("tasks.json"))
|
|
}
|
|
|
|
/// Returns the path to the extensions directory.
|
|
///
|
|
/// This is where installed extensions are stored.
|
|
pub fn extensions_dir() -> &'static PathBuf {
|
|
static EXTENSIONS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
EXTENSIONS_DIR.get_or_init(|| support_dir().join("extensions"))
|
|
}
|
|
|
|
/// Returns the path to the themes directory.
|
|
///
|
|
/// This is where themes that are not provided by extensions are stored.
|
|
pub fn themes_dir() -> &'static PathBuf {
|
|
static THEMES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
THEMES_DIR.get_or_init(|| config_dir().join("themes"))
|
|
}
|
|
|
|
/// Returns the path to the contexts directory.
|
|
///
|
|
/// This is where the saved contexts from the Assistant are stored.
|
|
pub fn contexts_dir() -> &'static PathBuf {
|
|
static CONTEXTS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
CONTEXTS_DIR.get_or_init(|| {
|
|
if cfg!(target_os = "macos") {
|
|
config_dir().join("conversations")
|
|
} else {
|
|
support_dir().join("conversations")
|
|
}
|
|
})
|
|
}
|
|
|
|
/// Returns the path within the contexts directory where images from contexts are stored.
|
|
pub fn context_images_dir() -> &'static PathBuf {
|
|
static CONTEXT_IMAGES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
CONTEXT_IMAGES_DIR.get_or_init(|| contexts_dir().join("images"))
|
|
}
|
|
|
|
/// Returns the path to the contexts directory.
|
|
///
|
|
/// This is where the prompts for use with the Assistant are stored.
|
|
pub fn prompts_dir() -> &'static PathBuf {
|
|
static PROMPTS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
PROMPTS_DIR.get_or_init(|| {
|
|
if cfg!(target_os = "macos") {
|
|
config_dir().join("prompts")
|
|
} else {
|
|
support_dir().join("prompts")
|
|
}
|
|
})
|
|
}
|
|
|
|
/// Returns the path to the prompt templates directory.
|
|
///
|
|
/// This is where the prompt templates for core features can be overridden with templates.
|
|
///
|
|
/// # Arguments
|
|
///
|
|
/// * `dev_mode` - If true, assumes the current working directory is the Zed repository.
|
|
pub fn prompt_overrides_dir(repo_path: Option<&Path>) -> PathBuf {
|
|
if let Some(path) = repo_path {
|
|
let dev_path = path.join("assets").join("prompts");
|
|
if dev_path.exists() {
|
|
return dev_path;
|
|
}
|
|
}
|
|
|
|
static PROMPT_TEMPLATES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
PROMPT_TEMPLATES_DIR
|
|
.get_or_init(|| {
|
|
if cfg!(target_os = "macos") {
|
|
config_dir().join("prompt_overrides")
|
|
} else {
|
|
support_dir().join("prompt_overrides")
|
|
}
|
|
})
|
|
.clone()
|
|
}
|
|
|
|
/// Returns the path to the semantic search's embeddings directory.
|
|
///
|
|
/// This is where the embeddings used to power semantic search are stored.
|
|
pub fn embeddings_dir() -> &'static PathBuf {
|
|
static EMBEDDINGS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
EMBEDDINGS_DIR.get_or_init(|| {
|
|
if cfg!(target_os = "macos") {
|
|
config_dir().join("embeddings")
|
|
} else {
|
|
support_dir().join("embeddings")
|
|
}
|
|
})
|
|
}
|
|
|
|
/// Returns the path to the languages directory.
|
|
///
|
|
/// This is where language servers are downloaded to for languages built-in to Zed.
|
|
pub fn languages_dir() -> &'static PathBuf {
|
|
static LANGUAGES_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
LANGUAGES_DIR.get_or_init(|| support_dir().join("languages"))
|
|
}
|
|
|
|
/// Returns the path to the Copilot directory.
|
|
pub fn copilot_dir() -> &'static PathBuf {
|
|
static COPILOT_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
COPILOT_DIR.get_or_init(|| support_dir().join("copilot"))
|
|
}
|
|
|
|
/// Returns the path to the Supermaven directory.
|
|
pub fn supermaven_dir() -> &'static PathBuf {
|
|
static SUPERMAVEN_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
SUPERMAVEN_DIR.get_or_init(|| support_dir().join("supermaven"))
|
|
}
|
|
|
|
/// Returns the path to the default Prettier directory.
|
|
pub fn default_prettier_dir() -> &'static PathBuf {
|
|
static DEFAULT_PRETTIER_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
DEFAULT_PRETTIER_DIR.get_or_init(|| support_dir().join("prettier"))
|
|
}
|
|
|
|
/// Returns the path to the remote server binaries directory.
|
|
pub fn remote_servers_dir() -> &'static PathBuf {
|
|
static REMOTE_SERVERS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
|
REMOTE_SERVERS_DIR.get_or_init(|| support_dir().join("remote_servers"))
|
|
}
|
|
|
|
/// Returns the relative path to a `.zed` folder within a project.
|
|
pub fn local_settings_folder_relative_path() -> &'static Path {
|
|
Path::new(".zed")
|
|
}
|
|
|
|
/// Returns the relative path to a `settings.json` file within a project.
|
|
pub fn local_settings_file_relative_path() -> &'static Path {
|
|
Path::new(".zed/settings.json")
|
|
}
|
|
|
|
/// Returns the relative path to a `tasks.json` file within a project.
|
|
pub fn local_tasks_file_relative_path() -> &'static Path {
|
|
Path::new(".zed/tasks.json")
|
|
}
|
|
|
|
/// Returns the relative path to a `.vscode/tasks.json` file within a project.
|
|
pub fn local_vscode_tasks_file_relative_path() -> &'static Path {
|
|
Path::new(".vscode/tasks.json")
|
|
}
|