mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
refactor: move rga to logic to external::rga
This commit is contained in:
parent
bcbff4e884
commit
5c905a8c29
4 changed files with 53 additions and 11 deletions
|
|
@ -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));
|
||||
|
|
|
|||
2
yazi-plugin/src/external/mod.rs
vendored
2
yazi-plugin/src/external/mod.rs
vendored
|
|
@ -1 +1 @@
|
|||
yazi_macro::mod_flat!(fd highlighter rg);
|
||||
yazi_macro::mod_flat!(fd highlighter rg rga);
|
||||
|
|
|
|||
4
yazi-plugin/src/external/rg.rs
vendored
4
yazi-plugin/src/external/rg.rs
vendored
|
|
@ -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<String>,
|
||||
}
|
||||
|
||||
pub fn rg(opt: RgOpt) -> Result<UnboundedReceiver<File>> {
|
||||
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)
|
||||
|
|
|
|||
39
yazi-plugin/src/external/rga.rs
vendored
Normal file
39
yazi-plugin/src/external/rga.rs
vendored
Normal file
|
|
@ -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<String>,
|
||||
}
|
||||
|
||||
pub fn rga(opt: RgaOpt) -> Result<UnboundedReceiver<File>> {
|
||||
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)
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue