summaryrefslogtreecommitdiffstats
path: root/src/file_browser.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-03-20 00:29:20 +0100
committerrabite <rabite@posteo.de>2019-03-20 00:29:20 +0100
commite36ddf34b4ede92e88c31207c114bea9c0a67f6d (patch)
tree6ad8386708963a834f1f08ed6a56042f04a98b5c /src/file_browser.rs
parent161ba5ac3f38733b45c0167cb1e29f0be6059775 (diff)
use osstring for filenames/paths
Diffstat (limited to 'src/file_browser.rs')
-rw-r--r--src/file_browser.rs75
1 files changed, 47 insertions, 28 deletions
diff --git a/src/file_browser.rs b/src/file_browser.rs
index 51bf72f..ce4a843 100644
--- a/src/file_browser.rs
+++ b/src/file_browser.rs
@@ -7,8 +7,9 @@ use std::sync::mpsc::{channel, Receiver, Sender};
use std::time::Duration;
use std::path::PathBuf;
use std::collections::HashMap;
+use std::ffi::{OsString, OsStr};
-use crate::files::{File, Files, ShortPaths};
+use crate::files::{File, Files, PathBufExt, OsStrTools};
use crate::listview::ListView;
use crate::miller_columns::MillerColumns;
use crate::widget::Widget;
@@ -131,13 +132,15 @@ impl Tabbable for TabView<FileBrowser> {
Key::Char('!') => {
let tab_dirs = self.widgets.iter().map(|w| w.cwd.clone())
.collect::<Vec<_>>();
- let selected_files = self.widgets.iter().fold(HashMap::new(),
- |mut f, w| {
- let dir = w.cwd().unwrap().clone();
- let selected_files = w.selected_files().unwrap();
- f.insert(dir, selected_files);
- f
- });
+ let selected_files = self
+ .widgets
+ .iter()
+ .map(|w| {
+ w.selected_files()
+ .map_err(|_| Vec::<Files>::new())
+ .unwrap()
+ }).collect();
+
self.widgets[self.active].exec_cmd(tab_dirs, selected_files)
}
_ => { self.active_tab_mut().on_key(key) }
@@ -633,39 +636,55 @@ impl FileBrowser {
fn exec_cmd(&mut self,
tab_dirs: Vec<File>,
- tab_files: HashMap<File, Vec<File>>) -> HResult<()> {
+ tab_files: Vec<Vec<File>>) -> HResult<()> {
let cwd = self.cwd()?;
- let filename = self.selected_file()?.name.clone();
+ let filename = self.selected_file()?.path.quoted_file_name()?;
let selected_files = self.selected_files()?;
- let file_names
- = selected_files.iter().map(|f| f.name.clone()).collect::<Vec<String>>();
+ let files = selected_files.iter()
+ .map(|f| f.path())
+ .collect::<Vec<PathBuf>>();
- let cmd = self.minibuffer("exec")?;
+ let cmd = self.minibuffer("exec")?.trim_start().to_string();
- self.show_status(&format!("Running: \"{}\"", &cmd)).log();
+ let cmd = OsString::from(cmd);
+ let space = OsString::from(" ");
- let mut cmd = if file_names.len() == 0 {
- cmd.replace("$s", &format!("{}", &filename))
+ let mut cmd = if files.len() == 0 {
+ cmd.replace(&OsString::from("$s"), &filename)
} else {
- let args = file_names.iter().map(|f| {
- format!(" \"{}\" ", f)
- }).collect::<String>();
- cmd.replace("$s", &args)
+ let args = files.iter()
+ .fold(OsString::new(), |mut args, file| {
+ if let Some(name) = file.quoted_file_name() {
+ args.push(name);
+ args.push(space.clone());
+ }
+ args
+ });
+ let args = args.trim_last_space();
+
+ cmd.replace(&OsString::from("$s"), &args)
};
for (i, tab_dir) in tab_dirs.iter().enumerate() {
- if let Some(tab_files) = tab_files.get(tab_dir) {
- let tab_file_identifier = format!("${}s", i);
- let args = tab_files.iter().map(|f| {
- let file_path = f.strip_prefix(&cwd);
- format!(" \"{}\" ", file_path.to_string_lossy())
- }).collect::<String>();
+ if let Some(tab_files) = tab_files.get(i) {
+ let tab_file_identifier = OsString::from(format!("${}s", i));
+
+ let args = tab_files.iter()
+ .fold(OsString::new(), |mut args, file| {
+ let file_path = file.strip_prefix(&cwd);
+ let name = file_path.quoted_path();
+ args.push(name);
+ args.push(space.clone());
+
+ args
+ });
+
cmd = cmd.replace(&tab_file_identifier, &args);
}
- let tab_identifier = format!("${}", i);
- let tab_path = tab_dir.path.to_string_lossy();
+ let tab_identifier = OsString::from(format!("${}", i));
+ let tab_path = tab_dir.path().into_os_string();
cmd = cmd.replace(&tab_identifier, &tab_path);
}