override fun execute()

in vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimScriptExecutorBase.kt [30:94]


  override fun execute(
    script: String,
    editor: VimEditor,
    context: ExecutionContext,
    skipHistory: Boolean,
    indicateErrors: Boolean,
    vimContext: VimLContext?,
  ): ExecutionResult {
    try {
      injector.vimscriptExecutor.executingVimscript = true
      var finalResult: ExecutionResult = ExecutionResult.Success

      val myScript = injector.vimscriptParser.parse(script)
      myScript.units.forEach { it.vimContext = vimContext ?: myScript }

      // Record the command in the history before executing it
      if (!skipHistory) {
        injector.historyGroup.addEntry(VimHistory.Type.Command, script)
      }

      for (unit in myScript.units) {
        try {
          val result = unit.execute(editor, context)
          if (result is ExecutionResult.Error) {
            finalResult = ExecutionResult.Error
            if (indicateErrors) {
              injector.messages.indicateError()
            }
          }
        } catch (e: ExException) {
          if (e is FinishException) {
            break
          }
          finalResult = ExecutionResult.Error
          if (indicateErrors) {
            injector.messages.showStatusBarMessage(editor, e.message)
            injector.messages.indicateError()
          } else {
            logger.warn("Failed while executing $unit. " + e.message)
          }
        } catch (e: NotImplementedError) {
          if (indicateErrors) {
            injector.messages.showStatusBarMessage(editor, "Not implemented yet :(")
            injector.messages.indicateError()
          }
        } catch (e: Exception) {
          logger.warn(e.toString())
          if (injector.application.isUnitTest()) {
            throw e
          }
        }
      }

      if (!skipHistory && myScript.units.size == 1 && myScript.units[0] is Command && myScript.units[0] !is RepeatCommand) {
        injector.registerGroup.storeTextSpecial(LAST_COMMAND_REGISTER, script)
      }
      return finalResult
    } finally {
      injector.vimscriptExecutor.executingVimscript = false

      // Initialize any extensions that were enabled during execution of this vimscript
      // See the doc of this function for details
      enableDelayedExtensions()
    }
  }