mirror of https://github.com/bobwen-dev/hunter
added subprocesses running in foreground by appending !
This commit is contained in:
parent
48cbbf3b88
commit
1b596e73c1
|
@ -1067,7 +1067,7 @@ impl FileBrowser {
|
||||||
let selected_file = self.selected_file().ok();
|
let selected_file = self.selected_file().ok();
|
||||||
let selected_files = self.selected_files().ok();
|
let selected_files = self.selected_files().ok();
|
||||||
|
|
||||||
let cmd = self.core.minibuffer("exec")?.trim_start().to_string() + " ";
|
let cmd = self.core.minibuffer("exec")?.to_string() + " ";
|
||||||
|
|
||||||
let cwd_files = selected_files.map(|selected_files| {
|
let cwd_files = selected_files.map(|selected_files| {
|
||||||
if selected_files.len() == 0 {
|
if selected_files.len() == 0 {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
use std::process::Child;
|
use std::process::{Child, Command};
|
||||||
use std::os::unix::process::{CommandExt, ExitStatusExt};
|
use std::os::unix::process::{CommandExt, ExitStatusExt};
|
||||||
use std::io::{BufRead, BufReader};
|
use std::io::{BufRead, BufReader};
|
||||||
use std::ffi::OsString;
|
use std::ffi::{OsString, OsStr};
|
||||||
use std::os::unix::ffi::OsStringExt;
|
use std::os::unix::ffi::{OsStringExt, OsStrExt};
|
||||||
|
|
||||||
use termion::event::Key;
|
use termion::event::Key;
|
||||||
use unicode_width::UnicodeWidthStr;
|
use unicode_width::UnicodeWidthStr;
|
||||||
|
@ -19,7 +19,7 @@ use crate::preview::AsyncWidget;
|
||||||
use crate::dirty::Dirtyable;
|
use crate::dirty::Dirtyable;
|
||||||
use crate::hbox::HBox;
|
use crate::hbox::HBox;
|
||||||
use crate::fail::{HResult, HError, ErrorLog};
|
use crate::fail::{HResult, HError, ErrorLog};
|
||||||
use crate::term;
|
use crate::term::{self, ScreenExt};
|
||||||
use crate::files::File;
|
use crate::files::File;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -208,19 +208,29 @@ impl ListView<Vec<Process>> {
|
||||||
fn run_proc_subshell(&mut self, mut cmd: Cmd) -> HResult<()> {
|
fn run_proc_subshell(&mut self, mut cmd: Cmd) -> HResult<()> {
|
||||||
let shell = std::env::var("SHELL").unwrap_or("sh".into());
|
let shell = std::env::var("SHELL").unwrap_or("sh".into());
|
||||||
let home = crate::paths::home_path()?.into_os_string();
|
let home = crate::paths::home_path()?.into_os_string();
|
||||||
|
let fg = cmd.cmd.as_bytes().ends_with(b"! ");
|
||||||
|
|
||||||
|
if fg {
|
||||||
|
// remove that last !
|
||||||
|
let real_len = cmd.cmd.as_bytes().len() - 2;
|
||||||
|
cmd.cmd = OsString::from_vec(cmd.cmd.as_bytes()[0..real_len].to_vec());
|
||||||
|
// workaround until split is fixed
|
||||||
|
cmd.cmd.push(" ");
|
||||||
|
}
|
||||||
|
|
||||||
let cmd_args = cmd.process();
|
let cmd_args = cmd.process();
|
||||||
|
|
||||||
let short = OsString::from("~");
|
let short = OsStr::from_bytes("~".as_bytes());
|
||||||
let short_cmd = cmd_args
|
let short_cmd = cmd_args
|
||||||
.concat()
|
.concat()
|
||||||
.replace(&home, &short)
|
.replace(&home, &short)
|
||||||
.replace(&OsString::from("\""), &OsString::from(""))
|
.replace(OsStr::from_bytes("'\''".as_bytes()),
|
||||||
|
OsStr::from_bytes("'".as_bytes()))
|
||||||
|
.replace(OsStr::from_bytes("\"".as_bytes()),
|
||||||
|
OsStr::from_bytes("".as_bytes()))
|
||||||
.to_string_lossy()
|
.to_string_lossy()
|
||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
self.core.show_status(&format!("Running: {}", &short_cmd)).log();
|
|
||||||
|
|
||||||
let shell_args = cmd_args.concat();
|
let shell_args = cmd_args.concat();
|
||||||
let shell_args = vec![OsString::from("-c"), shell_args.clone()];
|
let shell_args = vec![OsString::from("-c"), shell_args.clone()];
|
||||||
|
|
||||||
|
@ -228,7 +238,17 @@ impl ListView<Vec<Process>> {
|
||||||
cmd.args = Some(shell_args.clone());
|
cmd.args = Some(shell_args.clone());
|
||||||
cmd.short_cmd = Some(short_cmd);
|
cmd.short_cmd = Some(short_cmd);
|
||||||
|
|
||||||
|
if !fg {
|
||||||
self.run_proc_raw(cmd)
|
self.run_proc_raw(cmd)
|
||||||
|
} else {
|
||||||
|
self.run_proc_raw_fg(cmd).log();
|
||||||
|
|
||||||
|
// Command might fail/return early. do this here
|
||||||
|
self.core.screen.reset()?;
|
||||||
|
self.core.screen.activate()?;
|
||||||
|
self.core.screen.clear()?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_proc_raw(&mut self, cmd: Cmd) -> HResult<()> {
|
fn run_proc_raw(&mut self, cmd: Cmd) -> HResult<()> {
|
||||||
|
@ -241,7 +261,7 @@ impl ListView<Vec<Process>> {
|
||||||
|
|
||||||
self.core.show_status(&format!("Running: {}", &short_cmd)).log();
|
self.core.show_status(&format!("Running: {}", &short_cmd)).log();
|
||||||
|
|
||||||
let handle = std::process::Command::new(real_cmd)
|
let handle = Command::new(real_cmd)
|
||||||
.args(args)
|
.args(args)
|
||||||
.stdin(std::process::Stdio::null())
|
.stdin(std::process::Stdio::null())
|
||||||
.stdout(std::process::Stdio::piped())
|
.stdout(std::process::Stdio::piped())
|
||||||
|
@ -260,6 +280,67 @@ impl ListView<Vec<Process>> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn run_proc_raw_fg(&mut self, cmd: Cmd) -> HResult<()> {
|
||||||
|
let real_cmd = cmd.cmd;
|
||||||
|
let short_cmd = cmd.short_cmd
|
||||||
|
.unwrap_or(real_cmd
|
||||||
|
.to_string_lossy()
|
||||||
|
.to_string());
|
||||||
|
let args = cmd.args.unwrap_or(vec![]);
|
||||||
|
|
||||||
|
self.core.show_status(&format!("Running (fg): {}", &short_cmd)).log();
|
||||||
|
|
||||||
|
self.core.screen.goto_xy(0,0)?;
|
||||||
|
self.core.screen.reset()?;
|
||||||
|
self.core.screen.suspend()?;
|
||||||
|
|
||||||
|
match Command::new(real_cmd)
|
||||||
|
.args(args)
|
||||||
|
.status() {
|
||||||
|
Ok(status) => {
|
||||||
|
let color_success =
|
||||||
|
if status.success() {
|
||||||
|
format!("{}successfully", term::color_green())
|
||||||
|
} else {
|
||||||
|
format!("{}unsuccessfully", term::color_red())
|
||||||
|
};
|
||||||
|
|
||||||
|
let color_status =
|
||||||
|
if status.success() {
|
||||||
|
format!("{}{}",
|
||||||
|
term::color_green(),
|
||||||
|
status.code().unwrap_or(status
|
||||||
|
.signal()
|
||||||
|
.unwrap_or(-1)))
|
||||||
|
} else {
|
||||||
|
format!("{}{}",
|
||||||
|
term::color_red(),
|
||||||
|
status.code().unwrap_or(status
|
||||||
|
.signal()
|
||||||
|
.unwrap_or(-1)))
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let procinfo = format!("{} exited {}{}{} with status: {}",
|
||||||
|
short_cmd,
|
||||||
|
color_success,
|
||||||
|
term::reset(),
|
||||||
|
term::status_bg(),
|
||||||
|
color_status);
|
||||||
|
|
||||||
|
self.core.show_status(&procinfo)?;
|
||||||
|
},
|
||||||
|
err @ Err(_) => {
|
||||||
|
self.core.show_status(&format!("{}{} ",
|
||||||
|
"Couldn't start process:",
|
||||||
|
short_cmd))?;
|
||||||
|
err?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn kill_proc(&mut self) -> HResult<()> {
|
fn kill_proc(&mut self) -> HResult<()> {
|
||||||
let proc = self.selected_proc()?;
|
let proc = self.selected_proc()?;
|
||||||
proc.handle.lock()?.kill()?;
|
proc.handle.lock()?.kill()?;
|
||||||
|
|
Loading…
Reference in New Issue