diff --git a/src/main/java/com/maddyhome/idea/vim/group/ChangeGroup.java b/src/main/java/com/maddyhome/idea/vim/group/ChangeGroup.java index 23c4bc5b9..4799ddb7e 100644 --- a/src/main/java/com/maddyhome/idea/vim/group/ChangeGroup.java +++ b/src/main/java/com/maddyhome/idea/vim/group/ChangeGroup.java @@ -146,19 +146,6 @@ public class ChangeGroup extends VimChangeGroupBase { return new Pair<>(range, type); } - @Override - public void insertLineAround(@NotNull VimEditor editor, @NotNull ExecutionContext context, int shift) { - com.maddyhome.idea.vim.newapi.ChangeGroupKt.insertLineAround(editor, context, shift); - } - - @Override - public boolean deleteRange2(@NotNull VimEditor editor, - @NotNull VimCaret caret, - @NotNull TextRange range, - @NotNull SelectionType type) { - return com.maddyhome.idea.vim.newapi.ChangeGroupKt.deleteRange(editor, caret, range, type); - } - /** * Toggles the case of count characters * diff --git a/src/main/java/com/maddyhome/idea/vim/newapi/ChangeGroup.kt b/src/main/java/com/maddyhome/idea/vim/newapi/ChangeGroup.kt deleted file mode 100644 index 1d78150f5..000000000 --- a/src/main/java/com/maddyhome/idea/vim/newapi/ChangeGroup.kt +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright 2003-2023 The IdeaVim authors - * - * Use of this source code is governed by an MIT-style - * license that can be found in the LICENSE.txt file or at - * https://opensource.org/licenses/MIT. - */ - -package com.maddyhome.idea.vim.newapi - -import com.intellij.codeInsight.editorActions.EnterHandler -import com.intellij.openapi.actionSystem.DataContext -import com.intellij.openapi.editor.Caret -import com.intellij.openapi.editor.Editor -import com.intellij.psi.util.PsiUtilBase -import com.intellij.util.text.CharArrayUtil -import com.maddyhome.idea.vim.VimPlugin -import com.maddyhome.idea.vim.api.ExecutionContext -import com.maddyhome.idea.vim.api.LineDeleteShift -import com.maddyhome.idea.vim.api.VimCaret -import com.maddyhome.idea.vim.api.VimChangeGroupBase -import com.maddyhome.idea.vim.api.VimEditor -import com.maddyhome.idea.vim.api.VimMotionGroupBase -import com.maddyhome.idea.vim.api.getLeadingCharacterOffset -import com.maddyhome.idea.vim.api.injector -import com.maddyhome.idea.vim.api.normalizeOffset -import com.maddyhome.idea.vim.command.SelectionType -import com.maddyhome.idea.vim.command.VimStateMachine -import com.maddyhome.idea.vim.common.EditorLine -import com.maddyhome.idea.vim.common.IndentConfig -import com.maddyhome.idea.vim.common.OperatedRange -import com.maddyhome.idea.vim.common.TextRange -import com.maddyhome.idea.vim.common.VimRange -import com.maddyhome.idea.vim.common.including -import com.maddyhome.idea.vim.common.offset -import com.maddyhome.idea.vim.helper.vimChangeActionSwitchMode -import com.maddyhome.idea.vim.helper.vimLastColumn - -internal fun changeRange( - editor: Editor, - caret: Caret, - range: TextRange, - type: SelectionType, - context: DataContext, -) { - val vimEditor = IjVimEditor(editor) - val vimRange = toVimRange(range, type) - - var col = 0 - var lines = 0 - if (type === SelectionType.BLOCK_WISE) { - lines = VimChangeGroupBase.getLinesCountInVisualBlock(IjVimEditor(editor), range) - col = editor.offsetToLogicalPosition(range.startOffset).column - if (caret.vimLastColumn == VimMotionGroupBase.LAST_COLUMN) { - col = VimMotionGroupBase.LAST_COLUMN - } - } - - // Remove the range - val vimCaret = IjVimCaret(caret) - val indent = editor.offsetToLogicalPosition(vimEditor.getLeadingCharacterOffset(vimCaret.getLine().line)).column - val deletedInfo = injector.vimMachine.delete(vimRange, vimEditor, vimCaret) - if (deletedInfo != null) { - if (deletedInfo is OperatedRange.Lines) { - // Add new line in case of linewise motion - val existingLine = if (vimEditor.fileSize() != 0L) { - if (deletedInfo.shiftType != LineDeleteShift.NO_NL) { - vimEditor.addLine(deletedInfo.lineAbove) - } else { - EditorLine.Pointer.init(deletedInfo.lineAbove.line, vimEditor) - } - } else { - EditorLine.Pointer.init(0, vimEditor) - } - - val offset = injector.motion.moveCaretToLineWithStartOfLineOption(vimEditor, existingLine.line, vimCaret) - // TODO: 29.12.2021 IndentConfig is not abstract - val indentText = IndentConfig.create(editor).createIndentBySize(indent) - vimEditor.insertText(offset.offset, indentText) - val caretOffset = offset + indentText.length - vimCaret.moveToOffset(caretOffset) - VimPlugin.getChange().insertBeforeCursor(editor.vim, context.vim) - } else { - when (deletedInfo) { - is OperatedRange.Characters -> { - vimCaret.moveToOffset(deletedInfo.leftOffset.point) - } - is OperatedRange.Block -> TODO() - else -> TODO() - } - if (type == SelectionType.BLOCK_WISE) { - VimPlugin.getChange().setInsertRepeat(lines, col, false) - } - editor.vimChangeActionSwitchMode = VimStateMachine.Mode.INSERT - } - } else { - VimPlugin.getChange().insertBeforeCursor(editor.vim, context.vim) - } -} - -internal fun deleteRange( - editor: VimEditor, - caret: VimCaret, - range: TextRange, - type: SelectionType, -): Boolean { - val vimRange = toVimRange(range, type) - - val deletedInfo = injector.vimMachine.delete(vimRange, editor, caret) - if (deletedInfo != null) { - when (deletedInfo) { - is OperatedRange.Characters -> { - val newOffset = editor.normalizeOffset(deletedInfo.leftOffset.point, false) - caret.moveToOffset(newOffset) - } - is OperatedRange.Block -> TODO() - is OperatedRange.Lines -> { - if (deletedInfo.shiftType != LineDeleteShift.NL_ON_START) { - val line = deletedInfo.lineAbove.toPointer(editor) - val offset = injector.motion.moveCaretToLineWithStartOfLineOption(editor, line.line, caret) - caret.moveToOffset(offset) - } else { - val logicalLine = EditorLine.Pointer.init((deletedInfo.lineAbove.line - 1).coerceAtLeast(0), editor) - val offset = injector.motion.moveCaretToLineWithStartOfLineOption(editor, logicalLine.line, caret) - caret.moveToOffset(offset) - } - } - } - } - return deletedInfo != null -} - -/** - * XXX: This implementation is incorrect! - * - * Known issues of this code: - * - Indent is incorrect when `o` for kotlin code like - * ``` - * if (true) { - * } - * ``` - * This is probably the kotlin issue, but still - * - `*` character doesn't appear when `o` in javadoc section - */ -internal fun insertLineAround(editor: VimEditor, context: ExecutionContext, shift: Int) { - val project = (editor as IjVimEditor).editor.project - - VimPlugin.getChange().initInsert(editor, context, VimStateMachine.Mode.INSERT) - - if (!VimStateMachine.getInstance(editor).isDotRepeatInProgress) { - for (vimCaret in editor.carets()) { - val caret = (vimCaret as IjVimCaret).caret - val line = vimCaret.getLine() - - // Current line indent - val lineStartOffset = editor.getLineRange(line).first.point - val text = editor.editor.document.charsSequence - val lineStartWsEndOffset = CharArrayUtil.shiftForward(text, lineStartOffset, " \t") - val indent = text.subSequence(lineStartOffset, lineStartWsEndOffset) - - // Calculating next line with minding folders - val lineEndOffset = if (shift == 1) { - VimPlugin.getMotion().moveCaretToCurrentLineEnd(editor, IjVimCaret(caret)) - } else { - VimPlugin.getMotion().moveCaretToCurrentLineStart(editor, caret.vim) - } - val position = EditorLine.Offset.init(editor.offsetToBufferPosition(lineEndOffset).line + shift, editor) - - val insertedLine = editor.addLine(position) - VimPlugin.getChange().saveStrokes("\n") - - var lineStart = editor.getLineRange(insertedLine).first - val initialLineStart = lineStart - - // Set up indent - // Firstly set up primitive indent - editor.insertText(lineStart, indent) - lineStart = (lineStart.point + indent.length).offset - - if (project != null) { - // Secondly set up language smart indent - val language = PsiUtilBase.getLanguageInEditor(caret, project) - val newIndent = EnterHandler.adjustLineIndentNoCommit(language, editor.editor.document, editor.editor, lineStart.point) - lineStart = if (newIndent >= 0) newIndent.offset else lineStart - } - VimPlugin.getChange() - .saveStrokes( - editor.editor.document.getText( - com.intellij.openapi.util.TextRange( - initialLineStart.point, - lineStart.point, - ), - ), - ) - - vimCaret.moveToOffset(lineStart.point) - } - } - - injector.scroll.scrollCaretIntoView(editor) -} - -internal fun toVimRange(range: TextRange, type: SelectionType): VimRange { - return when (type) { - SelectionType.LINE_WISE -> { - VimRange.Line.Offsets(range.startOffset.offset, range.endOffset.offset) - } - SelectionType.CHARACTER_WISE -> VimRange.Character.Range(range.startOffset including range.endOffset) - SelectionType.BLOCK_WISE -> VimRange.Block(range.startOffset.offset, range.endOffset.offset) - } -} diff --git a/src/main/java/com/maddyhome/idea/vim/newapi/IjVimInjector.kt b/src/main/java/com/maddyhome/idea/vim/newapi/IjVimInjector.kt index 772958765..427319cd1 100644 --- a/src/main/java/com/maddyhome/idea/vim/newapi/IjVimInjector.kt +++ b/src/main/java/com/maddyhome/idea/vim/newapi/IjVimInjector.kt @@ -53,7 +53,6 @@ import com.maddyhome.idea.vim.api.VimscriptExecutor import com.maddyhome.idea.vim.api.VimscriptFunctionService import com.maddyhome.idea.vim.api.VimscriptParser import com.maddyhome.idea.vim.command.VimStateMachine -import com.maddyhome.idea.vim.common.VimMachine import com.maddyhome.idea.vim.diagnostic.VimLogger import com.maddyhome.idea.vim.ex.ExOutputModel import com.maddyhome.idea.vim.extension.VimExtensionRegistrar @@ -159,8 +158,6 @@ internal class IjVimInjector : VimInjectorBase() { get() = service<IjVimApplication>() override val executionContextManager: ExecutionContextManager get() = service<IjExecutionContextManager>() - override val vimMachine: VimMachine - get() = service<VimMachineImpl>() override val enabler: VimEnabler get() = service<IjVimEnabler>() override val digraphGroup: VimDigraphGroup diff --git a/src/main/java/com/maddyhome/idea/vim/newapi/VimMachineImpl.kt b/src/main/java/com/maddyhome/idea/vim/newapi/VimMachineImpl.kt deleted file mode 100644 index a9f28cb71..000000000 --- a/src/main/java/com/maddyhome/idea/vim/newapi/VimMachineImpl.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2003-2023 The IdeaVim authors - * - * Use of this source code is governed by an MIT-style - * license that can be found in the LICENSE.txt file or at - * https://opensource.org/licenses/MIT. - */ - -package com.maddyhome.idea.vim.newapi - -import com.intellij.openapi.components.Service -import com.maddyhome.idea.vim.common.VimMachineBase - -@Service -internal class VimMachineImpl : VimMachineBase() diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertNewLineBelowAction.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertNewLineBelowAction.kt index 80446725b..418e98227 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertNewLineBelowAction.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/action/change/insert/InsertNewLineBelowAction.kt @@ -33,12 +33,7 @@ public class InsertNewLineBelowAction : ChangeEditorActionHandler.SingleExecutio operatorArguments: OperatorArguments, ): Boolean { if (editor.isOneLineMode()) return false - @Suppress("ConstantConditionIf") - if (false) { - injector.changeGroup.insertLineAround(editor, context, 1) - } else { - insertNewLineBelow(editor, context) - } + insertNewLineBelow(editor, context) return true } } @@ -55,12 +50,7 @@ public class InsertNewLineAboveAction : ChangeEditorActionHandler.SingleExecutio operatorArguments: OperatorArguments, ): Boolean { if (editor.isOneLineMode()) return false - @Suppress("ConstantConditionIf") - if (false) { - injector.changeGroup.insertLineAround(editor, context, 0) - } else { - insertNewLineAbove(editor, context) - } + insertNewLineAbove(editor, context) return true } } diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroup.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroup.kt index 3693fdc71..2726c9de0 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroup.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimChangeGroup.kt @@ -33,8 +33,6 @@ public interface VimChangeGroup { public fun insertPreviousInsert(editor: VimEditor, context: ExecutionContext, exit: Boolean, operatorArguments: OperatorArguments) - public fun insertLineAround(editor: VimEditor, context: ExecutionContext, shift: Int) - public fun initInsert(editor: VimEditor, context: ExecutionContext, mode: VimStateMachine.Mode) public fun processEscape(editor: VimEditor, context: ExecutionContext?, operatorArguments: OperatorArguments) @@ -96,8 +94,6 @@ public interface VimChangeGroup { operatorArguments: OperatorArguments, saveToRegister: Boolean = true, ): Boolean - public fun deleteRange2(editor: VimEditor, caret: VimCaret, range: TextRange, type: SelectionType): Boolean - public fun changeCharacters(editor: VimEditor, caret: VimCaret, operatorArguments: OperatorArguments): Boolean public fun changeEndOfLine(editor: VimEditor, caret: VimCaret, count: Int, operatorArguments: OperatorArguments): Boolean diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimEditor.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimEditor.kt index 409353b79..389a04fe7 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimEditor.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimEditor.kt @@ -14,12 +14,8 @@ import com.maddyhome.idea.vim.command.VimStateMachine import com.maddyhome.idea.vim.common.EditorLine import com.maddyhome.idea.vim.common.LiveRange import com.maddyhome.idea.vim.common.Offset -import com.maddyhome.idea.vim.common.OperatedRange import com.maddyhome.idea.vim.common.Pointer import com.maddyhome.idea.vim.common.TextRange -import com.maddyhome.idea.vim.common.VimRange -import com.maddyhome.idea.vim.common.offset -import com.maddyhome.idea.vim.common.pointer /** * Every line in [VimEditor] ends with a new line TODO <- this is probably not true already @@ -133,7 +129,6 @@ public interface VimEditor { public var vimChangeActionSwitchMode: VimStateMachine.Mode? public var vimKeepingVisualOperatorAction: Boolean - public fun deleteDryRun(range: VimRange): OperatedRange? public fun fileSize(): Long public fun text(): CharSequence @@ -273,13 +268,6 @@ public interface VimEditor { } public interface MutableVimEditor : VimEditor { - /** - * Returns actually deleted range and the according text, if any. - * - * TODO: How to make a clear code difference between [delete] and [deleteDryRun]. How to make sure that [deleteDryRun] - * will be called before [delete]? Should we call [deleteDryRun] before [delete]? - */ - public fun delete(range: VimRange) public fun addLine(atPosition: EditorLine.Offset): EditorLine.Pointer? public fun insertText(atPosition: Offset, text: CharSequence) public fun replaceString(start: Int, end: Int, newString: String) @@ -293,77 +281,6 @@ public abstract class LinearEditor : VimEditor { public abstract class MutableLinearEditor : MutableVimEditor, LinearEditor() { public abstract fun deleteRange(leftOffset: Offset, rightOffset: Offset) - public override fun delete(range: VimRange) { - when (range) { - is VimRange.Block -> TODO() - is VimRange.Character.Multiple -> TODO() - is VimRange.Character.Range -> { - deleteRange(range.offsetAbove(), range.offsetBelow()) - } - is VimRange.Line.Multiple -> TODO() - is VimRange.Line.Range -> { - val startOffset = getLineRange(range.lineAbove()).first - val endOffset = getLineRange(range.lineBelow()).second - deleteRange(startOffset, endOffset) - } - is VimRange.Line.Offsets -> { - var startOffset = getLineRange(getLine(range.offsetAbove())).first - var endOffset = getLineRange(getLine(range.offsetBelow())).second - var shiftType = LineDeleteShift.NO_NL - if (endOffset.point < fileSize() && charAt(endOffset.point.pointer) == '\n') { - endOffset = (endOffset.point + 1).offset - shiftType = LineDeleteShift.NL_ON_END - } else if (startOffset.point > 0 && lfMakesNewLine) { - startOffset = (startOffset.point - 1).offset - shiftType = LineDeleteShift.NL_ON_START - } - val (newStart, newEnd) = search((startOffset to endOffset), this, shiftType)?.first ?: return - deleteRange(newStart, newEnd) - } - } - } - - public override fun deleteDryRun(range: VimRange): OperatedRange? { - return when (range) { - is VimRange.Block -> TODO() - is VimRange.Character.Multiple -> TODO() - is VimRange.Character.Range -> { - val textToDelete = getText(range.offsetAbove(), range.offsetBelow()) - OperatedRange.Characters(textToDelete, range.offsetAbove(), range.offsetBelow()) - } - is VimRange.Line.Multiple -> TODO() - is VimRange.Line.Range -> { - val startOffset = getLineRange(range.lineAbove()).first - val endOffset = getLineRange(range.lineBelow()).second - @Suppress("UNUSED_VARIABLE") val textToDelete = getText(startOffset, endOffset) - TODO() - } - is VimRange.Line.Offsets -> { - val lineAbove = getLine(range.offsetAbove()) - var startOffset = getLineRange(lineAbove).first - val lineBelow = getLine(range.offsetBelow()) - var endOffset = getLineRange(lineBelow).second - var shiftType = LineDeleteShift.NO_NL - if (endOffset.point < fileSize() && charAt(endOffset.point.pointer) == '\n') { - endOffset = (endOffset.point + 1).offset - shiftType = LineDeleteShift.NL_ON_END - } else if (startOffset.point > 0 && lfMakesNewLine) { - startOffset = (startOffset.point - 1).offset - shiftType = LineDeleteShift.NL_ON_START - } - val data = search((startOffset to endOffset), this, shiftType) ?: return null - val (newStart, newEnd) = data.first - shiftType = data.second - val textToDelete = getText(newStart, newEnd) - OperatedRange.Lines( - textToDelete, - EditorLine.Offset.init(lineAbove.line, this), - lineBelow.line - lineAbove.line, - shiftType - ) - } - } - } } public enum class LineDeleteShift { diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimInjector.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimInjector.kt index 03ebfc534..f22e63f54 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimInjector.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimInjector.kt @@ -9,7 +9,6 @@ package com.maddyhome.idea.vim.api import com.maddyhome.idea.vim.command.VimStateMachine -import com.maddyhome.idea.vim.common.VimMachine import com.maddyhome.idea.vim.diagnostic.VimLogger import com.maddyhome.idea.vim.group.TabService import com.maddyhome.idea.vim.group.VimWindowGroup @@ -45,8 +44,6 @@ public interface VimInjector { // [FINISHED] Fully moved to vim-engine except one method that iterates with IJ. // Need to check how it would work in fleet before moving this method. public val digraphGroup: VimDigraphGroup - // [FINISHED] Fully moved to vim-engine. Should we remove it from injector? - public val vimMachine: VimMachine // [FINISHED] Can't be fully moved to vim-engine. public val enabler: VimEnabler diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimInjectorBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimInjectorBase.kt index b539d361b..144176f9c 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimInjectorBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimInjectorBase.kt @@ -13,8 +13,6 @@ import com.maddyhome.idea.vim.api.stubs.VimApplicationStub import com.maddyhome.idea.vim.api.stubs.VimEnablerStub import com.maddyhome.idea.vim.api.stubs.VimMessagesStub import com.maddyhome.idea.vim.api.stubs.VimProcessGroupStub -import com.maddyhome.idea.vim.common.VimMachine -import com.maddyhome.idea.vim.common.VimMachineBase import com.maddyhome.idea.vim.diagnostic.vimLogger import com.maddyhome.idea.vim.register.VimRegisterGroup import com.maddyhome.idea.vim.register.VimRegisterGroupBase @@ -32,7 +30,6 @@ abstract class VimInjectorBase : VimInjector { } override val parser: VimStringParser = object : VimStringParserBase() {} - override val vimMachine: VimMachine = object : VimMachineBase() {} override val optionGroup: VimOptionGroup by lazy { object : VimOptionGroupBase() {} } @Suppress("DEPRECATION") @Deprecated("Use optionGroup") diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/VimRange.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/VimRange.kt index ab1b0f626..690471edb 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/VimRange.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/common/VimRange.kt @@ -20,63 +20,6 @@ import com.maddyhome.idea.vim.mark.VimMarkConstants import kotlin.math.max import kotlin.math.min -/** - * Back direction range is possible. `start` is not lower than `end`. - * TODO: How to show it in code and namings? - * How to separate methods that return "starting from" line and "the above line" - * - * TODO: How to represent "till last column" - * - * [VimRange] includes selection type (line, character, block) - * - * Range normalizations (check if line and offsets really exist) are performed in editor implementations. - */ -public sealed class VimRange { - public sealed class Line : VimRange() { - public class Range(public val startLine: EditorLine.Pointer, public val endLine: EditorLine.Pointer) : Line() { - public fun lineAbove(): EditorLine.Pointer = listOf(startLine, endLine).minByOrNull { it.line }!! - public fun lineBelow(): EditorLine.Pointer = listOf(startLine, endLine).maxByOrNull { it.line }!! - } - - public class Multiple(public val lines: List<Int>) : Line() - - // TODO: 11.01.2022 How converting offsets to lines work? - public class Offsets(public val startOffset: Offset, public val endOffset: Offset) : Line() { - public fun offsetAbove(): Offset = min(startOffset.point, endOffset.point).offset - public fun offsetBelow(): Offset = max(startOffset.point, endOffset.point).offset - } - } - - public sealed class Character : VimRange() { - public class Range(public val range: VimTextRange) : Character() { - public fun offsetAbove(): Offset = min(range.start.point, range.end.point).offset - public fun offsetBelow(): Offset = max(range.start.point, range.end.point).offset - } - - public class Multiple(public val ranges: List<VimTextRange>) : Character() - } - - public class Block(public val start: Offset, public val end: Offset) : VimRange() -} - -/** - * `start` is not lower than `end` - */ -public data class VimTextRange( - val start: Offset, - val end: Offset, -) { - init { - if (start.point > end.point) { - println() - } - } -} - -public infix fun Int.including(another: Int): VimTextRange { - return VimTextRange(this.offset, another.offset) -} - public data class Offset(val point: Int) public data class Pointer(val point: Int) @@ -85,47 +28,6 @@ public val Int.offset: Offset public val Int.pointer: Pointer get() = Pointer(this) -public interface VimMachine { - public fun delete(range: VimRange, editor: VimEditor, caret: ImmutableVimCaret): OperatedRange? -} - -public abstract class VimMachineBase : VimMachine { - /** - * The information I'd like to know after the deletion: - * - What range is deleted? - * - What text is deleted? - * - Does text have a new line character at the end? - * - At what offset? - * - What caret? - */ - public override fun delete(range: VimRange, editor: VimEditor, caret: ImmutableVimCaret): OperatedRange? { - val operatedText = editor.deleteDryRun(range) ?: return null - - val normalizedRange = operatedText.toNormalizedTextRange(editor) - caret.registerStorage.storeText(editor, normalizedRange, operatedText.toType(), true) - (editor as MutableVimEditor).delete(range) - - val start = normalizedRange.startOffset - injector.markService.setMark(caret, VimMarkConstants.MARK_CHANGE_POS, start) - injector.markService.setChangeMarks(caret, TextRange(start, start + 1)) - - return operatedText - } -} - -public fun OperatedRange.toNormalizedTextRange(editor: VimEditor): TextRange { - return when (this) { - is OperatedRange.Block -> TODO() - is OperatedRange.Lines -> { - // TODO: 11.01.2022 This is unsafe - val startOffset = editor.getLineStartOffset(this.lineAbove.line) - val endOffset = editor.getLineEndOffset(lineAbove.line + linesOperated, true) - TextRange(startOffset, endOffset) - } - is OperatedRange.Characters -> TextRange(this.leftOffset.point, this.rightOffset.point) - } -} - public sealed class EditorLine private constructor(public val line: Int) { public class Pointer(line: Int) : EditorLine(line) { public companion object {