in vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimMarkServiceBase.kt [358:399]
override fun updateMarksFromInsert(editor: VimEditor, insertStartOffset: Int, insertLength: Int) {
val caretToMarks = getAllMarksForFile(editor)
if (caretToMarks.isEmpty()) return
val insertEndOffset = insertStartOffset + insertLength
val insStart = editor.offsetToBufferPosition(insertStartOffset)
val insEnd = editor.offsetToBufferPosition(insertEndOffset)
logger.debug { "mark insert. insStart = $insertStartOffset, insEnd = $insertEndOffset" }
val lines = insEnd.line - insStart.line
if (lines == 0) return
for ((_, marks) in caretToMarks) {
for (mark in marks.filterIsInstance<VimMark>()) {
logger.debug { "mark = $mark" }
if (mark.key == SELECTION_START_MARK || mark.key == SELECTION_END_MARK) continue
if (insStart.line < mark.line) {
mark.line = mark.line + lines
}
logger.debug { "Shifting mark by $lines lines" }
}
}
for (caret in editor.carets()) {
val selectionInfo = caret.lastSelectionInfo
val startPosition = selectionInfo.start
var newStartPosition = selectionInfo.start
if (startPosition != null && insStart.line <= startPosition.line) {
newStartPosition = BufferPosition(startPosition.line + lines, startPosition.column, startPosition.leansForward)
}
val endPosition = selectionInfo.end
var newEndPosition = endPosition
if (endPosition != null && insStart.line <= endPosition.line) {
newEndPosition = BufferPosition(endPosition.line + lines, endPosition.column, endPosition.leansForward)
}
if (newStartPosition != startPosition || newEndPosition != endPosition) {
caret.lastSelectionInfo = SelectionInfo(newStartPosition, newEndPosition, selectionInfo.selectionType)
}
}
}