diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index 450ca35b449e6531e702a13422b0d333df7333d4..3a64cff24f870eab763addb8936daa14e285fda3 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -89,7 +89,7 @@ pub enum Event { Wakeup, BlinkChanged, SelectionsChanged, - NewNavigationTarget(MaybeNavigationTarget), + NewNavigationTarget(Option), Open(MaybeNavigationTarget), } @@ -507,7 +507,7 @@ impl TerminalBuilder { next_link_id: 0, selection_phase: SelectionPhase::Ended, cmd_pressed: false, - found_word: false, + hovered_word: false, }; Ok(TerminalBuilder { @@ -660,7 +660,7 @@ pub struct Terminal { next_link_id: usize, selection_phase: SelectionPhase, cmd_pressed: bool, - found_word: bool, + hovered_word: bool, } impl Terminal { @@ -882,23 +882,31 @@ impl Terminal { None }; - self.found_word = found_word.is_some(); - if let Some((maybe_url_or_path, is_url, url_match)) = found_word { - if *open { - let target = if is_url { - MaybeNavigationTarget::Url(maybe_url_or_path) + match found_word { + Some((maybe_url_or_path, is_url, url_match)) => { + if *open { + let target = if is_url { + MaybeNavigationTarget::Url(maybe_url_or_path) + } else { + MaybeNavigationTarget::PathLike(maybe_url_or_path) + }; + cx.emit(Event::Open(target)); } else { - MaybeNavigationTarget::PathLike(maybe_url_or_path) - }; - cx.emit(Event::Open(target)); - } else { - self.update_selected_word( - prev_hovered_word, - url_match, - maybe_url_or_path, - is_url, - cx, - ); + self.update_selected_word( + prev_hovered_word, + url_match, + maybe_url_or_path, + is_url, + cx, + ); + } + self.hovered_word = true; + } + None => { + if self.hovered_word { + cx.emit(Event::NewNavigationTarget(None)); + } + self.hovered_word = false; } } } @@ -934,7 +942,7 @@ impl Terminal { } else { MaybeNavigationTarget::PathLike(word) }; - cx.emit(Event::NewNavigationTarget(navigation_target)); + cx.emit(Event::NewNavigationTarget(Some(navigation_target))); } fn next_link_id(&mut self) -> usize { @@ -1018,6 +1026,9 @@ impl Terminal { pub fn try_modifiers_change(&mut self, modifiers: &Modifiers) -> bool { let changed = self.cmd_pressed != modifiers.cmd; + if !self.cmd_pressed && modifiers.cmd { + self.refresh_hovered_word(); + } self.cmd_pressed = modifiers.cmd; changed } @@ -1394,7 +1405,7 @@ impl Terminal { } pub fn can_navigate_to_selected_word(&self) -> bool { - self.cmd_pressed && self.found_word + self.cmd_pressed && self.hovered_word } } diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index 3f4101d16c3a51bec32411bc8cae78922cc52d56..cdb1d40efcfbaaf8b8a710cd11bd03d2f3ec9950 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -172,10 +172,11 @@ impl TerminalView { } Event::NewNavigationTarget(maybe_navigation_target) => { this.can_navigate_to_selected_word = match maybe_navigation_target { - MaybeNavigationTarget::Url(_) => true, - MaybeNavigationTarget::PathLike(maybe_path) => { + Some(MaybeNavigationTarget::Url(_)) => true, + Some(MaybeNavigationTarget::PathLike(maybe_path)) => { !possible_open_targets(&workspace, maybe_path, cx).is_empty() } + None => false, } } Event::Open(maybe_navigation_target) => match maybe_navigation_target {