From 018ba56f620d0fefdd6fb5157c069dd47c10a8c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Thu, 31 Aug 2023 18:52:13 +0800 Subject: [PATCH] feat: new `YAZI_CONFIG_HOME` env variable (#97) --- app/src/app.rs | 2 +- config/src/boot/boot.rs | 7 ++----- config/src/preview/preview.rs | 3 ++- config/src/theme/theme.rs | 3 +-- config/src/xdg.rs | 10 ++++++++-- shared/src/fns.rs | 4 ++-- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/app/src/app.rs b/app/src/app.rs index c61bf189..baf8c08b 100644 --- a/app/src/app.rs +++ b/app/src/app.rs @@ -121,7 +121,7 @@ impl App { match event { Event::Cd(path) => { futures::executor::block_on(async { - manager.active_mut().cd(absolute_path(path).await).await; + manager.active_mut().cd(absolute_path(path)).await; }); } Event::Refresh => { diff --git a/config/src/boot/boot.rs b/config/src/boot/boot.rs index 357956a0..574d56ce 100644 --- a/config/src/boot/boot.rs +++ b/config/src/boot/boot.rs @@ -38,11 +38,8 @@ impl Default for Boot { fn default() -> Self { let args = Args::parse(); - let cwd = args - .cwd - .map(|p| futures::executor::block_on(absolute_path(p))) - .filter(|p| p.is_dir()) - .or_else(|| env::current_dir().ok()); + let cwd = + args.cwd.map(absolute_path).filter(|p| p.is_dir()).or_else(|| env::current_dir().ok()); let boot = Self { cwd: cwd.unwrap_or("/".into()), diff --git a/config/src/preview/preview.rs b/config/src/preview/preview.rs index 37775f03..5480fbdf 100644 --- a/config/src/preview/preview.rs +++ b/config/src/preview/preview.rs @@ -2,6 +2,7 @@ use std::{path::{Path, PathBuf}, time::{self, SystemTime}}; use md5::{Digest, Md5}; use serde::Deserialize; +use shared::absolute_path; use super::PreviewAdaptor; use crate::{xdg::Xdg, MERGED_YAZI}; @@ -35,7 +36,7 @@ impl Default for Preview { let preview = toml::from_str::(&MERGED_YAZI).unwrap().preview; let cache_dir = - preview.cache_dir.filter(|p| !p.is_empty()).map_or_else(Xdg::cache_dir, PathBuf::from); + preview.cache_dir.filter(|p| !p.is_empty()).map_or_else(Xdg::cache_dir, absolute_path); Preview { adaptor: Default::default(), diff --git a/config/src/theme/theme.rs b/config/src/theme/theme.rs index be12d237..68088d16 100644 --- a/config/src/theme/theme.rs +++ b/config/src/theme/theme.rs @@ -78,8 +78,7 @@ impl Default for Theme { check_validation(theme.tab.validate()); - theme.preview.syntect_theme = - futures::executor::block_on(absolute_path(&theme.preview.syntect_theme)); + theme.preview.syntect_theme = absolute_path(&theme.preview.syntect_theme); theme } diff --git a/config/src/xdg.rs b/config/src/xdg.rs index 437048b3..4f213244 100644 --- a/config/src/xdg.rs +++ b/config/src/xdg.rs @@ -1,16 +1,22 @@ use std::{env, path::PathBuf}; +use shared::absolute_path; + pub(super) struct Xdg; impl Xdg { pub(super) fn config_dir() -> Option { + if let Some(s) = env::var_os("YAZI_CONFIG_HOME").filter(|s| !s.is_empty()) { + return Some(absolute_path(s)); + } + #[cfg(target_os = "windows")] { dirs::config_dir().map(|p| p.join("yazi").join("config")) } #[cfg(not(target_os = "windows"))] { - std::env::var_os("XDG_CONFIG_HOME") + env::var_os("XDG_CONFIG_HOME") .map(PathBuf::from) .filter(|p| p.is_absolute()) .or_else(|| dirs::home_dir().map(|h| h.join(".config"))) @@ -25,7 +31,7 @@ impl Xdg { } #[cfg(not(target_os = "windows"))] { - std::env::var_os("XDG_STATE_HOME") + env::var_os("XDG_STATE_HOME") .map(PathBuf::from) .filter(|p| p.is_absolute()) .or_else(|| dirs::home_dir().map(|h| h.join(".local/state"))) diff --git a/shared/src/fns.rs b/shared/src/fns.rs index 1691d98d..34a1e34f 100644 --- a/shared/src/fns.rs +++ b/shared/src/fns.rs @@ -2,14 +2,14 @@ use std::{env, path::{Path, PathBuf}}; use tokio::fs; -pub async fn absolute_path(p: impl AsRef) -> PathBuf { +pub fn absolute_path(p: impl AsRef) -> PathBuf { let p = p.as_ref(); if let Ok(p) = p.strip_prefix("~") { if let Some(home) = env::var_os("HOME") { return PathBuf::from_iter([&home, p.as_os_str()]); } } - fs::canonicalize(p).await.unwrap_or_else(|_| p.to_path_buf()) + std::fs::canonicalize(p).unwrap_or_else(|_| p.to_path_buf()) } pub fn readable_path(p: &Path, base: &Path) -> String {