mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat: Allow custom exit code from quit
This is useful to integrate yazi into a workflow with other tools. An example for this is the pager for https://github.com/aurutils/aurutils
This commit is contained in:
parent
bef481057a
commit
d066aae015
7 changed files with 27 additions and 10 deletions
|
|
@ -1,16 +1,24 @@
|
||||||
use yazi_shared::event::CmdCow;
|
use yazi_shared::event::{CmdCow, Data};
|
||||||
|
|
||||||
use crate::{mgr::{Mgr, commands::quit}, tasks::Tasks};
|
use crate::{mgr::{Mgr, commands::quit}, tasks::Tasks};
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct Opt {
|
struct Opt {
|
||||||
no_cwd_file: bool,
|
no_cwd_file: bool,
|
||||||
|
exit_code: i32,
|
||||||
}
|
}
|
||||||
impl From<CmdCow> for Opt {
|
impl From<CmdCow> for Opt {
|
||||||
fn from(c: CmdCow) -> Self { Self { no_cwd_file: c.bool("no-cwd-file") } }
|
fn from(c: CmdCow) -> Self {
|
||||||
|
Self {
|
||||||
|
no_cwd_file: c.bool("no-cwd-file"),
|
||||||
|
exit_code: c.get("exit_code").and_then(Data::as_i32).unwrap_or_default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
impl From<Opt> for quit::Opt {
|
impl From<Opt> for quit::Opt {
|
||||||
fn from(value: Opt) -> Self { Self { no_cwd_file: value.no_cwd_file } }
|
fn from(value: Opt) -> Self {
|
||||||
|
Self { no_cwd_file: value.no_cwd_file, exit_code: value.exit_code }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mgr {
|
impl Mgr {
|
||||||
|
|
|
||||||
|
|
@ -4,22 +4,29 @@ use tokio::{select, time};
|
||||||
use yazi_config::popup::ConfirmCfg;
|
use yazi_config::popup::ConfirmCfg;
|
||||||
use yazi_macro::emit;
|
use yazi_macro::emit;
|
||||||
use yazi_proxy::ConfirmProxy;
|
use yazi_proxy::ConfirmProxy;
|
||||||
use yazi_shared::event::{CmdCow, EventQuit};
|
use yazi_shared::event::{CmdCow, Data, EventQuit};
|
||||||
|
|
||||||
use crate::{mgr::Mgr, tasks::Tasks};
|
use crate::{mgr::Mgr, tasks::Tasks};
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub(super) struct Opt {
|
pub(super) struct Opt {
|
||||||
pub(super) no_cwd_file: bool,
|
pub(super) no_cwd_file: bool,
|
||||||
|
pub(super) exit_code: i32,
|
||||||
}
|
}
|
||||||
impl From<CmdCow> for Opt {
|
impl From<CmdCow> for Opt {
|
||||||
fn from(c: CmdCow) -> Self { Self { no_cwd_file: c.bool("no-cwd-file") } }
|
fn from(c: CmdCow) -> Self {
|
||||||
|
Self {
|
||||||
|
no_cwd_file: c.bool("no-cwd-file"),
|
||||||
|
exit_code: c.get("exit_code").and_then(Data::as_i32).unwrap_or_default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mgr {
|
impl Mgr {
|
||||||
#[yazi_codegen::command]
|
#[yazi_codegen::command]
|
||||||
pub fn quit(&self, opt: Opt, tasks: &Tasks) {
|
pub fn quit(&self, opt: Opt, tasks: &Tasks) {
|
||||||
let opt = EventQuit { no_cwd_file: opt.no_cwd_file, ..Default::default() };
|
let opt =
|
||||||
|
EventQuit { no_cwd_file: opt.no_cwd_file, exit_code: opt.exit_code, ..Default::default() };
|
||||||
|
|
||||||
let ongoing = tasks.ongoing().clone();
|
let ongoing = tasks.ongoing().clone();
|
||||||
let (left, left_names) = {
|
let (left, left_names) = {
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ impl App {
|
||||||
self.selected_to_file(selected);
|
self.selected_to_file(selected);
|
||||||
}
|
}
|
||||||
|
|
||||||
Term::goodbye(|| false);
|
Term::goodbye(|| opt.exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cwd_to_file(&self) {
|
fn cwd_to_file(&self) {
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ impl Panic {
|
||||||
std::panic::set_hook(Box::new(move |info| {
|
std::panic::set_hook(Box::new(move |info| {
|
||||||
Term::goodbye(|| {
|
Term::goodbye(|| {
|
||||||
hook(info);
|
hook(info);
|
||||||
true
|
true as i32
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ impl Term {
|
||||||
Ok(disable_raw_mode()?)
|
Ok(disable_raw_mode()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn goodbye(f: impl FnOnce() -> bool) -> ! {
|
pub(super) fn goodbye(f: impl FnOnce() -> i32) -> ! {
|
||||||
if CSI_U.swap(false, Ordering::Relaxed) {
|
if CSI_U.swap(false, Ordering::Relaxed) {
|
||||||
PopKeyboardEnhancementFlags.write_ansi(&mut TTY.writer()).ok();
|
PopKeyboardEnhancementFlags.write_ansi(&mut TTY.writer()).ok();
|
||||||
}
|
}
|
||||||
|
|
@ -111,7 +111,7 @@ impl Term {
|
||||||
|
|
||||||
disable_raw_mode().ok();
|
disable_raw_mode().ok();
|
||||||
|
|
||||||
std::process::exit(f() as i32);
|
std::process::exit(f());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn draw(&mut self, f: impl FnOnce(&mut Frame)) -> io::Result<CompletedFrame> {
|
pub(super) fn draw(&mut self, f: impl FnOnce(&mut Frame)) -> io::Result<CompletedFrame> {
|
||||||
|
|
|
||||||
|
|
@ -182,6 +182,7 @@ macro_rules! impl_number_as {
|
||||||
impl_integer_as!(usize, as_usize);
|
impl_integer_as!(usize, as_usize);
|
||||||
impl_integer_as!(isize, as_isize);
|
impl_integer_as!(isize, as_isize);
|
||||||
impl_integer_as!(i16, as_i16);
|
impl_integer_as!(i16, as_i16);
|
||||||
|
impl_integer_as!(i32, as_i32);
|
||||||
|
|
||||||
impl_number_as!(f64, as_f64);
|
impl_number_as!(f64, as_f64);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ pub enum Event {
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct EventQuit {
|
pub struct EventQuit {
|
||||||
pub no_cwd_file: bool,
|
pub no_cwd_file: bool,
|
||||||
|
pub exit_code: i32,
|
||||||
pub selected: Option<OsString>,
|
pub selected: Option<OsString>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue