override fun changeMotion()

in vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt [1178:1260]


  override fun changeMotion(
    editor: VimEditor,
    caret: VimCaret,
    context: ExecutionContext,
    argument: Argument,
    operatorArguments: OperatorArguments,
  ): Boolean {
    var count0 = operatorArguments.count0
    // Vim treats cw as ce and cW as cE if cursor is on a non-blank character
    var motionArgument = argument as? Argument.Motion ?: return false
    val id = motionArgument.motion.id
    var kludge = false
    val bigWord = id == VIM_MOTION_BIG_WORD_RIGHT
    val chars = editor.text()
    val offset = caret.offset
    val fileSize = editor.fileSize().toInt()
    if (fileSize > 0 && offset < fileSize) {
      val charType = charType(editor, chars[offset], bigWord)
      if (charType !== CharacterHelper.CharacterType.WHITESPACE) {
        val lastWordChar = offset >= fileSize - 1 || charType(editor, chars[offset + 1], bigWord) !== charType
        if (wordMotions.contains(id) && lastWordChar && operatorArguments.count1 == 1) {
          val res = deleteCharacter(editor, context, caret, 1, true, operatorArguments)
          if (res) {
            editor.vimChangeActionSwitchMode = Mode.INSERT
          }
          return res
        }
        when (id) {
          VIM_MOTION_WORD_RIGHT -> {
            kludge = true
            motionArgument = Argument.Motion(
              injector.actionExecutor.findVimActionOrDie(VIM_MOTION_WORD_END_RIGHT) as MotionActionHandler,
              motionArgument.argument
            )
          }

          VIM_MOTION_BIG_WORD_RIGHT -> {
            kludge = true
            motionArgument = Argument.Motion(
              injector.actionExecutor.findVimActionOrDie(VIM_MOTION_BIG_WORD_END_RIGHT) as MotionActionHandler,
              motionArgument.argument
            )
          }

          VIM_MOTION_CAMEL_RIGHT -> {
            kludge = true
            motionArgument = Argument.Motion(
              injector.actionExecutor.findVimActionOrDie(VIM_MOTION_CAMEL_END_RIGHT) as MotionActionHandler,
              motionArgument.argument
            )
          }
        }
      }
    }
    if (kludge) {
      val pos1 = injector.searchHelper.findNextWordEnd(editor, offset, operatorArguments.count1, bigWord, false)
      val pos2 = injector.searchHelper.findNextWordEnd(editor, pos1, -operatorArguments.count1, bigWord, false)
      if (logger.isDebug()) {
        logger.debug("pos=$offset")
        logger.debug("pos1=$pos1")
        logger.debug("pos2=$pos2")
        logger.debug("count=" + operatorArguments.count1)
      }
      if (pos2 == offset && operatorArguments.count1 > 1) {
        count0--
      }
    }
    val (first, second) = getDeleteRangeAndType(
      editor,
      caret,
      context,
      motionArgument,
      true,
      operatorArguments.copy(count0 = count0),
    ) ?: return false
    return changeRange(
      editor,
      caret,
      first,
      second,
      context,
    )
  }