From 7d51805e94a461834ce34e0829da5859d1f9db32 Mon Sep 17 00:00:00 2001 From: Dmitry Sharshakov Date: Thu, 12 Aug 2021 05:53:48 +0300 Subject: Support primary clipboard (#548) * clipboard-none: add in-memory fallback buffer Signed-off-by: Dmitry Sharshakov * view: add Wayland primary clipboard Signed-off-by: Dmitry Sharshakov * Format Signed-off-by: Dmitry Sharshakov * helix-term: copy to primary selection after mouse move stops Signed-off-by: Dmitry Sharshakov * helix-term: don't update primary selection if it is a single character Signed-off-by: Dmitry Sharshakov * helix-term: discard result of setting primary selection Signed-off-by: Dmitry Sharshakov * helix-term: add commands for interaction with primary clipboard Signed-off-by: Dmitry Sharshakov * editor: implement primary selection copy/paste using commands Signed-off-by: Dmitry Sharshakov * clipboard: support xsel for primary selection Signed-off-by: Dmitry Sharshakov * clipboard: support xclip for primary selection Signed-off-by: Dmitry Sharshakov * helix-term: multiple cursor support for middle click paste Signed-off-by: Dmitry Sharshakov * rename primary selection to primary clipboard in scope of PR Signed-off-by: Dmitry Sharshakov * helix-term: make middle click paste optional Signed-off-by: Dmitry Sharshakov * Format Signed-off-by: Dmitry Sharshakov * Update helix-term/src/ui/editor.rs * fix formatting Signed-off-by: Dmitry Sharshakov * config: correct defaults if terminal prop is not set Signed-off-by: Dmitry Sharshakov * refactor: merge clipboard and primary selection implementations Signed-off-by: Dmitry Sharshakov * Tidy up code Signed-off-by: Dmitry Sharshakov * view: remove names for different clipboard/selection providers Signed-off-by: Dmitry Sharshakov * Update helix-view/src/clipboard.rs Co-authored-by: Gokul Soumya * helix-view: tidy macros Signed-off-by: Dmitry Sharshakov * helix-term: refactor paste-replace commands Signed-off-by: Dmitry Sharshakov * helix-term: use new config for middle-click-paste Signed-off-by: Dmitry Sharshakov * clipboard: remove memory fallback for command and windows providers Signed-off-by: Dmitry Sharshakov * clipboard-win: fix build Signed-off-by: Dmitry Sharshakov * clipboard: return empty string when primary clipboard is missing Signed-off-by: Dmitry Sharshakov * clipboard: fix errors in Windows build Signed-off-by: Dmitry Sharshakov Co-authored-by: Gokul Soumya --- helix-term/src/ui/editor.rs | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'helix-term/src/ui') diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index aa21a389..96a4afe8 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -785,6 +785,61 @@ impl EditorView { EventResult::Consumed(None) } + + MouseEvent { + kind: MouseEventKind::Up(MouseButton::Left), + .. + } => { + if !cxt.editor.config.middle_click_paste { + return EventResult::Ignored; + } + + let (view, doc) = current!(cxt.editor); + let range = doc.selection(view.id).primary(); + + if range.to() - range.from() <= 1 { + return EventResult::Ignored; + } + + commands::Command::yank_main_selection_to_primary_clipboard.execute(cxt); + + EventResult::Consumed(None) + } + + MouseEvent { + kind: MouseEventKind::Up(MouseButton::Middle), + row, + column, + modifiers, + .. + } => { + let editor = &mut cxt.editor; + if !editor.config.middle_click_paste { + return EventResult::Ignored; + } + + if modifiers == crossterm::event::KeyModifiers::ALT { + commands::Command::replace_selections_with_primary_clipboard.execute(cxt); + + return EventResult::Consumed(None); + } + + let result = editor.tree.views().find_map(|(view, _focus)| { + view.pos_at_screen_coords(&editor.documents[view.doc], row, column) + .map(|pos| (pos, view.id)) + }); + + if let Some((pos, view_id)) = result { + let doc = &mut editor.documents[editor.tree.get(view_id).doc]; + doc.set_selection(view_id, Selection::point(pos)); + editor.tree.focus = view_id; + commands::Command::paste_primary_clipboard_before.execute(cxt); + return EventResult::Consumed(None); + } + + EventResult::Ignored + } + _ => EventResult::Ignored, } } -- cgit v1.2.3-70-g09d2