mirror of https://github.com/helix-editor/helix
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.pull/7357/head
parent
3fb9fafb2a
commit
d8b7232a47
|
@ -31,6 +31,7 @@
|
||||||
| `:cquit`, `:cq` | Quit with exit code (default 1). Accepts an optional integer exit code (:cq 2). |
|
| `: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). |
|
| `: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). |
|
| `: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` | 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. |
|
| `: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. |
|
| `:primary-clipboard-yank` | Yank main selection into system primary clipboard. |
|
||||||
|
|
|
@ -376,6 +376,7 @@ impl MappableCommand {
|
||||||
later, "Move forward in history",
|
later, "Move forward in history",
|
||||||
commit_undo_checkpoint, "Commit changes to new checkpoint",
|
commit_undo_checkpoint, "Commit changes to new checkpoint",
|
||||||
yank, "Yank selection",
|
yank, "Yank selection",
|
||||||
|
yank_joined, "Join and yank selections",
|
||||||
yank_joined_to_clipboard, "Join and yank selections to clipboard",
|
yank_joined_to_clipboard, "Join and yank selections to clipboard",
|
||||||
yank_main_selection_to_clipboard, "Yank main selection to clipboard",
|
yank_main_selection_to_clipboard, "Yank main selection to clipboard",
|
||||||
yank_joined_to_primary_clipboard, "Join and yank selections to primary 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);
|
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(
|
fn yank_joined_to_clipboard_impl(
|
||||||
editor: &mut Editor,
|
editor: &mut Editor,
|
||||||
separator: &str,
|
separator: &str,
|
||||||
|
|
|
@ -895,6 +895,25 @@ fn yank_main_selection_to_clipboard(
|
||||||
yank_main_selection_to_clipboard_impl(cx.editor, ClipboardType::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(
|
fn yank_joined_to_clipboard(
|
||||||
cx: &mut compositor::Context,
|
cx: &mut compositor::Context,
|
||||||
args: &[Cow<str>],
|
args: &[Cow<str>],
|
||||||
|
@ -2474,6 +2493,13 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
|
||||||
fun: theme,
|
fun: theme,
|
||||||
signature: CommandSignature::positional(&[completers::theme]),
|
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 {
|
TypableCommand {
|
||||||
name: "clipboard-yank",
|
name: "clipboard-yank",
|
||||||
aliases: &[],
|
aliases: &[],
|
||||||
|
|
Loading…
Reference in New Issue