From 5c905a8c29da57999426ff62df430d94d782f5d4 Mon Sep 17 00:00:00 2001 From: paperbenni Date: Sun, 23 Feb 2025 15:25:24 +0100 Subject: [PATCH] refactor: move rga to logic to external::rga --- yazi-core/src/tab/commands/search.rs | 19 +++++++++----- yazi-plugin/src/external/mod.rs | 2 +- yazi-plugin/src/external/rg.rs | 4 +-- yazi-plugin/src/external/rga.rs | 39 ++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 yazi-plugin/src/external/rga.rs diff --git a/yazi-core/src/tab/commands/search.rs b/yazi-core/src/tab/commands/search.rs index e20259f5..85cd055d 100644 --- a/yazi-core/src/tab/commands/search.rs +++ b/yazi-core/src/tab/commands/search.rs @@ -48,21 +48,26 @@ impl Tab { let hidden = self.pref.show_hidden; self.search = Some(tokio::spawn(async move { - let rx = if opt.via == SearchOptVia::Rg || opt.via == SearchOptVia::Rga { - external::rg(external::RgOpt { - rga: SearchOptVia::Rga == opt.via, + let rx = match opt.via { + SearchOptVia::Rg => external::rg(external::RgOpt { cwd: cwd.clone(), hidden, subject: opt.subject.into_owned(), args: opt.args, - }) - } else { - external::fd(external::FdOpt { + }), + SearchOptVia::Rga => external::rga(external::RgaOpt { cwd: cwd.clone(), hidden, subject: opt.subject.into_owned(), args: opt.args, - }) + }), + SearchOptVia::Fd => external::fd(external::FdOpt { + cwd: cwd.clone(), + hidden, + subject: opt.subject.into_owned(), + args: opt.args, + }), + SearchOptVia::None => Result::Err(anyhow::anyhow!("Invalid `search` option")), }?; let rx = UnboundedReceiverStream::new(rx).chunks_timeout(5000, Duration::from_millis(500)); diff --git a/yazi-plugin/src/external/mod.rs b/yazi-plugin/src/external/mod.rs index ded3f3b2..f974108b 100644 --- a/yazi-plugin/src/external/mod.rs +++ b/yazi-plugin/src/external/mod.rs @@ -1 +1 @@ -yazi_macro::mod_flat!(fd highlighter rg); +yazi_macro::mod_flat!(fd highlighter rg rga); diff --git a/yazi-plugin/src/external/rg.rs b/yazi-plugin/src/external/rg.rs index ff3e6f1a..c4d5674e 100644 --- a/yazi-plugin/src/external/rg.rs +++ b/yazi-plugin/src/external/rg.rs @@ -7,15 +7,13 @@ use yazi_shared::url::Url; pub struct RgOpt { pub cwd: Url, - pub rga: bool, pub hidden: bool, pub subject: String, pub args: Vec, } pub fn rg(opt: RgOpt) -> Result> { - let commandname = if opt.rga { "rga" } else { "rg" }; - let mut child = Command::new(commandname) + let mut child = Command::new("rg") .args(["--color=never", "--files-with-matches", "--smart-case"]) .arg(if opt.hidden { "--hidden" } else { "--no-hidden" }) .args(opt.args) diff --git a/yazi-plugin/src/external/rga.rs b/yazi-plugin/src/external/rga.rs new file mode 100644 index 00000000..d7e6ac6a --- /dev/null +++ b/yazi-plugin/src/external/rga.rs @@ -0,0 +1,39 @@ +use std::process::Stdio; + +use anyhow::Result; +use tokio::{io::{AsyncBufReadExt, BufReader}, process::Command, sync::mpsc::{self, UnboundedReceiver}}; +use yazi_fs::File; +use yazi_shared::url::Url; + +pub struct RgaOpt { + pub cwd: Url, + pub hidden: bool, + pub subject: String, + pub args: Vec, +} + +pub fn rga(opt: RgaOpt) -> Result> { + let mut child = Command::new("rga") + .args(["--color=never", "--files-with-matches", "--smart-case"]) + .arg(if opt.hidden { "--hidden" } else { "--no-hidden" }) + .args(opt.args) + .arg(opt.subject) + .arg(&opt.cwd) + .kill_on_drop(true) + .stdout(Stdio::piped()) + .stderr(Stdio::null()) + .spawn()?; + + let mut it = BufReader::new(child.stdout.take().unwrap()).lines(); + let (tx, rx) = mpsc::unbounded_channel(); + + tokio::spawn(async move { + while let Ok(Some(line)) = it.next_line().await { + if let Ok(file) = File::from(opt.cwd.join(line)).await { + tx.send(file).ok(); + } + } + child.wait().await.ok(); + }); + Ok(rx) +}