diff options
author | rabite <rabite@posteo.de> | 2019-01-25 23:34:48 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-01-25 23:34:48 +0100 |
commit | efb7e9e1676d2f2f07997c04055b60b545e20916 (patch) | |
tree | 0f25038d9df6c51da9e06bfa2798c7d962eae372 /src/listview.rs | |
parent | 878d7bdbfb8f277d7bcfc556599c995f72d7f319 (diff) |
run commands
Diffstat (limited to 'src/listview.rs')
-rw-r--r-- | src/listview.rs | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/listview.rs b/src/listview.rs index 80cffdf..bd8f3a3 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -30,6 +30,7 @@ impl<T: 'static> ListView<T> where ListView<T>: Widget { }; view } + pub fn to_trait(self) -> Box<Widget> { Box::new(self) } @@ -170,6 +171,29 @@ impl ListView<Files> where self.refresh(); self.show_status(&format!("Direcories first: {}", self.content.dirs_first)); } + + fn exec_cmd(&mut self) { + match self.minibuffer("exec ($s for selected files)") { + Some(cmd) => { + let filename = self.selected_file().name.clone(); + let cmd = cmd.replace("$s", &filename); + self.show_status(&format!("Running: \"{}\"", &cmd)); + let mut parts = cmd.split_whitespace(); + let exe = parts.next().unwrap(); + let status = std::process::Command::new(exe).args(parts) + .status(); + match status { + Ok(status) => self.show_status(&format!("\"{}\" exited with {}", + cmd, + status)), + Err(err) => self.show_status(&format!("Can't run this \"{}\": {}", + cmd, + err)) + } + }, + None => self.show_status("") + } + } } @@ -248,6 +272,7 @@ impl Widget for ListView<Files> { }, Key::Char('s') => { self.cycle_sort() } , Key::Char('d') => self.toggle_dirs_first() , + Key::Char('!') => self.exec_cmd() , _ => { self.bad(Event::Key(key)); } } } |