diff --git a/crates/editor/src/movement.rs b/crates/editor/src/movement.rs index a090d8dde2..9c87ca3016 100644 --- a/crates/editor/src/movement.rs +++ b/crates/editor/src/movement.rs @@ -151,17 +151,14 @@ pub fn previous_word_start(map: &DisplaySnapshot, mut point: DisplayPoint) -> Di let mut boundary = DisplayPoint::new(point.row(), 0); let mut column = 0; - let mut prev_char_kind = CharKind::Newline; + let mut prev_char_kind = CharKind::Whitespace; for c in map.chars_at(DisplayPoint::new(point.row(), 0)) { if column >= point.column() { break; } let char_kind = char_kind(c); - if char_kind != prev_char_kind - && char_kind != CharKind::Whitespace - && char_kind != CharKind::Newline - { + if char_kind != prev_char_kind && char_kind != CharKind::Whitespace && c != '\n' { *boundary.column_mut() = column; } @@ -179,10 +176,7 @@ pub fn next_word_end(map: &DisplaySnapshot, mut point: DisplayPoint) -> DisplayP if c == '\n' { break; } - if prev_char_kind != char_kind - && prev_char_kind != CharKind::Whitespace - && prev_char_kind != CharKind::Newline - { + if prev_char_kind != char_kind && prev_char_kind != CharKind::Whitespace { break; } } @@ -441,7 +435,7 @@ mod tests { .select_font(family_id, &Default::default()) .unwrap(); let font_size = 14.0; - let buffer = MultiBuffer::build_simple("lorem ipsum dolor\n sit", cx); + let buffer = MultiBuffer::build_simple("lorem ipsum dolor\n sit\n\n\n\n", cx); let display_map = cx .add_model(|cx| DisplayMap::new(buffer, tab_size, font_id, font_size, None, 1, 1, cx)); let snapshot = display_map.update(cx, |map, cx| map.snapshot(cx)); @@ -502,5 +496,11 @@ mod tests { surrounding_word(&snapshot, DisplayPoint::new(1, 7)), DisplayPoint::new(1, 4)..DisplayPoint::new(1, 7), ); + + // Don't consider runs of multiple newlines to be a "word" + assert_eq!( + surrounding_word(&snapshot, DisplayPoint::new(3, 0)), + DisplayPoint::new(3, 0)..DisplayPoint::new(3, 0), + ); } } diff --git a/crates/editor/src/multi_buffer.rs b/crates/editor/src/multi_buffer.rs index e145488d65..715548f813 100644 --- a/crates/editor/src/multi_buffer.rs +++ b/crates/editor/src/multi_buffer.rs @@ -1407,7 +1407,7 @@ impl MultiBufferSnapshot { ); for ch in prev_chars { - if Some(char_kind(ch)) == word_kind { + if Some(char_kind(ch)) == word_kind && ch != '\n' { start -= ch.len_utf8(); } else { break; @@ -1415,7 +1415,7 @@ impl MultiBufferSnapshot { } for ch in next_chars { - if Some(char_kind(ch)) == word_kind { + if Some(char_kind(ch)) == word_kind && ch != '\n' { end += ch.len_utf8(); } else { break; diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index a4fee82805..763d08c053 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -271,7 +271,6 @@ pub(crate) struct DiagnosticEndpoint { #[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord, Debug)] pub enum CharKind { - Newline, Punctuation, Whitespace, Word, @@ -2259,9 +2258,7 @@ pub fn contiguous_ranges( } pub fn char_kind(c: char) -> CharKind { - if c == '\n' { - CharKind::Newline - } else if c.is_whitespace() { + if c.is_whitespace() { CharKind::Whitespace } else if c.is_alphanumeric() || c == '_' { CharKind::Word