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,
)
}