expand $<num> to tab dir in exec command

This commit is contained in:
rabite 2019-02-26 01:28:56 +01:00
parent a1230fed0d
commit 16018ff604
3 changed files with 62 additions and 46 deletions

View File

@ -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 {

View File

@ -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| {

View 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)
}
}
}