summaryrefslogtreecommitdiffstats
path: root/src/listview.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-01-25 23:34:48 +0100
committerrabite <rabite@posteo.de>2019-01-25 23:34:48 +0100
commitefb7e9e1676d2f2f07997c04055b60b545e20916 (patch)
tree0f25038d9df6c51da9e06bfa2798c7d962eae372 /src/listview.rs
parent878d7bdbfb8f277d7bcfc556599c995f72d7f319 (diff)
run commands
Diffstat (limited to 'src/listview.rs')
-rw-r--r--src/listview.rs25
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)); }
}
}