aboutsummaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
authorspectre2562023-06-16 19:13:23 +0000
committerGitHub2023-06-16 19:13:23 +0000
commitd8b7232a475a7e79d86458096954b354fc4faeca (patch)
tree20f366b9f341ffb401f1d64ca9bb2c21455db655 /helix-term
parent3fb9fafb2a366d004a04aa3d45d52e3ecfb57241 (diff)
Add yank_joined command (#7195)
Resolves issue #6888 by adding a command to join all selections and yank them to the specified register. The typed command takes an argument as the separator to use when joining the selections.
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/commands.rs33
-rw-r--r--helix-term/src/commands/typed.rs26
2 files changed, 59 insertions, 0 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index b7a22c7b..5fb4a70e 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -376,6 +376,7 @@ impl MappableCommand {
later, "Move forward in history",
commit_undo_checkpoint, "Commit changes to new checkpoint",
yank, "Yank selection",
+ yank_joined, "Join and yank selections",
yank_joined_to_clipboard, "Join and yank selections to clipboard",
yank_main_selection_to_clipboard, "Yank main selection to clipboard",
yank_joined_to_primary_clipboard, "Join and yank selections to primary clipboard",
@@ -3724,6 +3725,38 @@ fn yank(cx: &mut Context) {
exit_select_mode(cx);
}
+fn yank_joined_impl(editor: &mut Editor, separator: &str, register: char) {
+ let (view, doc) = current!(editor);
+ let text = doc.text().slice(..);
+
+ let selection = doc.selection(view.id);
+ let joined = selection
+ .fragments(text)
+ .fold(String::new(), |mut acc, fragment| {
+ if !acc.is_empty() {
+ acc.push_str(separator);
+ }
+ acc.push_str(&fragment);
+ acc
+ });
+
+ let msg = format!(
+ "joined and yanked {} selection(s) to register {}",
+ selection.len(),
+ register,
+ );
+
+ editor.registers.write(register, vec![joined]);
+ editor.set_status(msg);
+}
+
+fn yank_joined(cx: &mut Context) {
+ let line_ending = doc!(cx.editor).line_ending;
+ let register = cx.register.unwrap_or('"');
+ yank_joined_impl(cx.editor, line_ending.as_str(), register);
+ exit_select_mode(cx);
+}
+
fn yank_joined_to_clipboard_impl(
editor: &mut Editor,
separator: &str,
diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs
index 80beab31..5198e5bd 100644
--- a/helix-term/src/commands/typed.rs
+++ b/helix-term/src/commands/typed.rs
@@ -895,6 +895,25 @@ fn yank_main_selection_to_clipboard(
yank_main_selection_to_clipboard_impl(cx.editor, ClipboardType::Clipboard)
}
+fn yank_joined(
+ cx: &mut compositor::Context,
+ args: &[Cow<str>],
+ event: PromptEvent,
+) -> anyhow::Result<()> {
+ if event != PromptEvent::Validate {
+ return Ok(());
+ }
+
+ ensure!(args.len() <= 1, ":yank-join takes at most 1 argument");
+
+ let doc = doc!(cx.editor);
+ let default_sep = Cow::Borrowed(doc.line_ending.as_str());
+ let separator = args.first().unwrap_or(&default_sep);
+ let register = cx.editor.selected_register.unwrap_or('"');
+ yank_joined_impl(cx.editor, separator, register);
+ Ok(())
+}
+
fn yank_joined_to_clipboard(
cx: &mut compositor::Context,
args: &[Cow<str>],
@@ -2475,6 +2494,13 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
signature: CommandSignature::positional(&[completers::theme]),
},
TypableCommand {
+ name: "yank-join",
+ aliases: &[],
+ doc: "Yank joined selections. A separator can be provided as first argument. Default value is newline.",
+ fun: yank_joined,
+ signature: CommandSignature::none(),
+ },
+ TypableCommand {
name: "clipboard-yank",
aliases: &[],
doc: "Yank main selection into system clipboard.",