feat: automatically change the current working directory after closing yazi

This commit is contained in:
sxyazi 2023-08-09 16:24:31 +08:00
parent d198f142e2
commit a94b0f249a
No known key found for this signature in database
8 changed files with 43 additions and 35 deletions

View file

@ -1,7 +1,7 @@
use std::{path::{Path, PathBuf}, sync::Arc}; use std::{path::{Path, PathBuf}, sync::Arc};
use anyhow::Result; use anyhow::Result;
use config::{MANAGER, PREVIEW}; use config::{BOOT, PREVIEW};
use image::{imageops::FilterType, DynamicImage, ImageFormat}; use image::{imageops::FilterType, DynamicImage, ImageFormat};
use md5::{Digest, Md5}; use md5::{Digest, Md5};
use shared::tty_ratio; use shared::tty_ratio;
@ -57,8 +57,8 @@ impl Image {
#[inline] #[inline]
pub fn cache(path: &Path) -> PathBuf { pub fn cache(path: &Path) -> PathBuf {
MANAGER BOOT
.cache .cache_dir
.join(format!("{:x}", Md5::new_with_prefix(path.to_string_lossy().as_bytes()).finalize())) .join(format!("{:x}", Md5::new_with_prefix(path.to_string_lossy().as_bytes()).finalize()))
} }
} }

View file

