From 51f15782afc9272dc20376294bf401ed77f8a7de Mon Sep 17 00:00:00 2001
From: chylex <contact@chylex.com>
Date: Thu, 27 Mar 2025 11:29:51 +0100
Subject: [PATCH] Make camelCase motions adjust based on direction of visual
 selection

---
 .../vim/action/motion/text/MotionCamelLeftAction.kt    | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelLeftAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelLeftAction.kt
index 24acd9c62..43454fa9c 100644
--- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelLeftAction.kt
+++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/motion/text/MotionCamelLeftAction.kt
@@ -31,6 +31,12 @@ class MotionCamelLeftAction : MotionActionHandler.ForEachCaret() {
     argument: Argument?,
     operatorArguments: OperatorArguments,
   ): Motion {
+    if (caret.hasSelection() && caret.offset > caret.vimSelectionStart) {
+      val target = injector.searchHelper.findPreviousCamelEnd(editor.text(), caret.offset, operatorArguments.count1)
+      if (target != null && target > caret.vimSelectionStart) {
+        return target.toMotionOrError()
+      }
+    }
     return injector.searchHelper.findPreviousCamelStart(editor.text(), caret.offset, operatorArguments.count1)
       ?.toMotionOrError() ?: Motion.Error
   }
@@ -47,6 +53,10 @@ class MotionCamelRightAction : MotionActionHandler.ForEachCaret() {
     argument: Argument?,
     operatorArguments: OperatorArguments,
   ): Motion {
+    if (caret.hasSelection() && caret.offset >= caret.vimSelectionStart) {
+      return injector.searchHelper.findNextCamelEnd(editor.text(), caret.offset + 1, operatorArguments.count1)
+        ?.toMotionOrError() ?: Motion.Error
+    }
     return injector.searchHelper.findNextCamelStart(editor.text(), caret.offset + 1, operatorArguments.count1)
       ?.toMotionOrError() ?: Motion.Error
   }