summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUros <59397844+uros-5@users.noreply.github.com>2023-08-12 14:53:45 +0200
committerGitHub <noreply@github.com>2023-08-12 08:53:45 -0400
commit98a72a030e12a0af020607ca57ffbdc7eeabdbc0 (patch)
tree34b117f469affa15ba88a639f56d0c06409536ea
parent0eec61eb82d10b8b9f76c8b5c9e2a0fae0514a1e (diff)
added all_selected field in CopyFilePath (#391)
* added all_selected field in CopyFilePath * copy_filepath now handle both cases
-rw-r--r--config/keymap.toml1
-rw-r--r--src/commands/file_ops.rs29
-rw-r--r--src/key_command/command.rs4
-rw-r--r--src/key_command/impl_appcommand.rs2
-rw-r--r--src/key_command/impl_appexecute.rs5
-rw-r--r--src/key_command/impl_comment.rs3
-rw-r--r--src/key_command/impl_from_str.rs17
7 files changed, 47 insertions, 14 deletions
diff --git a/config/keymap.toml b/config/keymap.toml
index 8a9f371..ca8bce4 100644
--- a/config/keymap.toml
+++ b/config/keymap.toml
@@ -70,6 +70,7 @@ keymap = [
{ keys = ["y", "n"], command = "copy_filename" },
{ keys = ["y", "."], command = "copy_filename_without_extension" },
{ keys = ["y", "p"], command = "copy_filepath" },
+ { keys = ["y", "a"], command = "copy_filepath --all-selected=true" },
{ keys = ["y", "d"], command = "copy_dirpath" },
{ keys = ["p", "l"], command = "symlink_files --relative=false" },
diff --git a/src/commands/file_ops.rs b/src/commands/file_ops.rs
index 7107301..e9d889a 100644
--- a/src/commands/file_ops.rs
+++ b/src/commands/file_ops.rs
@@ -86,15 +86,26 @@ pub fn copy_filename_without_extension(context: &mut AppContext) -> JoshutoResul
Ok(())
}
-pub fn copy_filepath(context: &mut AppContext) -> JoshutoResult {
- let entry_file_path = context
- .tab_context_ref()
- .curr_tab_ref()
- .curr_list_ref()
- .and_then(|c| c.curr_entry_ref())
- .and_then(|entry| entry.file_path().to_str())
- .map(|s| s.to_string());
-
+pub fn copy_filepath(context: &mut AppContext, all: bool) -> JoshutoResult {
+ let selected = context.tab_context_ref().curr_tab_ref().curr_list_ref();
+ let entry_file_path = {
+ if all {
+ selected.map(|c| c.get_selected_paths()).and_then(|sel| {
+ sel.into_iter().try_fold(String::new(), |mut acc, x| {
+ if let Some(s) = x.to_str() {
+ acc.push_str(s);
+ acc.push('\n');
+ }
+ Some(acc)
+ })
+ })
+ } else {
+ selected
+ .and_then(|c| c.curr_entry_ref())
+ .and_then(|entry| entry.file_path().to_str())
+ .map(|s| s.to_string())
+ }
+ };
if let Some(file_path) = entry_file_path {
copy_string_to_buffer(file_path)?;
}
diff --git a/src/key_command/command.rs b/src/key_command/command.rs
index b3bfc7e..9d20b11 100644
--- a/src/key_command/command.rs
+++ b/src/key_command/command.rs
@@ -28,7 +28,9 @@ pub enum Command {
CopyFiles,
CopyFileName,
CopyFileNameWithoutExtension,
- CopyFilePath,
+ CopyFilePath {
+ all_selected: bool,
+ },
CopyDirPath,
SymlinkFiles {
relative: bool,
diff --git a/src/key_command/impl_appcommand.rs b/src/key_command/impl_appcommand.rs
index 3215f76..8934d1c 100644
--- a/src/key_command/impl_appcommand.rs
+++ b/src/key_command/impl_appcommand.rs
@@ -25,7 +25,7 @@ impl AppCommand for Command {
Self::CopyFiles => CMD_COPY_FILES,
Self::CopyFileName => CMD_COPY_FILENAME,
Self::CopyFileNameWithoutExtension => CMD_COPY_FILENAME_WITHOUT_EXTENSION,
- Self::CopyFilePath => CMD_COPY_FILEPATH,
+ Self::CopyFilePath { .. } => CMD_COPY_FILEPATH,
Self::CopyDirPath => CMD_COPY_DIRECTORY_PATH,
Self::SymlinkFiles { .. } => CMD_SYMLINK_FILES,
Self::PasteFiles { .. } => CMD_PASTE_FILES,
diff --git a/src/key_command/impl_appexecute.rs b/src/key_command/impl_appexecute.rs
index 7616fb3..6238f0d 100644
--- a/src/key_command/impl_appexecute.rs
+++ b/src/key_command/impl_appexecute.rs
@@ -41,7 +41,10 @@ impl AppExecute for Command {
Self::CopyFileNameWithoutExtension => {
file_ops::copy_filename_without_extension(context)
}
- Self::CopyFilePath => file_ops::copy_filepath(context),
+ Self::CopyFilePath {
+ all_selected: false,
+ } => file_ops::copy_filepath(context, false),
+ Self::CopyFilePath { all_selected: true } => file_ops::copy_filepath(context, true),
Self::CopyDirPath => file_ops::copy_dirpath(context),
Self::SymlinkFiles { relative: true } => file_ops::symlink_relative(context),
Self::SymlinkFiles { relative: false } => file_ops::symlink_absolute(context),
diff --git a/src/key_command/impl_comment.rs b/src/key_command/impl_comment.rs
index 4635cdf..ee4a759 100644
--- a/src/key_command/impl_comment.rs
+++ b/src/key_command/impl_comment.rs
@@ -40,7 +40,8 @@ impl CommandComment for Command {
Self::CopyFiles => "Copy selected files",
Self::CopyFileName => "Copy filename",
Self::CopyFileNameWithoutExtension => "Copy filename without extension",
- Self::CopyFilePath => "Copy path to file",
+ Self::CopyFilePath { all_selected: true } => "Copy all selected paths to file",
+ Self::CopyFilePath { .. } => "Copy path to file",
Self::CopyDirPath => "Copy directory name",
Self::SymlinkFiles { .. } => "Symlink selected files",
diff --git a/src/key_command/impl_from_str.rs b/src/key_command/impl_from_str.rs
index be0ce01..b00008b 100644
--- a/src/key_command/impl_from_str.rs
+++ b/src/key_command/impl_from_str.rs
@@ -74,7 +74,7 @@ impl std::str::FromStr for Command {
CMD_COPY_FILENAME_WITHOUT_EXTENSION,
Self::CopyFileNameWithoutExtension
);
- simple_command_conversion_case!(command, CMD_COPY_FILEPATH, Self::CopyFilePath);
+ // simple_command_conversion_case!(command, CMD_COPY_FILEPATH, Self::CopyFilePath);
simple_command_conversion_case!(command, CMD_COPY_DIRECTORY_PATH, Self::CopyDirPath);
simple_command_conversion_case!(command, CMD_OPEN_FILE, Self::OpenFile);
@@ -230,6 +230,21 @@ impl std::str::FromStr for Command {
}
}
Ok(Self::SymlinkFiles { relative })
+ } else if command == CMD_COPY_FILEPATH {
+ let mut all_selected = false;
+ for arg in arg.split_whitespace() {
+ match arg {
+ "--all-selected=true" => all_selected = true,
+ "" => all_selected = false,
+ _ => {
+ return Err(JoshutoError::new(
+ JoshutoErrorKind::UnrecognizedArgument,
+ format!("{}: unknown option '{}'", command, arg),
+ ));
+ }
+ }
+ }
+ Ok(Self::CopyFilePath { all_selected })
} else if command == CMD_PASTE_FILES {
let mut options = FileOperationOptions::default();
for arg in arg.split_whitespace() {