diff --git a/Cargo.lock b/Cargo.lock index 1983e399..b5c61412 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3591,6 +3591,7 @@ dependencies = [ "crossterm", "futures", "libc", + "memchr", "parking_lot", "percent-encoding", "ratatui", diff --git a/yazi-fs/src/mounts/linux.rs b/yazi-fs/src/mounts/linux.rs index 0f305153..de42c49c 100644 --- a/yazi-fs/src/mounts/linux.rs +++ b/yazi-fs/src/mounts/linux.rs @@ -1,9 +1,9 @@ -use std::{borrow::Cow, collections::{HashMap, HashSet}, ffi::{OsStr, OsString}, os::{fd::AsFd, unix::{ffi::OsStrExt, fs::MetadataExt}}, time::Duration}; +use std::{borrow::Cow, collections::{HashMap, HashSet}, ffi::{OsStr, OsString}, os::{fd::AsFd, unix::{ffi::{OsStrExt, OsStringExt}, fs::MetadataExt}}, time::Duration}; use anyhow::Result; use tokio::{io::{Interest, unix::AsyncFd}, time::sleep}; use tracing::error; -use yazi_shared::replace_cow; +use yazi_shared::{replace_cow, replace_vec}; use super::{Locked, Partition, Partitions}; @@ -129,7 +129,10 @@ impl Partitions { let mut map = HashMap::new(); for entry in std::fs::read_dir("/dev/disk/by-label")?.flatten() { let meta = std::fs::metadata(entry.path())?; - map.insert((meta.dev(), meta.ino()), entry.file_name()); + map.insert( + (meta.dev(), meta.ino()), + OsString::from_vec(replace_vec(entry.file_name().into_vec(), br"\x20", b" ")), + ); } Ok(map) } diff --git a/yazi-shared/Cargo.toml b/yazi-shared/Cargo.toml index 56861c56..afff7566 100644 --- a/yazi-shared/Cargo.toml +++ b/yazi-shared/Cargo.toml @@ -16,6 +16,7 @@ yazi-macro = { path = "../yazi-macro", version = "0.4.3" } anyhow = { workspace = true } crossterm = { workspace = true } futures = { workspace = true } +memchr = "2.7.4" parking_lot = { workspace = true } percent-encoding = "2.3.1" ratatui = { workspace = true } diff --git a/yazi-shared/src/chars.rs b/yazi-shared/src/chars.rs index e234b03c..858e6c04 100644 --- a/yazi-shared/src/chars.rs +++ b/yazi-shared/src/chars.rs @@ -64,6 +64,25 @@ fn replace_cow_impl<'s>( result + unsafe { src.get_unchecked(last..) } } +pub fn replace_vec(v: Vec, from: &[u8], to: &[u8]) -> Vec { + let mut it = memchr::memmem::find_iter(&v, from); + let Some(mut last) = it.next() else { return v }; + + let mut out = Vec::with_capacity(v.len()); + out.extend_from_slice(&v[..last]); + out.extend_from_slice(to); + last += from.len(); + + for idx in it { + out.extend_from_slice(&v[last..idx]); + out.extend_from_slice(to); + last = idx + from.len(); + } + + out.extend_from_slice(&v[last..]); + out +} + pub fn replace_to_printable(s: &[String], tab_size: u8) -> String { let mut buf = Vec::new(); buf.try_reserve_exact(s.iter().map(|s| s.len()).sum::() | 15).unwrap_or_else(|_| panic!());