on master help sign in
Better fix for w/e that also covers `ia<esc>we`/`ia<esc>wb`
f4560cbBlaž Hrastnik
helix-core/src/movement.rs+12−8
@@ -64,7 +64,7 @@ pub fn move_next_word_start(slice: RopeSlice, mut begin: usize, count: usize) ->
64 let mut end = begin;
64 let mut end = begin;
65
65
66 for _ in 0..count {
66 for _ in 0..count {
67− if begin + 2 > slice.len_chars() {
67+ if begin + 1 == slice.len_chars() {
68 return None;
68 return None;
69 }
69 }
70
70
@@ -76,8 +76,9 @@ pub fn move_next_word_start(slice: RopeSlice, mut begin: usize, count: usize) ->
76 begin += 1;
76 begin += 1;
77 }
77 }
78
78
79− // return if not skip while?
80− skip_over_next(slice, &mut begin, |ch| ch == '\n');
79+ if !skip_over_next(slice, &mut begin, |ch| ch == '\n') {
80+ return None;
81+ };
81 ch = slice.char(begin);
82 ch = slice.char(begin);
82
83
83 end = begin + 1;
84 end = begin + 1;
@@ -134,7 +135,7 @@ pub fn move_next_word_end(slice: RopeSlice, mut begin: usize, count: usize) -> O
134 let mut end = begin;
135 let mut end = begin;
135
136
136 for _ in 0..count {
137 for _ in 0..count {
137− if begin + 2 > slice.len_chars() {
138+ if begin + 2 >= slice.len_chars() {
138 return None;
139 return None;
139 }
140 }
140
141
@@ -145,8 +146,9 @@ pub fn move_next_word_end(slice: RopeSlice, mut begin: usize, count: usize) -> O
145 begin += 1;
146 begin += 1;
146 }
147 }
147
148
148− // return if not skip while?
149− skip_over_next(slice, &mut begin, |ch| ch == '\n');
149+ if !skip_over_next(slice, &mut begin, |ch| ch == '\n') {
150+ return None;
151+ };
150
152
151 end = begin;
153 end = begin;
152
154
@@ -199,18 +201,20 @@ fn categorize(ch: char) -> Category {
199}
201}
200
202
201#[inline]
203#[inline]
204+/// Returns true if there are more characters left after the new position.
202−pub fn skip_over_next<F>(slice: RopeSlice, pos: &mut usize, fun: F)
205+pub fn skip_over_next<F>(slice: RopeSlice, pos: &mut usize, fun: F) -> bool
203where
206where
204 F: Fn(char) -> bool,
207 F: Fn(char) -> bool,
205{
208{
206 let mut chars = slice.chars_at(*pos);
209 let mut chars = slice.chars_at(*pos);
207
210
208− for ch in chars {
211+ while let Some(ch) = chars.next() {
209 if !fun(ch) {
212 if !fun(ch) {
210 break;
213 break;
211 }
214 }
212 *pos += 1;
215 *pos += 1;
213 }
216 }
217+ chars.next().is_some()
214}
218}
215
219
216#[inline]
220#[inline]