diff --git a/Cargo.lock b/Cargo.lock index c8f84bf0..1b790e0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2777,6 +2777,7 @@ dependencies = [ "regex", "scopeguard", "serde", + "shell-words", "tokio", "tokio-stream", "tokio-util", diff --git a/yazi-core/Cargo.toml b/yazi-core/Cargo.toml index c60bde23..e942b744 100644 --- a/yazi-core/Cargo.toml +++ b/yazi-core/Cargo.toml @@ -33,6 +33,7 @@ tokio = { version = "1.37.0", features = [ "full" ] } tokio-stream = "0.1.15" tokio-util = "0.7.10" unicode-width = "0.1.12" +shell-words = "1.1.0" # Logging tracing = { version = "0.1.40", features = [ "max_level_debug", "release_max_level_warn" ] } diff --git a/yazi-core/src/tab/commands/search.rs b/yazi-core/src/tab/commands/search.rs index d4119e90..a95e2aa9 100644 --- a/yazi-core/src/tab/commands/search.rs +++ b/yazi-core/src/tab/commands/search.rs @@ -63,11 +63,27 @@ impl Tab { let mut input = InputProxy::show(InputCfg::search(&opt.type_.to_string())); let Some(Ok(subject)) = input.recv().await else { bail!("") }; + let mut arguments = Vec::new(); + let mut subjects = Vec::new(); + let words = shell_words::split(&subject)?; + for word in words { + if word.starts_with("--args=") { + let args_string = word.strip_prefix("--args=").unwrap(); + arguments.extend(shell_words::split(args_string)?); + } else { + subjects.push(word); + } + } + if subjects.is_empty() { + bail!("No search subject found"); + } + let subject = subjects.join(" "); + cwd = cwd.into_search(subject.clone()); let rx = if opt.type_ == OptType::Rg { - external::rg(external::RgOpt { cwd: cwd.clone(), hidden, subject }) + external::rg(external::RgOpt { cwd: cwd.clone(), hidden, subject, args: arguments}) } else { - external::fd(external::FdOpt { cwd: cwd.clone(), hidden, glob: false, subject }) + external::fd(external::FdOpt { cwd: cwd.clone(), hidden, glob: false, subject, args: arguments }) }?; let rx = UnboundedReceiverStream::new(rx).chunks_timeout(1000, Duration::from_millis(300)); diff --git a/yazi-plugin/src/external/fd.rs b/yazi-plugin/src/external/fd.rs index 4fced261..2031370a 100644 --- a/yazi-plugin/src/external/fd.rs +++ b/yazi-plugin/src/external/fd.rs @@ -1,4 +1,4 @@ -use std::process::Stdio; +use std::{env::args, process::Stdio}; use anyhow::Result; use tokio::{io::{AsyncBufReadExt, BufReader}, process::Command, sync::mpsc::{self, UnboundedReceiver}}; @@ -9,6 +9,7 @@ pub struct FdOpt { pub hidden: bool, pub glob: bool, pub subject: String, + pub args: Vec, } pub fn fd(opt: FdOpt) -> Result> { @@ -16,6 +17,7 @@ pub fn fd(opt: FdOpt) -> Result> { .arg("--base-directory") .arg(&opt.cwd) .args(if opt.hidden { ["--hidden", "--no-ignore"] } else { ["--no-hidden", "--ignore"] }) + .args(&opt.args) .arg(if opt.glob { "--glob" } else { "--regex" }) .arg(&opt.subject) .kill_on_drop(true) diff --git a/yazi-plugin/src/external/rg.rs b/yazi-plugin/src/external/rg.rs index b37a3235..27c21eae 100644 --- a/yazi-plugin/src/external/rg.rs +++ b/yazi-plugin/src/external/rg.rs @@ -8,6 +8,7 @@ pub struct RgOpt { pub cwd: Url, pub hidden: bool, pub subject: String, + pub args: Vec, } pub fn rg(opt: RgOpt) -> Result> { @@ -15,6 +16,7 @@ pub fn rg(opt: RgOpt) -> Result> { .current_dir(&opt.cwd) .args(["--color=never", "--files-with-matches", "--smart-case"]) .args(if opt.hidden { ["--hidden", "--no-ignore"] } else { ["--no-hidden", "--ignore"] }) + .args(opt.args) .arg(&opt.subject) .kill_on_drop(true) .stdout(Stdio::piped())