From c23d30c08ddfea5b57c288ad4f968bb485cd6f3f 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 425280d58b..959c53e48e 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 })