diff --git a/src/file_browser.rs b/src/file_browser.rs index d82e13f..3095135 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -54,6 +54,17 @@ impl Tabbable for TabView { 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::>(); + 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) -> 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::>(); + + 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::(); + 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 { diff --git a/src/listview.rs b/src/listview.rs index 3633dfe..271631a 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -53,7 +53,6 @@ impl Listable for ListView { 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 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::>(); - - 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::(); - 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| { diff --git a/src/tabview.rs b/src/tabview.rs index 675ba66..b16a251 100644 --- a/src/tabview.rs +++ b/src/tabview.rs @@ -11,12 +11,13 @@ pub trait Tabbable { fn get_tab_names(&self) -> Vec>; 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) } } }