Nicer token skip

This commit is contained in:
Joshua Barretto 2025-09-22 13:52:22 +01:00
parent 1f7a0c48e8
commit 95c894f825

View file

@ -325,16 +325,24 @@ impl Buffer {
cursor.pos = if !retain_base && cursor.base < cursor.pos { cursor.pos = if !retain_base && cursor.base < cursor.pos {
cursor.base cursor.base
} else if let (true, Some(mut pos)) = (word, cursor.pos.checked_sub(1)) { } else if let (true, Some(mut pos)) = (word, cursor.pos.checked_sub(1)) {
let class = self.text.chars().get(pos).copied().map(classify); let mut class = self.text.chars().get(pos).copied().and_then(classify);
loop { loop {
pos = match pos.checked_sub(1) { (class, pos) = if let Some(new_pos) = pos.checked_sub(1) {
Some(pos) let Some(new_class) =
if self.text.chars().get(pos).copied().map(classify) == class => self.text.chars().get(new_pos).copied().map(classify)
else {
break pos;
};
if (class.is_some() && new_class.is_none())
|| matches!((class, new_class), (Some(c), Some(n)) if c != n)
{ {
pos break pos;
} else {
(new_class, new_pos)
} }
_ => break pos, } else {
} break pos;
};
} }
} else { } else {
cursor.pos.saturating_sub(dist[0]) cursor.pos.saturating_sub(dist[0])
@ -346,13 +354,19 @@ impl Buffer {
cursor.base cursor.base
} else if word { } else if word {
let mut pos = cursor.pos; let mut pos = cursor.pos;
let class = self.text.chars().get(pos).copied().map(classify); let mut class = self.text.chars().get(pos).copied().and_then(classify);
loop { loop {
pos = if self.text.chars().get(pos).copied().map(classify) == class { let Some(new_class) = self.text.chars().get(pos).copied().map(classify)
pos + 1 else {
} else {
break pos; break pos;
}; };
(class, pos) = if (class.is_some() && new_class.is_none())
|| matches!((class, new_class), (Some(c), Some(n)) if c != n)
{
break pos;
} else {
(new_class, pos + 1)
};
} }
} else { } else {
(cursor.pos + dist[0]).min(self.text.chars.len()) (cursor.pos + dist[0]).min(self.text.chars.len())
@ -559,11 +573,12 @@ impl Buffer {
} }
// CLassify the character by property // CLassify the character by property
fn classify(c: char) -> u8 { fn classify(c: char) -> Option<u8> {
match c { match c {
// c if c.is_ascii_whitespace() => 0, ' ' | '\t' => None,
c if c.is_alphanumeric() || c == '_' => 1, '\n' => Some(0),
_ => 2, c if c.is_alphanumeric() || c == '_' => Some(1),
_ => Some(2),
} }
} }