mirror of https://github.com/bobwen-dev/hunter
expand $<num> to tab dir in exec command
This commit is contained in:
parent
a1230fed0d
commit
16018ff604
|
@ -54,6 +54,17 @@ impl Tabbable for TabView<FileBrowser> {
|
||||||
fn on_next_tab(&mut self) {
|
fn on_next_tab(&mut self) {
|
||||||
self.active_tab_mut().refresh();
|
self.active_tab_mut().refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn on_key_sub(&mut self, key: Key) {
|
||||||
|
match key {
|
||||||
|
Key::Char('!') => {
|
||||||
|
let tab_dirs = self.widgets.iter().map(|w| w.cwd.clone())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
self.widgets[self.active].exec_cmd(tab_dirs).ok();
|
||||||
|
}
|
||||||
|
_ => self.active_tab_mut().on_key(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FileBrowser {
|
impl FileBrowser {
|
||||||
|
@ -238,6 +249,55 @@ impl FileBrowser {
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn exec_cmd(&mut self, tab_dirs: Vec<File>) -> HResult<()> {
|
||||||
|
let widget = self.left_widget()?;
|
||||||
|
let widget = widget.lock()?;
|
||||||
|
let selected_files = (*widget).as_ref()?.content.get_selected();
|
||||||
|
|
||||||
|
let file_names
|
||||||
|
= selected_files.iter().map(|f| f.name.clone()).collect::<Vec<String>>();
|
||||||
|
|
||||||
|
let cmd = self.minibuffer("exec:")?;
|
||||||
|
|
||||||
|
self.show_status(&format!("Running: \"{}\"", &cmd));
|
||||||
|
|
||||||
|
let filename = self.selected_file()?.name.clone();
|
||||||
|
|
||||||
|
let mut cmd = if file_names.len() == 0 {
|
||||||
|
cmd.replace("$s", &format!("{}", &filename))
|
||||||
|
} else {
|
||||||
|
let args = file_names.iter().map(|f| {
|
||||||
|
format!(" \"{}\" ", f)
|
||||||
|
}).collect::<String>();
|
||||||
|
let clean_cmd = cmd.replace("$s", "");
|
||||||
|
|
||||||
|
clean_cmd + &args
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i, tab_dir) in tab_dirs.iter().enumerate() {
|
||||||
|
let tab_identifier = format!("${}", i);
|
||||||
|
let tab_path = tab_dir.path.to_string_lossy();
|
||||||
|
cmd = cmd.replace(&tab_identifier, &tab_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
let status = std::process::Command::new("sh")
|
||||||
|
.arg("-c")
|
||||||
|
.arg(&cmd)
|
||||||
|
.status();
|
||||||
|
let mut bufout = std::io::BufWriter::new(std::io::stdout());
|
||||||
|
write!(bufout, "{}{}",
|
||||||
|
termion::style::Reset,
|
||||||
|
termion::clear::All).unwrap();
|
||||||
|
|
||||||
|
match status {
|
||||||
|
Ok(status) => self.show_status(&format!("\"{}\" exited with {}",
|
||||||
|
cmd, status)),
|
||||||
|
Err(err) => self.show_status(&format!("Can't run this \"{}\": {}",
|
||||||
|
cmd, err)),
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Widget for FileBrowser {
|
impl Widget for FileBrowser {
|
||||||
|
|
|
@ -53,7 +53,6 @@ impl Listable for ListView<Files> {
|
||||||
Key::Char('K') => self.select_next_mtime(),
|
Key::Char('K') => self.select_next_mtime(),
|
||||||
Key::Char('k') => self.select_prev_mtime(),
|
Key::Char('k') => self.select_prev_mtime(),
|
||||||
Key::Char('d') => self.toggle_dirs_first(),
|
Key::Char('d') => self.toggle_dirs_first(),
|
||||||
Key::Char('!') => self.exec_cmd(),
|
|
||||||
_ => self.bad(Event::Key(key))
|
_ => self.bad(Event::Key(key))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -339,50 +338,6 @@ impl ListView<Files>
|
||||||
self.refresh();
|
self.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exec_cmd(&mut self) {
|
|
||||||
let selected_files = self.content.get_selected();
|
|
||||||
let file_names
|
|
||||||
= selected_files.iter().map(|f| f.name.clone()).collect::<Vec<String>>();
|
|
||||||
|
|
||||||
let cmd = self.minibuffer("exec:");
|
|
||||||
|
|
||||||
match cmd {
|
|
||||||
Ok(cmd) => {
|
|
||||||
self.show_status(&format!("Running: \"{}\"", &cmd));
|
|
||||||
|
|
||||||
let filename = self.selected_file().name.clone();
|
|
||||||
|
|
||||||
let cmd = if file_names.len() == 0 {
|
|
||||||
cmd.replace("$s", &format!("{}", &filename))
|
|
||||||
} else {
|
|
||||||
let args = file_names.iter().map(|f| {
|
|
||||||
format!(" \"{}\" ", f)
|
|
||||||
}).collect::<String>();
|
|
||||||
let clean_cmd = cmd.replace("$s", "");
|
|
||||||
|
|
||||||
clean_cmd + &args
|
|
||||||
};
|
|
||||||
|
|
||||||
let status = std::process::Command::new("sh")
|
|
||||||
.arg("-c")
|
|
||||||
.arg(&cmd)
|
|
||||||
.status();
|
|
||||||
let mut bufout = std::io::BufWriter::new(std::io::stdout());
|
|
||||||
write!(bufout, "{}{}",
|
|
||||||
termion::style::Reset,
|
|
||||||
termion::clear::All).unwrap();
|
|
||||||
|
|
||||||
match status {
|
|
||||||
Ok(status) => self.show_status(&format!("\"{}\" exited with {}",
|
|
||||||
cmd, status)),
|
|
||||||
Err(err) => self.show_status(&format!("Can't run this \"{}\": {}",
|
|
||||||
cmd, err)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(_) => self.show_status(""),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn find_file(&mut self) -> HResult<()> {
|
fn find_file(&mut self) -> HResult<()> {
|
||||||
let name = self.minibuffer("find")?;
|
let name = self.minibuffer("find")?;
|
||||||
let file = self.content.files.iter().find(|file| {
|
let file = self.content.files.iter().find(|file| {
|
||||||
|
|
|
@ -11,12 +11,13 @@ pub trait Tabbable {
|
||||||
fn get_tab_names(&self) -> Vec<Option<String>>;
|
fn get_tab_names(&self) -> Vec<Option<String>>;
|
||||||
fn active_tab(&self) -> &dyn Widget;
|
fn active_tab(&self) -> &dyn Widget;
|
||||||
fn active_tab_mut(&mut self) -> &mut dyn Widget;
|
fn active_tab_mut(&mut self) -> &mut dyn Widget;
|
||||||
|
fn on_key_sub(&mut self, key: Key);
|
||||||
fn on_key(&mut self, key: Key) {
|
fn on_key(&mut self, key: Key) {
|
||||||
match key {
|
match key {
|
||||||
Key::Ctrl('t') => { self.new_tab(); },
|
Key::Ctrl('t') => { self.new_tab(); },
|
||||||
Key::Ctrl('w') => self.close_tab(),
|
Key::Ctrl('w') => self.close_tab(),
|
||||||
Key::Char('\t') => self.next_tab(),
|
Key::Char('\t') => self.next_tab(),
|
||||||
_ => self.active_tab_mut().on_key(key)
|
_ => self.on_key_sub(key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue