mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat(bulk_rename): added --no-prompt opt
This commit is contained in:
parent
a246e9c7c0
commit
c8c5dfd332
4 changed files with 40 additions and 14 deletions
|
|
@ -3,14 +3,14 @@ use std::{hash::Hash, io::{Read, Write}, ops::Deref, path::Path};
|
||||||
use anyhow::{Result, anyhow};
|
use anyhow::{Result, anyhow};
|
||||||
use crossterm::{execute, style::Print};
|
use crossterm::{execute, style::Print};
|
||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use scopeguard::defer;
|
|
||||||
use tokio::io::AsyncWriteExt;
|
use tokio::io::AsyncWriteExt;
|
||||||
|
use scopeguard::defer;
|
||||||
use yazi_binding::Permit;
|
use yazi_binding::Permit;
|
||||||
use yazi_config::{YAZI, opener::OpenerRule};
|
use yazi_config::{YAZI, opener::OpenerRule};
|
||||||
use yazi_dds::Pubsub;
|
use yazi_dds::Pubsub;
|
||||||
use yazi_fs::{File, FilesOp, Splatter, max_common_root, path::skip_url, provider::{FileBuilder, Provider, local::{Gate, Local}}};
|
use yazi_fs::{File, FilesOp, Splatter, max_common_root, path::skip_url, provider::{FileBuilder, Provider, local::{Gate, Local}}};
|
||||||
use yazi_macro::{err, succ};
|
use yazi_macro::{err, succ};
|
||||||
use yazi_parser::VoidOpt;
|
use yazi_parser::mgr::BulkRenameOpt;
|
||||||
use yazi_proxy::{AppProxy, NotifyProxy, TasksProxy};
|
use yazi_proxy::{AppProxy, NotifyProxy, TasksProxy};
|
||||||
use yazi_shared::{data::Data, path::PathDyn, strand::{AsStrand, AsStrandJoin, Strand, StrandBuf, StrandLike}, terminal_clear, url::{AsUrl, UrlBuf, UrlCow, UrlLike}};
|
use yazi_shared::{data::Data, path::PathDyn, strand::{AsStrand, AsStrandJoin, Strand, StrandBuf, StrandLike}, terminal_clear, url::{AsUrl, UrlBuf, UrlCow, UrlLike}};
|
||||||
use yazi_term::YIELD_TO_SUBPROCESS;
|
use yazi_term::YIELD_TO_SUBPROCESS;
|
||||||
|
|
@ -23,11 +23,11 @@ use crate::{Actor, Ctx};
|
||||||
pub struct BulkRename;
|
pub struct BulkRename;
|
||||||
|
|
||||||
impl Actor for BulkRename {
|
impl Actor for BulkRename {
|
||||||
type Options = VoidOpt;
|
type Options = BulkRenameOpt;
|
||||||
|
|
||||||
const NAME: &str = "bulk_rename";
|
const NAME: &str = "bulk_rename";
|
||||||
|
|
||||||
fn act(cx: &mut Ctx, _: Self::Options) -> Result<Data> {
|
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
|
||||||
let Some(opener) = Self::opener() else {
|
let Some(opener) = Self::opener() else {
|
||||||
succ!(NotifyProxy::push_warn("Bulk rename", "No text opener found"));
|
succ!(NotifyProxy::push_warn("Bulk rename", "No text opener found"));
|
||||||
};
|
};
|
||||||
|
|
@ -79,7 +79,7 @@ impl Actor for BulkRename {
|
||||||
.map(|(i, s)| Tuple::new(i, s))
|
.map(|(i, s)| Tuple::new(i, s))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
Self::r#do(root, old, new, selected).await
|
Self::r#do(root, old, new, selected, opt.no_prompt).await
|
||||||
});
|
});
|
||||||
succ!();
|
succ!();
|
||||||
}
|
}
|
||||||
|
|
@ -91,6 +91,7 @@ impl BulkRename {
|
||||||
old: Vec<Tuple>,
|
old: Vec<Tuple>,
|
||||||
new: Vec<Tuple>,
|
new: Vec<Tuple>,
|
||||||
selected: Vec<UrlBuf>,
|
selected: Vec<UrlBuf>,
|
||||||
|
no_prompt: bool,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
terminal_clear(TTY.writer())?;
|
terminal_clear(TTY.writer())?;
|
||||||
if old.len() != new.len() {
|
if old.len() != new.len() {
|
||||||
|
|
@ -108,20 +109,19 @@ impl BulkRename {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if !no_prompt {
|
||||||
let mut w = TTY.lockout();
|
let mut w = TTY.lockout();
|
||||||
for (old, new) in &todo {
|
for (old, new) in &todo {
|
||||||
writeln!(w, "{} -> {}", old.display(), new.display())?;
|
writeln!(w, "{} -> {}", old.display(), new.display())?;
|
||||||
}
|
}
|
||||||
write!(w, "Continue to rename? (y/N): ")?;
|
write!(w, "Continue to rename? (y/N): ")?;
|
||||||
w.flush()?;
|
w.flush()?;
|
||||||
}
|
|
||||||
|
|
||||||
let mut buf = [0; 10];
|
let mut buf = [0; 10];
|
||||||
_ = TTY.reader().read(&mut buf)?;
|
_ = TTY.reader().read(&mut buf)?;
|
||||||
if buf[0] != b'y' && buf[0] != b'Y' {
|
if buf[0] != b'y' && buf[0] != b'Y' {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let permit = WATCHER.acquire().await.unwrap();
|
let permit = WATCHER.acquire().await.unwrap();
|
||||||
let (mut failed, mut succeeded) = (Vec::new(), HashMap::with_capacity(todo.len()));
|
let (mut failed, mut succeeded) = (Vec::new(), HashMap::with_capacity(todo.len()));
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ pub enum Spark<'a> {
|
||||||
// Mgr
|
// Mgr
|
||||||
Arrow(yazi_parser::ArrowOpt),
|
Arrow(yazi_parser::ArrowOpt),
|
||||||
Back(yazi_parser::VoidOpt),
|
Back(yazi_parser::VoidOpt),
|
||||||
BulkRename(yazi_parser::VoidOpt),
|
BulkRename(yazi_parser::mgr::BulkRenameOpt),
|
||||||
Cd(yazi_parser::mgr::CdOpt),
|
Cd(yazi_parser::mgr::CdOpt),
|
||||||
Close(yazi_parser::mgr::CloseOpt),
|
Close(yazi_parser::mgr::CloseOpt),
|
||||||
Copy(yazi_parser::mgr::CopyOpt),
|
Copy(yazi_parser::mgr::CopyOpt),
|
||||||
|
|
@ -341,7 +341,6 @@ try_from_spark!(
|
||||||
app:bootstrap,
|
app:bootstrap,
|
||||||
app:focus,
|
app:focus,
|
||||||
mgr:back,
|
mgr:back,
|
||||||
mgr:bulk_rename,
|
|
||||||
mgr:enter,
|
mgr:enter,
|
||||||
mgr:escape_filter,
|
mgr:escape_filter,
|
||||||
mgr:escape_find,
|
mgr:escape_find,
|
||||||
|
|
@ -378,6 +377,7 @@ try_from_spark!(yazi_parser::confirm::ShowOpt, confirm:show);
|
||||||
try_from_spark!(yazi_parser::help::ToggleOpt, help:toggle);
|
try_from_spark!(yazi_parser::help::ToggleOpt, help:toggle);
|
||||||
try_from_spark!(yazi_parser::input::CloseOpt, input:close);
|
try_from_spark!(yazi_parser::input::CloseOpt, input:close);
|
||||||
try_from_spark!(yazi_widgets::input::InputOpt, input:show);
|
try_from_spark!(yazi_widgets::input::InputOpt, input:show);
|
||||||
|
try_from_spark!(yazi_parser::mgr::BulkRenameOpt, mgr:bulk_rename);
|
||||||
try_from_spark!(yazi_parser::mgr::CdOpt, mgr:cd);
|
try_from_spark!(yazi_parser::mgr::CdOpt, mgr:cd);
|
||||||
try_from_spark!(yazi_parser::mgr::CloseOpt, mgr:close);
|
try_from_spark!(yazi_parser::mgr::CloseOpt, mgr:close);
|
||||||
try_from_spark!(yazi_parser::mgr::CopyOpt, mgr:copy);
|
try_from_spark!(yazi_parser::mgr::CopyOpt, mgr:copy);
|
||||||
|
|
|
||||||
25
yazi-parser/src/mgr/bulk_rename.rs
Normal file
25
yazi-parser/src/mgr/bulk_rename.rs
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
use mlua::{ExternalError, FromLua, IntoLua, Lua, Value};
|
||||||
|
use yazi_shared::event::ActionCow;
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct BulkRenameOpt {
|
||||||
|
pub no_prompt: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<ActionCow> for BulkRenameOpt {
|
||||||
|
fn from(a: ActionCow) -> Self {
|
||||||
|
Self { no_prompt: a.bool("no-prompt") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromLua for BulkRenameOpt {
|
||||||
|
fn from_lua(_: Value, _: &Lua) -> mlua::Result<Self> {
|
||||||
|
Err("unsupported".into_lua_err())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoLua for BulkRenameOpt {
|
||||||
|
fn into_lua(self, _: &Lua) -> mlua::Result<Value> {
|
||||||
|
Err("unsupported".into_lua_err())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
yazi_macro::mod_flat!(
|
yazi_macro::mod_flat!(
|
||||||
|
bulk_rename
|
||||||
cd
|
cd
|
||||||
close
|
close
|
||||||
copy
|
copy
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue