in vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/commands/TabMoveCommand.kt [31:80]
override fun processCommand(
editor: VimEditor,
context: ExecutionContext,
operatorArguments: OperatorArguments,
): ExecutionResult {
if (range.size() != 0) {
throw ExException("Range form of tabmove command is not supported. Please use the argument form")
}
val tabService = injector.tabService
val tabCount = tabService.getTabCount(context)
val currentIndex = tabService.getCurrentTabIndex(context)
val index: Int
try {
var argument = argument.trim()
if (argument == "+" || argument == "-") {
argument += "1"
}
index = if (argument.startsWith("+")) {
val number = Integer.parseInt(argument.substring(1))
if (number == 0) {
throw exExceptionMessage("E474")
}
currentIndex + number
} else if (argument.startsWith("-")) {
val number = Integer.parseInt(argument.substring(1))
if (number == 0) {
throw exExceptionMessage("E474")
}
currentIndex - number
} else if (argument == "$" || argument.isBlank()) {
tabCount - 1
} else {
var number = Integer.parseInt(argument)
// it's strange, but it is the way Vim works
if (number > currentIndex) number -= 1
number
}
} catch (_: NumberFormatException) {
throw exExceptionMessage("E474")
}
if (index < 0 || index >= tabCount) {
throw exExceptionMessage("E474")
}
tabService.moveCurrentTabToIndex(index, context)
return ExecutionResult.Success
}