|
1 | | -use std::{mem, path::MAIN_SEPARATOR_STR}; |
| 1 | +use std::mem; |
2 | 2 |
|
3 | 3 | use anyhow::Result; |
4 | | -use yazi_fs::{CWD, path::expand_url, provider::{DirReader, FileHolder}}; |
| 4 | +use yazi_fs::{CWD, path::clean_url, provider::{DirReader, FileHolder}}; |
5 | 5 | use yazi_macro::{act, render, succ}; |
6 | 6 | use yazi_parser::cmp::{CmpItem, ShowOpt, TriggerOpt}; |
7 | 7 | use yazi_proxy::CmpProxy; |
8 | | -use yazi_shared::{AnyAsciiChar, data::Data, natsort, path::{PathBufDyn, PathDyn, PathLike}, scheme::{SchemeCow, SchemeLike}, strand::{AsStrand, StrandLike}, url::{UrlBuf, UrlCow, UrlLike}}; |
| 8 | +use yazi_shared::{AnyAsciiChar, data::Data, natsort, path::{AsPath, PathBufDyn, PathCow, PathDyn, PathLike}, scheme::{SchemeCow, SchemeLike}, strand::{AsStrand, StrandLike}, url::{UrlBuf, UrlCow, UrlLike}}; |
9 | 9 | use yazi_vfs::provider; |
10 | 10 |
|
11 | 11 | use crate::{Actor, Ctx}; |
@@ -74,24 +74,25 @@ impl Trigger { |
74 | 74 | return None; // We don't autocomplete a `~`, but `~/` |
75 | 75 | } |
76 | 76 |
|
| 77 | + let cwd = CWD.load(); |
| 78 | + let abs = if !path.is_absolute() && cwd.scheme().covariant(&scheme) { |
| 79 | + cwd.loc().try_join(&path).ok()?.into() |
| 80 | + } else { |
| 81 | + PathCow::from(&path) |
| 82 | + }; |
| 83 | + |
77 | 84 | let sep = if cfg!(windows) { |
78 | 85 | AnyAsciiChar::new(b"/\\").unwrap() |
79 | 86 | } else { |
80 | 87 | AnyAsciiChar::new(b"/").unwrap() |
81 | 88 | }; |
82 | 89 |
|
83 | | - Some(match path.rsplit_pred(sep) { |
84 | | - Some((p, c)) if p.is_empty() => { |
85 | | - let root = PathDyn::with_str(scheme.kind(), MAIN_SEPARATOR_STR); |
86 | | - (UrlCow::try_from((scheme, root)).ok()?.into_owned(), c.into()) |
87 | | - } |
88 | | - Some((p, c)) => (expand_url(UrlCow::try_from((scheme, p)).ok()?), c.into()), |
89 | | - None if CWD.load().scheme().covariant(&scheme) => (CWD.load().as_ref().clone(), path.into()), |
90 | | - None => { |
91 | | - let empty = PathDyn::with_str(scheme.kind(), ""); |
92 | | - (UrlCow::try_from((scheme, empty)).ok()?.into_owned(), path.into()) |
93 | | - } |
94 | | - }) |
| 90 | + let child = path.rsplit_pred(sep).map_or(path.as_path(), |(_, c)| c); |
| 91 | + let parent = |
| 92 | + PathDyn::with(scheme.kind(), abs.encoded_bytes().strip_suffix(child.encoded_bytes())?) |
| 93 | + .ok()?; |
| 94 | + |
| 95 | + Some((clean_url(UrlCow::try_from((scheme, parent)).ok()?), child.into())) |
95 | 96 | } |
96 | 97 | } |
97 | 98 |
|
@@ -130,11 +131,11 @@ mod tests { |
130 | 131 | compare("/foo/bar", "/foo/", "bar"); |
131 | 132 | compare("///foo/bar", "/foo/", "bar"); |
132 | 133 |
|
133 | | - CWD.set(&"sftp://test/".parse::<UrlBuf>().unwrap(), || {}); |
134 | | - compare("sftp://test/a", "sftp://test/", "a"); |
135 | | - compare("sftp://test//a", "sftp://test:0//", "a"); |
136 | | - compare("sftp://test2/a", "sftp://test2/", "a"); |
137 | | - compare("sftp://test2//a", "sftp://test2:0//", "a"); |
| 134 | + CWD.set(&"sftp://test".parse::<UrlBuf>().unwrap(), || {}); |
| 135 | + compare("sftp://test/a", "sftp://test/.", "a"); |
| 136 | + compare("sftp://test//a", "sftp://test//", "a"); |
| 137 | + compare("sftp://test2/a", "sftp://test2/.", "a"); |
| 138 | + compare("sftp://test2//a", "sftp://test2//", "a"); |
138 | 139 | } |
139 | 140 |
|
140 | 141 | #[cfg(windows)] |
|
0 commit comments