From 95dd55ba943f3667bac3acecb2c65ee7f69d42cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Hrastnik?= Date: Sat, 10 Apr 2021 12:01:49 +0900 Subject: [PATCH] Fix overlap calculation. --- helix-core/src/selection.rs | 17 ++++++++++------- helix-term/src/commands.rs | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/helix-core/src/selection.rs b/helix-core/src/selection.rs index ca1a6d32..dfd95bdd 100644 --- a/helix-core/src/selection.rs +++ b/helix-core/src/selection.rs @@ -59,11 +59,12 @@ impl Range { #[must_use] pub fn overlaps(&self, other: &Self) -> bool { // cursor overlap is checked differently - // if self.is_empty() { - // self.from() <= other.to() - // } else { - self.to() >= other.from() && other.to() >= self.from() - // } + if self.is_empty() { + let pos = self.head; + pos >= other.from() && other.to() >= pos + } else { + self.to() > other.from() && other.to() > self.from() + } } pub fn contains(&self, pos: usize) -> bool { @@ -159,13 +160,12 @@ impl Selection { } } - pub fn add(mut self, range: Range) -> Self { + pub fn push(mut self, range: Range) -> Self { let index = self.ranges.len(); self.ranges.push(range); Self::normalize(self.ranges, index) } - // add_range // push // replace_range /// Map selections over a set of changes. Useful for adjusting the selection position after @@ -223,6 +223,9 @@ impl Selection { // if previous value exists if let Some(prev) = result.last_mut() { // and we overlap it + + // TODO: we used to simply check range.from() <(=) prev.to() + // avoiding two comparisons if range.overlaps(prev) { let from = prev.from(); let to = std::cmp::max(range.to(), prev.to()); diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index b6ae0138..d75cb6ff 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -622,7 +622,7 @@ fn _search(doc: &mut Document, view_id: ViewId, contents: &str, regex: &Regex, e let end = text.byte_to_char(mat.end()); let selection = if extend { - selection.clone().add(Range::new(start, end - 1)) + selection.clone().push(Range::new(start, end - 1)) } else { Selection::single(start, end - 1) };