diff options
author | spectre256 | 2023-06-16 19:13:23 +0000 |
---|---|---|
committer | GitHub | 2023-06-16 19:13:23 +0000 |
commit | d8b7232a475a7e79d86458096954b354fc4faeca (patch) | |
tree | 20f366b9f341ffb401f1d64ca9bb2c21455db655 | |
parent | 3fb9fafb2a366d004a04aa3d45d52e3ecfb57241 (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.
-rw-r--r-- | book/src/generated/typable-cmd.md | 1 | ||||
-rw-r--r-- | helix-term/src/commands.rs | 33 | ||||
-rw-r--r-- | helix-term/src/commands/typed.rs | 26 |
3 files changed, 60 insertions, 0 deletions
diff --git a/book/src/generated/typable-cmd.md b/book/src/generated/typable-cmd.md index 5fcafd5c..a3949960 100644 --- a/book/src/generated/typable-cmd.md +++ b/book/src/generated/typable-cmd.md @@ -31,6 +31,7 @@ | `:cquit`, `:cq` | Quit with exit code (default 1). Accepts an optional integer exit code (:cq 2). | | `:cquit!`, `:cq!` | Force quit with exit code (default 1) ignoring unsaved changes. Accepts an optional integer exit code (:cq! 2). | | `:theme` | Change the editor theme (show current theme if no name specified). | +| `:yank-join` | Yank joined selections. A separator can be provided as first argument. Default value is newline. | | `:clipboard-yank` | Yank main selection into system clipboard. | | `:clipboard-yank-join` | Yank joined selections into system clipboard. A separator can be provided as first argument. Default value is newline. | | `:primary-clipboard-yank` | Yank main selection into system primary clipboard. | 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.", |