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,