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) {
|
||||
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 {
|
||||
|
@ -238,6 +249,55 @@ impl FileBrowser {
|
|||
}
|
||||
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 {
|
||||
|
|
|
@ -53,7 +53,6 @@ impl Listable for ListView<Files> {
|
|||
Key::Char('K') => self.select_next_mtime(),
|
||||
Key::Char('k') => self.select_prev_mtime(),
|
||||
Key::Char('d') => self.toggle_dirs_first(),
|
||||
Key::Char('!') => self.exec_cmd(),
|
||||
_ => self.bad(Event::Key(key))
|
||||
}
|
||||
}
|
||||
|
@ -339,50 +338,6 @@ impl ListView<Files>
|
|||
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<()> {
|
||||
let name = self.minibuffer("find")?;
|
||||
let file = self.content.files.iter().find(|file| {
|
||||
|
|
|
@ -11,12 +11,13 @@ pub trait Tabbable {
|
|||
fn get_tab_names(&self) -> Vec<Option<String>>;
|
||||
fn active_tab(&self) -> &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) {
|
||||
match key {
|
||||
Key::Ctrl('t') => { self.new_tab(); },
|
||||
Key::Ctrl('w') => self.close_tab(),
|
||||
Key::Char('\t') => self.next_tab(),
|
||||
_ => self.active_tab_mut().on_key(key)
|
||||
_ => self.on_key_sub(key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue