protected fun deleteText()

in vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroupBase.kt [161:207]


  protected fun deleteText(
    editor: VimEditor,
    context: ExecutionContext,
    range: TextRange,
    type: SelectionType?,
    caret: VimCaret,
    saveToRegister: Boolean = true,
  ): Boolean {
    var updatedRange = range

    // Fix for https://youtrack.jetbrains.net/issue/VIM-35
    if (!range.normalize(editor.fileSize().toInt())) {
      updatedRange = if (range.startOffset == range.endOffset
        && range.startOffset == editor.fileSize().toInt()
        && range.startOffset != 0
      ) {
        TextRange(range.startOffset - 1, range.endOffset)
      } else {
        return false
      }
    }

    val isInsertMode = editor.mode == Mode.INSERT || editor.mode == Mode.REPLACE
    val shouldYank = type != null && !isInsertMode && saveToRegister
    if (shouldYank && !caret.registerStorage.storeText(editor, context, updatedRange, type, isDelete = true)) {
      return false
    }

    val startOffsets = updatedRange.startOffsets
    val endOffsets = updatedRange.endOffsets
    for (i in updatedRange.size() - 1 downTo 0) {
      val (newRange, _) = editor.search(
        startOffsets[i] to endOffsets[i],
        editor,
        LineDeleteShift.NL_ON_END
      ) ?: continue
      injector.application.runWriteAction {
        editor.deleteString(TextRange(newRange.first, newRange.second))
      }
    }
    if (type != null) {
      val start = updatedRange.startOffset
      injector.markService.setMark(caret, MARK_CHANGE_POS, start)
      injector.markService.setChangeMarks(caret, TextRange(start, start + 1))
    }
    return true
  }