override fun processCommand()

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
  }