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