From de8745aea772fb03ffc36fd3f959d8aa7ca1fd57 Mon Sep 17 00:00:00 2001 From: PabloMansanet Date: Tue, 29 Jun 2021 14:54:16 +0200 Subject: [PATCH] Incorporate long word commands into keymap --- helix-core/src/movement.rs | 8 +++++--- helix-term/src/commands.rs | 39 ++++++++++++++++++++++++++++++++++++++ helix-term/src/keymap.rs | 4 ++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/helix-core/src/movement.rs b/helix-core/src/movement.rs index 900d38066..a4c7f9c93 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 f6511ba59..c3f0f3929 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 058696101..22731d166 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,