override fun putTextViaIde()

in src/main/java/com/maddyhome/idea/vim/group/copy/PutGroup.kt [79:156]


  override fun putTextViaIde(
    pasteProvider: VimPasteProvider,
    vimEditor: VimEditor,
    vimContext: ExecutionContext,
    text: ProcessedTextData,
    selectionType: SelectionType,
    data: PutData,
    additionalData: Map<String, Any>,
  ) {
    val editor = (vimEditor as IjVimEditor).editor
    val context = vimContext.context as DataContext
    val carets: MutableMap<Caret, RangeMarker> = mutableMapOf()
    if (injector.vimState.mode is Mode.INSERT) {
      val nanoTime = System.nanoTime()

      val undo = injector.undo
      when (undo) {
        is VimKeyBasedUndoService -> undo.setInsertNonMergeUndoKey()
        is VimTimestampBasedUndoService -> {
          vimEditor.forEachCaret { undo.startInsertSequence(it, it.offset, nanoTime) }
        }
      }
    }
    EditorHelper.getOrderedCaretsList(editor).forEach { caret ->
      val startOffset =
        prepareDocumentAndGetStartOffsets(
          vimEditor,
          IjVimCaret(caret),
          text.typeInRegister,
          data,
          additionalData,
        ).first()
      val pointMarker = editor.document.createRangeMarker(startOffset, startOffset)
      caret.moveToInlayAwareOffset(startOffset)
      carets[caret] = pointMarker
    }

    val registerChar = text.registerChar
    if (registerChar != null && registerChar == RegisterConstants.CLIPBOARD_REGISTER) {
      (pasteProvider as IjPasteProvider).pasteProvider.performPaste(context)
    } else {
      pasteKeepingClipboard(text) {
        (pasteProvider as IjPasteProvider).pasteProvider.performPaste(context)
      }
    }

    val lastPastedRegion = if (carets.size == 1) editor.getUserData(EditorEx.LAST_PASTED_REGION) else null
    carets.forEach { (caret, point) ->
      val startOffset = point.startOffset
      point.dispose()
      if (!caret.isValid) return@forEach

      val caretPossibleEndOffset = lastPastedRegion?.endOffset ?: (startOffset + text.copiedText.text.length)
      val endOffset = if (data.indent) {
        doIndent(
          vimEditor,
          IjVimCaret(caret),
          vimContext,
          startOffset,
          caretPossibleEndOffset,
        )
      } else {
        caretPossibleEndOffset
      }
      val vimCaret = caret.vim
      injector.markService.setChangeMarks(vimCaret, TextRange(startOffset, endOffset))
      injector.markService.setMark(vimCaret, MARK_CHANGE_POS, startOffset)
      moveCaretToEndPosition(
        vimEditor,
        IjVimCaret(caret),
        startOffset,
        endOffset,
        text.typeInRegister,
        selectionType,
        data.caretAfterInsertedText,
      )
    }
  }