diff --git a/yazi-core/src/files/sorter.rs b/yazi-core/src/files/sorter.rs index 7d8609d3..580891bc 100644 --- a/yazi-core/src/files/sorter.rs +++ b/yazi-core/src/files/sorter.rs @@ -19,36 +19,35 @@ impl FilesSorter { return false; } + let by_alphabetical = |a: &File, b: &File| { + if self.sensitive { + return self.cmp(&*a.url, &*b.url, self.promote(a, b)); + } + + self.cmp( + a.url.as_os_str().to_ascii_uppercase(), + b.url.as_os_str().to_ascii_uppercase(), + self.promote(a, b), + ) + }; + match self.by { SortBy::None => return false, - SortBy::Alphabetical => items.sort_unstable_by(|a, b| { - if self.sensitive { - return self.cmp(&*a.url, &*b.url, self.promote(a, b)); - } - - self.cmp( - a.url.as_os_str().to_ascii_uppercase(), - b.url.as_os_str().to_ascii_uppercase(), - self.promote(a, b), - ) - }), + SortBy::Alphabetical => items.sort_unstable_by(by_alphabetical), SortBy::Created => items.sort_unstable_by(|a, b| { - if let (Some(aa), Some(bb)) = (a.created, b.created) { - return self.cmp(aa, bb, self.promote(a, b)); - } - Ordering::Equal + let ord = self.cmp(a.created, b.created, self.promote(a, b)); + if ord == Ordering::Equal { by_alphabetical(a, b) } else { ord } }), SortBy::Modified => items.sort_unstable_by(|a, b| { - if let (Some(aa), Some(bb)) = (a.modified, b.modified) { - return self.cmp(aa, bb, self.promote(a, b)); - } - Ordering::Equal + let ord = self.cmp(a.modified, b.modified, self.promote(a, b)); + if ord == Ordering::Equal { by_alphabetical(a, b) } else { ord } }), SortBy::Natural => self.sort_naturally(items), SortBy::Size => items.sort_unstable_by(|a, b| { let aa = if a.is_dir() { sizes.get(&a.url).copied() } else { None }; let bb = if b.is_dir() { sizes.get(&b.url).copied() } else { None }; - self.cmp(aa.unwrap_or(a.len), bb.unwrap_or(b.len), self.promote(a, b)) + let ord = self.cmp(aa.unwrap_or(a.len), bb.unwrap_or(b.len), self.promote(a, b)); + if ord == Ordering::Equal { by_alphabetical(a, b) } else { ord } }), } true diff --git a/yazi-core/src/manager/commands/rename.rs b/yazi-core/src/manager/commands/rename.rs index b89b47b3..ad5c988d 100644 --- a/yazi-core/src/manager/commands/rename.rs +++ b/yazi-core/src/manager/commands/rename.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeSet, ffi::OsStr, io::{stdout, BufWriter, Write}, path::PathBuf}; +use std::{collections::BTreeMap, ffi::OsStr, io::{stdout, BufWriter, Write}, path::PathBuf}; use anyhow::{anyhow, bail, Result}; use tokio::{fs::{self, OpenOptions}, io::{stdin, AsyncReadExt, AsyncWriteExt}}; @@ -22,13 +22,9 @@ impl Manager { return Ok(()); } - let parent = old.parent_url().unwrap(); - emit!(Files(FilesOp::Deleting(parent, BTreeSet::from([old])))); - let file = File::from(new.clone()).await?; - emit!(Files(FilesOp::Creating(file.parent().unwrap(), file.into_map()))); - Self::_hover(Some(new)); - Ok(()) + emit!(Files(FilesOp::Replacing(file.parent().unwrap(), BTreeMap::from_iter([(old, file)])))); + Ok(Self::_hover(Some(new))) } pub fn rename(&self, opt: impl Into) -> bool { diff --git a/yazi-core/src/manager/watcher.rs b/yazi-core/src/manager/watcher.rs index 682a88b6..3d862a57 100644 --- a/yazi-core/src/manager/watcher.rs +++ b/yazi-core/src/manager/watcher.rs @@ -133,9 +133,7 @@ impl Watcher { watched: Arc>>>, ) { // TODO: revert this once a new notification is implemented - // let rx = UnboundedReceiverStream::new(rx).chunks_timeout(100, - // Duration::from_millis(200)); - let rx = UnboundedReceiverStream::new(rx).chunks_timeout(1, Duration::ZERO); + let rx = UnboundedReceiverStream::new(rx).chunks_timeout(10, Duration::from_millis(20)); pin!(rx); while let Some(urls) = rx.next().await {