diff --git a/helix-core/src/selection.rs b/helix-core/src/selection.rs index 87216fd95..9a93e667b 100644 --- a/helix-core/src/selection.rs +++ b/helix-core/src/selection.rs @@ -278,7 +278,7 @@ pub fn select_on_matches( text: &RopeSlice, selections: &Selection, regex: &crate::regex::Regex, -) -> Selection { +) -> Option { let mut result = SmallVec::with_capacity(selections.ranges().len()); for sel in selections.ranges() { @@ -300,7 +300,11 @@ pub fn select_on_matches( } // TODO: figure out a new primary index - Selection::new(result, 0) + if !result.is_empty() { + return Some(Selection::new(result, 0)); + } + + None } // TODO: support to split on capture #N instead of whole match diff --git a/helix-core/src/transaction.rs b/helix-core/src/transaction.rs index 000782ddb..ce0174a61 100644 --- a/helix-core/src/transaction.rs +++ b/helix-core/src/transaction.rs @@ -314,10 +314,7 @@ impl ChangeSet { /// `true` when the set is empty. #[inline] pub fn is_empty(&self) -> bool { - match self.changes.as_slice() { - [] | [Operation::Retain(_)] => true, - _ => false, - } + matches!(self.changes.as_slice(), [] | [Operation::Retain(_)]) } /// Map a position through the changes. diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 5cb474854..a2f8d20aa 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -193,7 +193,7 @@ pub fn check_cursor_in_view(view: &View) -> bool { let line = doc.text().char_to_line(cursor); let document_end = view.first_line + view.area.height.saturating_sub(1) as usize; - if (line > document_end.saturating_sub(PADDING)) | (line < view.first_line + PADDING) { + if (line > document_end.saturating_sub(PADDING)) || (line < view.first_line + PADDING) { return false; } true @@ -304,7 +304,9 @@ pub fn select_all(cx: &mut Context) { pub fn select_regex(cx: &mut Context) { let prompt = ui::regex_prompt(cx, "select:".to_string(), |doc, regex| { let text = &doc.text().slice(..); - let selection = selection::select_on_matches(text, doc.selection(), ®ex); + // TODO: if select on matches returns empty range, we need to abort + let selection = + selection::select_on_matches(text, doc.selection(), ®ex).expect("no matches"); doc.set_selection(selection); }); cx.callback = Some(Box::new( diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 9383d1e13..22e806232 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -77,7 +77,7 @@ impl EditorView { let range = { // calculate viewport byte ranges let start = text.line_to_byte(view.first_line); - let end = text.line_to_byte(last_line) + text.line(last_line).len_bytes(); + let end = text.line_to_byte(last_line + 1); // TODO: double check start..end }; @@ -381,8 +381,8 @@ impl Component for EditorView { } } mode => { - match keys.as_slice() { - &[KeyEvent { + match *keys.as_slice() { + [KeyEvent { code: KeyCode::Char(i @ '0'..='9'), modifiers: KeyModifiers::NONE, }] => {