diff --git a/helix-core/src/movement.rs b/helix-core/src/movement.rs index 900d3806..a4c7f9c9 100644 --- a/helix-core/src/movement.rs +++ b/helix-core/src/movement.rs @@ -194,7 +194,9 @@ impl CharHelpers for Chars<'_> { // Index advancement also depends on the direction. let advance: &dyn Fn(&mut usize) = match target { - WordMotionTarget::PrevWordStart | WordMotionTarget::PrevLongWordStart => &|u| *u = u.saturating_sub(1), + WordMotionTarget::PrevWordStart | WordMotionTarget::PrevLongWordStart => { + &|u| *u = u.saturating_sub(1) + } _ => &|u| *u += 1, }; @@ -254,9 +256,9 @@ fn is_word_boundary(a: char, b: char) -> bool { fn is_long_word_boundary(a: char, b: char) -> bool { match (categorize_char(a), categorize_char(b)) { (CharCategory::Word, CharCategory::Punctuation) - | (CharCategory::Punctuation, CharCategory::Word) => false, + | (CharCategory::Punctuation, CharCategory::Word) => false, (a, b) if a != b => true, - _ => false + _ => false, } } diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index f6511ba5..c3f0f392 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -158,6 +158,9 @@ impl Command { move_next_word_start, move_prev_word_start, move_next_word_end, + move_next_long_word_start, + move_prev_long_word_start, + move_next_long_word_end, move_file_start, move_file_end, extend_next_word_start, @@ -434,6 +437,42 @@ fn move_next_word_end(cx: &mut Context) { doc.set_selection(view.id, selection); } +fn move_next_long_word_start(cx: &mut Context) { + let count = cx.count(); + let (view, doc) = current!(cx.editor); + let text = doc.text().slice(..); + + let selection = doc + .selection(view.id) + .transform(|range| movement::move_next_long_word_start(text, range, count)); + + doc.set_selection(view.id, selection); +} + +fn move_prev_long_word_start(cx: &mut Context) { + let count = cx.count(); + let (view, doc) = current!(cx.editor); + let text = doc.text().slice(..); + + let selection = doc + .selection(view.id) + .transform(|range| movement::move_prev_long_word_start(text, range, count)); + + doc.set_selection(view.id, selection); +} + +fn move_next_long_word_end(cx: &mut Context) { + let count = cx.count(); + let (view, doc) = current!(cx.editor); + let text = doc.text().slice(..); + + let selection = doc + .selection(view.id) + .transform(|range| movement::move_next_long_word_end(text, range, count)); + + doc.set_selection(view.id, selection); +} + fn move_file_start(cx: &mut Context) { push_jump(cx.editor); let (view, doc) = current!(cx.editor); diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs index 05869610..22731d16 100644 --- a/helix-term/src/keymap.rs +++ b/helix-term/src/keymap.rs @@ -186,6 +186,10 @@ impl Default for Keymaps { key!('b') => Command::move_prev_word_start, key!('e') => Command::move_next_word_end, + key!('W') => Command::move_next_long_word_start, + key!('B') => Command::move_prev_long_word_start, + key!('E') => Command::move_next_long_word_end, + key!('v') => Command::select_mode, key!('g') => Command::goto_mode, key!(':') => Command::command_mode,