From 4983b01c8918209bcd0e3affdd5873c2aae7f7f3 Mon Sep 17 00:00:00 2001 From: fantacell Date: Thu, 26 Jun 2025 20:25:47 +0200 Subject: [PATCH] helix: Change word motions (#33408) When starting on the newline character at the end of a line the helix word motions select that character, unlike in helix itself. This makes it easy to accidentaly join two lines together. Also, word motions that go backwards should stop at the start of a line. I added that. Release Notes: - helix: Fix edge-cases with word motions and newlines --- crates/vim/src/helix.rs | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/crates/vim/src/helix.rs b/crates/vim/src/helix.rs index 425280d58bd50ae73a39362bd635f28f1630eb44..959c53e48ef4e41bf9f8fa0df56bbb79268caf99 100644 --- a/crates/vim/src/helix.rs +++ b/crates/vim/src/helix.rs @@ -188,10 +188,10 @@ impl Vim { self.helix_find_range_forward(times, window, cx, |left, right, classifier| { let left_kind = classifier.kind_with(left, ignore_punctuation); let right_kind = classifier.kind_with(right, ignore_punctuation); - let at_newline = right == '\n'; + let at_newline = (left == '\n') ^ (right == '\n'); - let found = - left_kind != right_kind && right_kind != CharKind::Whitespace || at_newline; + let found = (left_kind != right_kind && right_kind != CharKind::Whitespace) + || at_newline; found }) @@ -200,10 +200,10 @@ impl Vim { self.helix_find_range_forward(times, window, cx, |left, right, classifier| { let left_kind = classifier.kind_with(left, ignore_punctuation); let right_kind = classifier.kind_with(right, ignore_punctuation); - let at_newline = right == '\n'; + let at_newline = (left == '\n') ^ (right == '\n'); - let found = left_kind != right_kind - && (left_kind != CharKind::Whitespace || at_newline); + let found = (left_kind != right_kind && left_kind != CharKind::Whitespace) + || at_newline; found }) @@ -212,10 +212,10 @@ impl Vim { self.helix_find_range_backward(times, window, cx, |left, right, classifier| { let left_kind = classifier.kind_with(left, ignore_punctuation); let right_kind = classifier.kind_with(right, ignore_punctuation); - let at_newline = right == '\n'; + let at_newline = (left == '\n') ^ (right == '\n'); - let found = left_kind != right_kind - && (left_kind != CharKind::Whitespace || at_newline); + let found = (left_kind != right_kind && left_kind != CharKind::Whitespace) + || at_newline; found }) @@ -224,11 +224,10 @@ impl Vim { self.helix_find_range_backward(times, window, cx, |left, right, classifier| { let left_kind = classifier.kind_with(left, ignore_punctuation); let right_kind = classifier.kind_with(right, ignore_punctuation); - let at_newline = right == '\n'; + let at_newline = (left == '\n') ^ (right == '\n'); - let found = left_kind != right_kind - && right_kind != CharKind::Whitespace - && !at_newline; + let found = (left_kind != right_kind && right_kind != CharKind::Whitespace) + || at_newline; found })