aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-core/src/selection.rs8
-rw-r--r--helix-core/src/transaction.rs5
-rw-r--r--helix-term/src/commands.rs6
-rw-r--r--helix-term/src/ui/editor.rs6
4 files changed, 14 insertions, 11 deletions
diff --git a/helix-core/src/selection.rs b/helix-core/src/selection.rs
index 87216fd9..9a93e667 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<Selection> {
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 000782dd..ce0174a6 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 5cb47485..a2f8d20a 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(), &regex);
+ // TODO: if select on matches returns empty range, we need to abort
+ let selection =
+ selection::select_on_matches(text, doc.selection(), &regex).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 9383d1e1..22e80623 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,
}] => {