@ -1,5 +1,5 @@
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use config::LOG; use config::BOOT;
use tracing_appender::non_blocking::WorkerGuard; use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::{fmt, prelude::__tracing_subscriber_SubscriberExt, Registry}; use tracing_subscriber::{fmt, prelude::__tracing_subscriber_SubscriberExt, Registry};
@ -7,7 +7,7 @@ pub(super) struct Logs;
impl Logs { impl Logs {
pub(super) fn init() -> Result<WorkerGuard> { pub(super) fn init() -> Result<WorkerGuard> {
let appender = tracing_appender::rolling::never(&LOG.root, "yazi.log"); let appender = tracing_appender::rolling::never(&BOOT.state_dir, "yazi.log");
let (handle, guard) = tracing_appender::non_blocking(appender); let (handle, guard) = tracing_appender::non_blocking(appender);
// let filter = EnvFilter::from_default_env(); // let filter = EnvFilter::from_default_env();

27
config/src/boot/boot.rs Normal file
View file

@ -0,0 +1,27 @@
use std::{env, fs, path::PathBuf};
#[derive(Debug)]
pub struct Boot {
pub cwd: PathBuf,
pub cache_dir: PathBuf,
pub state_dir: PathBuf,
}
impl Default for Boot {
fn default() -> Self {
let boot = Self {
cwd: env::current_dir().unwrap_or("/".into()),
cache_dir: env::temp_dir().join("yazi"),
state_dir: xdg::BaseDirectories::with_prefix("yazi").unwrap().get_state_home(),
};
if !boot.cache_dir.is_dir() {
fs::create_dir(&boot.cache_dir).unwrap();
}
if !boot.state_dir.is_dir() {
fs::create_dir_all(&boot.state_dir).unwrap();
}
boot
}
}

3
config/src/boot/mod.rs Normal file
View file

@ -0,0 +1,3 @@
mod boot;
pub use boot::*;

View file

@ -2,6 +2,7 @@
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
mod boot;
pub mod keymap; pub mod keymap;
mod log; mod log;
pub mod manager; pub mod manager;
@ -18,6 +19,7 @@ static MERGED_KEYMAP: Lazy<String> = Lazy::new(Preset::keymap);
static MERGED_THEME: Lazy<String> = Lazy::new(Preset::theme); static MERGED_THEME: Lazy<String> = Lazy::new(Preset::theme);
static MERGED_YAZI: Lazy<String> = Lazy::new(Preset::yazi); static MERGED_YAZI: Lazy<String> = Lazy::new(Preset::yazi);
pub static BOOT: Lazy<boot::Boot> = Lazy::new(Default::default);
pub static KEYMAP: Lazy<keymap::Keymap> = Lazy::new(Default::default); pub static KEYMAP: Lazy<keymap::Keymap> = Lazy::new(Default::default);
pub static LOG: Lazy<log::Log> = Lazy::new(Default::default); pub static LOG: Lazy<log::Log> = Lazy::new(Default::default);
pub static MANAGER: Lazy<manager::Manager> = Lazy::new(Default::default); pub static MANAGER: Lazy<manager::Manager> = Lazy::new(Default::default);
@ -26,6 +28,7 @@ pub static PREVIEW: Lazy<preview::Preview> = Lazy::new(Default::default);
pub static THEME: Lazy<theme::Theme> = Lazy::new(Default::default); pub static THEME: Lazy<theme::Theme> = Lazy::new(Default::default);
pub fn init() { pub fn init() {
Lazy::force(&BOOT);
Lazy::force(&KEYMAP); Lazy::force(&KEYMAP);
Lazy::force(&LOG); Lazy::force(&LOG);
Lazy::force(&MANAGER); Lazy::force(&MANAGER);

View file

@ -1,13 +1,10 @@
use std::path::PathBuf; use serde::{Deserialize, Deserializer};
use serde::{de, Deserialize, Deserializer};
use crate::MERGED_YAZI; use crate::MERGED_YAZI;
#[derive(Debug)] #[derive(Debug)]
pub struct Log { pub struct Log {
pub enabled: bool, pub enabled: bool,
pub root: PathBuf,
} }
impl Default for Log { impl Default for Log {
@ -30,13 +27,6 @@ impl<'de> Deserialize<'de> for Log {
let outer = Outer::deserialize(deserializer)?; let outer = Outer::deserialize(deserializer)?;
let root = xdg::BaseDirectories::with_prefix("yazi") Ok(Self { enabled: outer.log.enabled })
.map_err(|e| de::Error::custom(e.to_string()))?
.get_state_home();
if !root.is_dir() {
std::fs::create_dir_all(&root).map_err(|e| de::Error::custom(e.to_string()))?;
}
Ok(Self { enabled: outer.log.enabled, root })
} }
} }

View file

@ -1,5 +1,3 @@
use std::{env, fs, path::PathBuf};
use serde::Deserialize; use serde::Deserialize;
use super::SortBy; use super::SortBy;
@ -7,11 +5,6 @@ use crate::MERGED_YAZI;
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct Manager { pub struct Manager {
#[serde(skip)]
pub cwd: PathBuf,
#[serde(skip)]
pub cache: PathBuf,
// Sorting // Sorting
pub sort_by: SortBy, pub sort_by: SortBy,
pub sort_reverse: bool, pub sort_reverse: bool,
@ -27,14 +20,6 @@ impl Default for Manager {
manager: Manager, manager: Manager,
} }
let mut manager = toml::from_str::<Outer>(&MERGED_YAZI).unwrap().manager; toml::from_str::<Outer>(&MERGED_YAZI).unwrap().manager
manager.cwd = env::current_dir().unwrap_or("/".into());
manager.cache = env::temp_dir().join("yazi");
if !manager.cache.is_dir() {
fs::create_dir(&manager.cache).unwrap();
}
manager
} }
} }

View file

@ -1,6 +1,6 @@
use std::path::Path; use std::path::Path;
use config::MANAGER; use config::BOOT;
use super::Tab; use super::Tab;
use crate::emit; use crate::emit;
@ -14,7 +14,7 @@ pub struct Tabs {
impl Tabs { impl Tabs {
pub fn make() -> Self { pub fn make() -> Self {
let mut tabs = Self { idx: usize::MAX, items: vec![Tab::new(&MANAGER.cwd)] }; let mut tabs = Self { idx: usize::MAX, items: vec![Tab::new(&BOOT.cwd)] };
tabs.set_idx(0); tabs.set_idx(0);
tabs tabs
} }