override fun updateMarksFromInsert()

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