diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index b2dac30d02..6b562aec23 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -1547,6 +1547,18 @@ impl Terminal { } } + pub fn select_word_at_event_position(&mut self, e: &MouseDownEvent) { + let position = e.position - self.last_content.terminal_bounds.bounds.origin; + let (point, side) = grid_point_and_side( + position, + self.last_content.terminal_bounds, + self.last_content.display_offset, + ); + let selection = Selection::new(SelectionType::Semantic, point, side); + self.events + .push_back(InternalEvent::SetSelection(Some((selection, point)))); + } + pub fn mouse_drag( &mut self, e: &MouseMoveEvent, diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index ee25792f35..c2dbc72b1f 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -1278,6 +1278,11 @@ impl Render for TerminalView { MouseButton::Right, cx.listener(|this, event: &MouseDownEvent, window, cx| { if !this.terminal.read(cx).mouse_mode(event.modifiers.shift) { + if this.terminal.read(cx).last_content.selection.is_none() { + this.terminal.update(cx, |terminal, _| { + terminal.select_word_at_event_position(event); + }); + }; this.deploy_context_menu(event.position, window, cx); cx.notify(); }