mirror of
https://github.com/sxyazi/yazi.git
synced 2024-12-18 22:31:35 +03:00
fix: respect symlink paths without canonicalizing them (#126)
This commit is contained in:
parent
c1f3c8f82d
commit
3544578a12
@ -4,7 +4,7 @@ use std::ffi::OsString;
|
||||
use anyhow::{Ok, Result};
|
||||
use config::{keymap::{Control, Key, KeymapLayer}, BOOT};
|
||||
use crossterm::event::KeyEvent;
|
||||
use shared::{absolute_url, Term};
|
||||
use shared::{expand_url, Term};
|
||||
use tokio::sync::oneshot;
|
||||
|
||||
use crate::{Ctx, Executor, Logs, Root, Signals};
|
||||
@ -121,7 +121,7 @@ impl App {
|
||||
match event {
|
||||
Event::Cd(url) => {
|
||||
futures::executor::block_on(async {
|
||||
manager.active_mut().cd(absolute_url(url)).await;
|
||||
manager.active_mut().cd(expand_url(url)).await;
|
||||
});
|
||||
}
|
||||
Event::Refresh => {
|
||||
|
@ -1,5 +1,5 @@
|
||||
use ratatui::{layout, prelude::{Buffer, Constraint, Direction, Rect}, style::{Color, Style}, widgets::{Paragraph, Widget}};
|
||||
use shared::readable_home;
|
||||
use shared::readable_path;
|
||||
|
||||
use super::Tabs;
|
||||
use crate::Ctx;
|
||||
@ -21,9 +21,9 @@ impl<'a> Widget for Layout<'a> {
|
||||
|
||||
let current = &self.cx.manager.current();
|
||||
let location = if current.cwd.is_search() {
|
||||
format!("{} (search)", readable_home(¤t.cwd))
|
||||
format!("{} (search)", readable_path(¤t.cwd))
|
||||
} else {
|
||||
readable_home(¤t.cwd)
|
||||
readable_path(¤t.cwd)
|
||||
};
|
||||
|
||||
Paragraph::new(location).style(Style::new().fg(Color::Cyan)).render(chunks[0], buf);
|
||||
|
@ -2,7 +2,7 @@ use core::files::File;
|
||||
|
||||
use config::{MANAGER, THEME};
|
||||
use ratatui::{buffer::Buffer, layout::Rect, style::Style, widgets::{List, ListItem, Widget}};
|
||||
use shared::readable_path;
|
||||
use shared::short_path;
|
||||
|
||||
use crate::Ctx;
|
||||
|
||||
@ -87,7 +87,7 @@ impl<'a> Widget for Folder<'a> {
|
||||
self.file_style(f)
|
||||
};
|
||||
|
||||
let mut path = format!(" {icon} {}", readable_path(f.url(), &self.folder.cwd));
|
||||
let mut path = format!(" {icon} {}", short_path(f.url(), &self.folder.cwd));
|
||||
if let Some(link_to) = f.link_to() {
|
||||
if MANAGER.show_symlink {
|
||||
path.push_str(&format!(" -> {}", link_to.display()));
|
||||
|
@ -1,7 +1,7 @@
|
||||
use std::{env, fs, path::PathBuf, process};
|
||||
|
||||
use clap::{command, Parser};
|
||||
use shared::absolute_path;
|
||||
use shared::expand_path;
|
||||
|
||||
use crate::{Xdg, PREVIEW};
|
||||
|
||||
@ -38,8 +38,7 @@ impl Default for Boot {
|
||||
fn default() -> Self {
|
||||
let args = Args::parse();
|
||||
|
||||
let cwd =
|
||||
args.cwd.map(absolute_path).filter(|p| p.is_dir()).or_else(|| env::current_dir().ok());
|
||||
let cwd = args.cwd.map(expand_path).filter(|p| p.is_dir()).or_else(|| env::current_dir().ok());
|
||||
|
||||
let boot = Self {
|
||||
cwd: cwd.unwrap_or("/".into()),
|
||||
|
@ -2,7 +2,7 @@ use std::{path::{Path, PathBuf}, time::{self, SystemTime}};
|
||||
|
||||
use md5::{Digest, Md5};
|
||||
use serde::Deserialize;
|
||||
use shared::absolute_path;
|
||||
use shared::expand_path;
|
||||
|
||||
use super::PreviewAdaptor;
|
||||
use crate::{xdg::Xdg, MERGED_YAZI};
|
||||
@ -36,7 +36,7 @@ impl Default for Preview {
|
||||
let preview = toml::from_str::<Outer>(&MERGED_YAZI).unwrap().preview;
|
||||
|
||||
let cache_dir =
|
||||
preview.cache_dir.filter(|p| !p.is_empty()).map_or_else(Xdg::cache_dir, absolute_path);
|
||||
preview.cache_dir.filter(|p| !p.is_empty()).map_or_else(Xdg::cache_dir, expand_path);
|
||||
|
||||
Preview {
|
||||
adaptor: Default::default(),
|
||||
|
@ -1,7 +1,7 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use serde::Deserialize;
|
||||
use shared::absolute_path;
|
||||
use shared::expand_path;
|
||||
use validator::Validate;
|
||||
|
||||
use super::{ColorGroup, Filetype, Icon, Style};
|
||||
@ -78,7 +78,7 @@ impl Default for Theme {
|
||||
|
||||
check_validation(theme.tab.validate());
|
||||
|
||||
theme.preview.syntect_theme = absolute_path(&theme.preview.syntect_theme);
|
||||
theme.preview.syntect_theme = expand_path(&theme.preview.syntect_theme);
|
||||
|
||||
theme
|
||||
}
|
||||
|
@ -1,13 +1,13 @@
|
||||
use std::{env, path::PathBuf};
|
||||
|
||||
use shared::absolute_path;
|
||||
use shared::expand_path;
|
||||
|
||||
pub(super) struct Xdg;
|
||||
|
||||
impl Xdg {
|
||||
pub(super) fn config_dir() -> Option<PathBuf> {
|
||||
if let Some(s) = env::var_os("YAZI_CONFIG_HOME").filter(|s| !s.is_empty()) {
|
||||
return Some(absolute_path(s));
|
||||
return Some(expand_path(s));
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
|
@ -4,30 +4,30 @@ use tokio::fs;
|
||||
|
||||
use crate::Url;
|
||||
|
||||
pub fn absolute_path(p: impl AsRef<Path>) -> PathBuf {
|
||||
pub fn expand_path(p: impl AsRef<Path>) -> 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()]);
|
||||
}
|
||||
}
|
||||
std::fs::canonicalize(p).unwrap_or_else(|_| p.to_path_buf())
|
||||
p.to_path_buf()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn absolute_url(mut u: Url) -> Url {
|
||||
u.set_path(absolute_path(&u));
|
||||
pub fn expand_url(mut u: Url) -> Url {
|
||||
u.set_path(expand_path(&u));
|
||||
u
|
||||
}
|
||||
|
||||
pub fn readable_path(p: &Path, base: &Path) -> String {
|
||||
pub fn short_path(p: &Path, base: &Path) -> String {
|
||||
if let Ok(p) = p.strip_prefix(base) {
|
||||
return p.display().to_string();
|
||||
}
|
||||
p.display().to_string()
|
||||
}
|
||||
|
||||
pub fn readable_home(p: &Path) -> String {
|
||||
pub fn readable_path(p: &Path) -> String {
|
||||
if let Ok(home) = env::var("HOME") {
|
||||
if let Ok(p) = p.strip_prefix(home) {
|
||||
return format!("~/{}", p.display());
|
||||
|
Loading…
Reference in New Issue
Block a user