1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-07-27 02:59:01 +02:00

Some refactoring of change group

This commit is contained in:
Alex Plate 2022-03-28 14:10:33 +03:00
parent 69fd8d68af
commit 3784f1957f
No known key found for this signature in database
GPG Key ID: 0B97153C8FFEC09F
24 changed files with 160 additions and 124 deletions

View File

@ -18,15 +18,16 @@
package com.maddyhome.idea.vim.action.motion.leftright
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.action.ComplicatedKeysAction
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.MotionType
import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
import com.maddyhome.idea.vim.helper.StringHelper.parseKeys
import com.maddyhome.idea.vim.newapi.ij
import java.awt.event.KeyEvent
import javax.swing.KeyStroke
@ -37,13 +38,13 @@ class MotionArrowLeftAction : NonShiftedSpecialKeyHandler(), ComplicatedKeysActi
setOf(parseKeys("<Left>"), listOf(KeyStroke.getKeyStroke(KeyEvent.VK_KP_LEFT, 0)))
override fun offset(
editor: Editor,
caret: Caret,
context: DataContext,
editor: VimEditor,
caret: VimCaret,
context: ExecutionContext,
count: Int,
rawCount: Int,
argument: Argument?,
): Int {
return VimPlugin.getMotion().getOffsetOfHorizontalMotion(editor, caret, -count, false)
return VimPlugin.getMotion().getOffsetOfHorizontalMotion(editor.ij, caret.ij, -count, false)
}
}

View File

@ -18,16 +18,17 @@
package com.maddyhome.idea.vim.action.motion.leftright
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.action.ComplicatedKeysAction
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.MotionType
import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
import com.maddyhome.idea.vim.helper.StringHelper.parseKeys
import com.maddyhome.idea.vim.helper.isEndAllowed
import com.maddyhome.idea.vim.newapi.ij
import java.awt.event.KeyEvent
import javax.swing.KeyStroke
@ -40,14 +41,14 @@ class MotionArrowRightAction : NonShiftedSpecialKeyHandler(), ComplicatedKeysAct
)
override fun offset(
editor: Editor,
caret: Caret,
context: DataContext,
editor: VimEditor,
caret: VimCaret,
context: ExecutionContext,
count: Int,
rawCount: Int,
argument: Argument?,
): Int {
val allowPastEnd = editor.isEndAllowed
return VimPlugin.getMotion().getOffsetOfHorizontalMotion(editor, caret, count, allowPastEnd)
return VimPlugin.getMotion().getOffsetOfHorizontalMotion(editor.ij, caret.ij, count, allowPastEnd)
}
}

View File

@ -18,23 +18,19 @@
package com.maddyhome.idea.vim.action.motion.leftright
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.VimMotionGroupBase
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.MotionType
import com.maddyhome.idea.vim.group.MotionGroup
import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
import com.maddyhome.idea.vim.helper.inInsertMode
import com.maddyhome.idea.vim.helper.inSelectMode
import com.maddyhome.idea.vim.helper.inVisualMode
import com.maddyhome.idea.vim.helper.vimLastColumn
import com.maddyhome.idea.vim.newapi.IjVimEditor
import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.options.OptionConstants
import com.maddyhome.idea.vim.options.OptionScope
@ -44,9 +40,9 @@ class MotionEndAction : NonShiftedSpecialKeyHandler() {
override val motionType: MotionType = MotionType.INCLUSIVE
override fun offset(
editor: Editor,
caret: Caret,
context: DataContext,
editor: VimEditor,
caret: VimCaret,
context: ExecutionContext,
count: Int,
rawCount: Int,
argument: Argument?,
@ -55,20 +51,20 @@ class MotionEndAction : NonShiftedSpecialKeyHandler() {
if (editor.inInsertMode) {
allow = true
} else if (editor.inVisualMode || editor.inSelectMode) {
val opt = (VimPlugin.getOptionService().getOptionValue(OptionScope.LOCAL(IjVimEditor(editor)), OptionConstants.selectionName) as VimString).value
val opt = (VimPlugin.getOptionService().getOptionValue(OptionScope.LOCAL(editor), OptionConstants.selectionName) as VimString).value
if (opt != "old") {
allow = true
}
}
return VimPlugin.getMotion().moveCaretToLineEndOffset(editor, caret, count - 1, allow)
return VimPlugin.getMotion().moveCaretToLineEndOffset(editor.ij, caret.ij, count - 1, allow)
}
override fun preMove(editor: VimEditor, caret: VimCaret, context: ExecutionContext, cmd: Command) {
caret.ij.vimLastColumn = MotionGroup.LAST_COLUMN
caret.ij.vimLastColumn = VimMotionGroupBase.LAST_COLUMN
}
override fun postMove(editor: VimEditor, caret: VimCaret, context: ExecutionContext, cmd: Command) {
caret.ij.vimLastColumn = MotionGroup.LAST_COLUMN
caret.ij.vimLastColumn = VimMotionGroupBase.LAST_COLUMN
}
}

View File

@ -18,25 +18,26 @@
package com.maddyhome.idea.vim.action.motion.leftright
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.MotionType
import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
import com.maddyhome.idea.vim.newapi.ij
class MotionHomeAction : NonShiftedSpecialKeyHandler() {
override val motionType: MotionType = MotionType.EXCLUSIVE
override fun offset(
editor: Editor,
caret: Caret,
context: DataContext,
editor: VimEditor,
caret: VimCaret,
context: ExecutionContext,
count: Int,
rawCount: Int,
argument: Argument?,
): Int {
return VimPlugin.getMotion().moveCaretToLineStart(editor, caret)
return VimPlugin.getMotion().moveCaretToLineStart(editor.ij, caret.ij)
}
}

View File

@ -22,12 +22,12 @@ import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.VimMotionGroupBase
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.CommandFlags
import com.maddyhome.idea.vim.command.MotionType
import com.maddyhome.idea.vim.command.OperatorArguments
import com.maddyhome.idea.vim.group.MotionGroup
import com.maddyhome.idea.vim.handler.Motion
import com.maddyhome.idea.vim.handler.MotionActionHandler
import com.maddyhome.idea.vim.handler.toMotion
@ -71,10 +71,10 @@ open class MotionLastColumnAction : MotionActionHandler.ForEachCaret() {
}
override fun postMove(editor: VimEditor, caret: VimCaret, context: ExecutionContext, cmd: Command) {
caret.ij.vimLastColumn = MotionGroup.LAST_COLUMN
caret.ij.vimLastColumn = VimMotionGroupBase.LAST_COLUMN
}
override fun preMove(editor: VimEditor, caret: VimCaret, context: ExecutionContext, cmd: Command) {
caret.ij.vimLastColumn = MotionGroup.LAST_COLUMN
caret.ij.vimLastColumn = VimMotionGroupBase.LAST_COLUMN
}
}

View File

@ -21,11 +21,11 @@ import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.VimMotionGroupBase
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.MotionType
import com.maddyhome.idea.vim.command.OperatorArguments
import com.maddyhome.idea.vim.group.MotionGroup
import com.maddyhome.idea.vim.handler.Motion
import com.maddyhome.idea.vim.handler.MotionActionHandler
import com.maddyhome.idea.vim.helper.inInsertMode
@ -67,7 +67,7 @@ class MotionLastScreenColumnAction : MotionActionHandler.ForEachCaret() {
context: ExecutionContext,
cmd: Command,
) {
caret.ij.vimLastColumn = MotionGroup.LAST_COLUMN
caret.ij.vimLastColumn = VimMotionGroupBase.LAST_COLUMN
}
override val motionType: MotionType = MotionType.INCLUSIVE

View File

@ -21,6 +21,7 @@ package com.maddyhome.idea.vim.action.motion.leftright
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.VimMotionGroupBase
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.group.MotionGroup
import com.maddyhome.idea.vim.handler.ShiftedSpecialKeyHandler
@ -51,9 +52,9 @@ class MotionShiftEndAction : ShiftedSpecialKeyHandler() {
}
val newOffset = VimPlugin.getMotion().moveCaretToLineEndOffset(editor, caret, cmd.count - 1, allow)
caret.vimLastColumn = MotionGroup.LAST_COLUMN
caret.vimLastColumn = VimMotionGroupBase.LAST_COLUMN
MotionGroup.moveCaret(editor, caret, newOffset)
caret.vimLastColumn = MotionGroup.LAST_COLUMN
caret.vimLastColumn = VimMotionGroupBase.LAST_COLUMN
}
}
}

View File

@ -18,22 +18,15 @@
package com.maddyhome.idea.vim.action.motion.updown
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.action.ComplicatedKeysAction
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.Argument
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.MotionType
import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
import com.maddyhome.idea.vim.helper.EditorHelper
import com.maddyhome.idea.vim.helper.StringHelper.parseKeys
import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.newapi.vim
import java.awt.event.KeyEvent
import javax.swing.KeyStroke
@ -41,27 +34,27 @@ class MotionArrowDownAction : NonShiftedSpecialKeyHandler(), ComplicatedKeysActi
override val motionType: MotionType = MotionType.LINE_WISE
override val keyStrokesSet: Set<List<KeyStroke>> =
setOf(parseKeys("<Down>"), listOf(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, 0)))
setOf(injector.parser.parseKeys("<Down>"), listOf(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, 0)))
private var col: Int = 0
override fun offset(
editor: Editor,
caret: Caret,
context: DataContext,
editor: VimEditor,
caret: VimCaret,
context: ExecutionContext,
count: Int,
rawCount: Int,
argument: Argument?,
): Int {
return VimPlugin.getMotion().getVerticalMotionOffset(editor.vim, caret.vim, count)
return injector.motion.getVerticalMotionOffset(editor, caret, count)
}
override fun preOffsetComputation(editor: VimEditor, caret: VimCaret, context: ExecutionContext, cmd: Command): Boolean {
col = EditorHelper.prepareLastColumn(caret.ij)
col = injector.engineEditorHelper.prepareLastColumn(caret)
return true
}
override fun postMove(editor: VimEditor, caret: VimCaret, context: ExecutionContext, cmd: Command) {
EditorHelper.updateLastColumn(caret.ij, col)
injector.engineEditorHelper.updateLastColumn(caret, col)
}
}

View File

@ -18,9 +18,6 @@
package com.maddyhome.idea.vim.action.motion.updown
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.action.ComplicatedKeysAction
import com.maddyhome.idea.vim.api.ExecutionContext
@ -33,7 +30,6 @@ import com.maddyhome.idea.vim.handler.NonShiftedSpecialKeyHandler
import com.maddyhome.idea.vim.helper.EditorHelper
import com.maddyhome.idea.vim.helper.StringHelper.parseKeys
import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.newapi.vim
import java.awt.event.KeyEvent
import javax.swing.KeyStroke
@ -46,14 +42,14 @@ class MotionArrowUpAction : NonShiftedSpecialKeyHandler(), ComplicatedKeysAction
private var col: Int = 0
override fun offset(
editor: Editor,
caret: Caret,
context: DataContext,
editor: VimEditor,
caret: VimCaret,
context: ExecutionContext,
count: Int,
rawCount: Int,
argument: Argument?,
): Int {
return VimPlugin.getMotion().getVerticalMotionOffset(editor.vim, caret.vim, -count)
return VimPlugin.getMotion().getVerticalMotionOffset(editor, caret, -count)
}
override fun preOffsetComputation(editor: VimEditor, caret: VimCaret, context: ExecutionContext, cmd: Command): Boolean {

View File

@ -684,7 +684,7 @@ public class ChangeGroup implements VimChangeGroup {
for (int i = 0; i < repeatLines; i++) {
if (repeatAppend &&
repeatColumn < MotionGroup.LAST_COLUMN &&
repeatColumn < VimMotionGroupBase.LAST_COLUMN &&
EditorHelper.getVisualLineLength(editor, visualLine + i) < repeatColumn) {
final String pad = EditorHelper.pad(editor, context, logicalLine + i, repeatColumn);
if (pad.length() > 0) {
@ -693,7 +693,7 @@ public class ChangeGroup implements VimChangeGroup {
}
}
int updatedCount = started ? (i == 0 ? count : count + 1) : count;
if (repeatColumn >= MotionGroup.LAST_COLUMN) {
if (repeatColumn >= VimMotionGroupBase.LAST_COLUMN) {
caret.moveToOffset(VimPlugin.getMotion().moveCaretToLineEnd(editor, logicalLine + i, true));
repeatInsertText(editor, context, updatedCount, operatorArguments);
}
@ -1467,13 +1467,13 @@ public class ChangeGroup implements VimChangeGroup {
}
else if (append) {
column += range.getMaxLength();
if (UserDataManager.getVimLastColumn(caret) == MotionGroup.LAST_COLUMN) {
column = MotionGroup.LAST_COLUMN;
if (UserDataManager.getVimLastColumn(caret) == VimMotionGroupBase.LAST_COLUMN) {
column = VimMotionGroupBase.LAST_COLUMN;
}
}
final int lineLength = EditorHelper.getLineLength(editor, line);
if (column < MotionGroup.LAST_COLUMN && lineLength < column) {
if (column < VimMotionGroupBase.LAST_COLUMN && lineLength < column) {
final String pad = EditorHelper.pad(editor, context, line, column);
final int offset = editor.getDocument().getLineEndOffset(line);
insertText(editor, caret, offset, pad);
@ -1559,8 +1559,8 @@ public class ChangeGroup implements VimChangeGroup {
if (type == SelectionType.BLOCK_WISE) {
lines = getLinesCountInVisualBlock(editor, range);
col = editor.offsetToLogicalPosition(range.getStartOffset()).column;
if (UserDataManager.getVimLastColumn(caret) == MotionGroup.LAST_COLUMN) {
col = MotionGroup.LAST_COLUMN;
if (UserDataManager.getVimLastColumn(caret) == VimMotionGroupBase.LAST_COLUMN) {
col = VimMotionGroupBase.LAST_COLUMN;
}
}
boolean after = range.getEndOffset() >= EditorHelperRt.getFileSize(editor);

View File

@ -33,10 +33,7 @@ import com.intellij.util.MathUtil;
import com.maddyhome.idea.vim.KeyHandler;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.motion.leftright.TillCharacterMotionType;
import com.maddyhome.idea.vim.api.VimCaret;
import com.maddyhome.idea.vim.api.VimEditor;
import com.maddyhome.idea.vim.api.VimInjectorKt;
import com.maddyhome.idea.vim.api.VimVisualPosition;
import com.maddyhome.idea.vim.api.*;
import com.maddyhome.idea.vim.command.*;
import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.ex.ExOutputModel;
@ -78,8 +75,7 @@ import static java.lang.Math.min;
/**
* This handles all motion related commands and marks
*/
public class MotionGroup {
public static final int LAST_COLUMN = 9999;
public class MotionGroup extends VimMotionGroupBase {
/**
* This helper method calculates the complete range a motion will move over taking into account whether
@ -1441,38 +1437,6 @@ public class MotionGroup {
return editor.getCaretModel().getOffset();
}
public int getVerticalMotionOffset(@NotNull VimEditor editor, @NotNull VimCaret caret, int count) {
VimVisualPosition pos = caret.getVisualPosition();
if ((pos.getLine() == 0 && count < 0) || (pos.getLine() >= getVisualLineCount(editor) - 1 && count > 0)) {
return -1;
}
else {
int col = caret.getVimLastColumn();
int line = VimInjectorKt.getInjector().getEngineEditorHelper().normalizeVisualLine(editor, pos.getLine() + count);
if (col == LAST_COLUMN) {
col = VimInjectorKt.getInjector().getEngineEditorHelper().normalizeVisualColumn(editor, line, col,
CommandStateHelper.isEndAllowedIgnoringOnemore(EngineHelperKt.getMode(editor)));
}
else {
if (line < 0) {
// https://web.ea.pages.jetbrains.team/#/issue/266279
// There is a weird exception for line < 0, but I don't understand how this may happen
throw new RuntimeException("Line is " + line + " , pos.line=" + pos.getLine() + ", count=" + count);
}
int newInlineElements = VimInjectorKt.getInjector().getEngineEditorHelper()
.amountOfInlaysBeforeVisualPosition(editor, new VimVisualPosition(line, col, false));
col = VimInjectorKt.getInjector().getEngineEditorHelper()
.normalizeVisualColumn(editor, line, col, EngineHelperKt.isEndAllowed(editor));
col += newInlineElements;
}
VimVisualPosition newPos = new VimVisualPosition(line, col, false);
return editor.visualPositionToOffset(newPos).getPoint();
}
}
public @Range(from = 0, to = Integer.MAX_VALUE) int moveCaretToLinePercent(@NotNull Editor editor,
@NotNull Caret caret,
int count) {

View File

@ -22,8 +22,8 @@ import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.VisualPosition
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.VimMotionGroupBase
import com.maddyhome.idea.vim.command.CommandState
import com.maddyhome.idea.vim.group.MotionGroup
import com.maddyhome.idea.vim.helper.EditorHelper
import com.maddyhome.idea.vim.helper.inBlockSubMode
import com.maddyhome.idea.vim.helper.inSelectMode
@ -190,7 +190,7 @@ private fun setVisualSelection(selectionStart: Int, selectionEnd: Int, caret: Ca
val lineStartOffset = EditorHelper.getLineStartOffset(editor, line)
// Extend selection to line end if it was made with `$` command
if (lastColumn >= MotionGroup.LAST_COLUMN) {
if (lastColumn >= VimMotionGroupBase.LAST_COLUMN) {
aCaret.vimSetSystemSelectionSilently(aCaret.selectionStart, lineEndOffset)
val newOffset = (lineEndOffset - VimPlugin.getVisualMotion().selectionAdj).coerceAtLeast(lineStartOffset)
aCaret.moveToInlayAwareOffset(newOffset)

View File

@ -26,6 +26,7 @@ import com.intellij.openapi.editor.ScrollType
import com.maddyhome.idea.vim.KeyHandler
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.VimMotionGroupBase
import com.maddyhome.idea.vim.api.VimVisualMotionGroup
import com.maddyhome.idea.vim.command.CommandState
import com.maddyhome.idea.vim.command.SelectionType
@ -134,7 +135,7 @@ class VisualMotionGroup : VimVisualMotionGroup {
val range = it.vimLastVisualOperatorRange ?: VisualChange.default(subMode)
val end = VisualOperation.calculateRange(editor.ij, range, count, it)
val lastColumn =
if (range.columns == MotionGroup.LAST_COLUMN) MotionGroup.LAST_COLUMN else editor.offsetToLogicalPosition(
if (range.columns == VimMotionGroupBase.LAST_COLUMN) VimMotionGroupBase.LAST_COLUMN else editor.offsetToLogicalPosition(
end
).column
it.vimLastColumn = lastColumn

View File

@ -22,10 +22,10 @@ import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.LogicalPosition
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.VimMotionGroupBase
import com.maddyhome.idea.vim.command.CommandFlags
import com.maddyhome.idea.vim.command.CommandState
import com.maddyhome.idea.vim.command.SelectionType
import com.maddyhome.idea.vim.group.MotionGroup
import com.maddyhome.idea.vim.helper.EditorHelper
import com.maddyhome.idea.vim.helper.inBlockSubMode
import com.maddyhome.idea.vim.helper.sort
@ -64,8 +64,8 @@ object VisualOperation {
if (CommandFlags.FLAG_MOT_LINEWISE in cmdFlags) return VisualChange(lines, ep.column, SelectionType.LINE_WISE)
val chars = if (editor.caretModel.primaryCaret.vimLastColumn == MotionGroup.LAST_COLUMN) {
MotionGroup.LAST_COLUMN
val chars = if (editor.caretModel.primaryCaret.vimLastColumn == VimMotionGroupBase.LAST_COLUMN) {
VimMotionGroupBase.LAST_COLUMN
} else when (type) {
SelectionType.LINE_WISE -> ep.column
SelectionType.CHARACTER_WISE -> if (lines > 1) ep.column - VimPlugin.getVisualMotion().selectionAdj else ep.column - sp.column

View File

@ -19,7 +19,6 @@
package com.maddyhome.idea.vim.handler
import com.intellij.openapi.actionSystem.DataContext
import com.intellij.openapi.editor.Caret
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.ExecutionContext
@ -142,16 +141,16 @@ abstract class NonShiftedSpecialKeyHandler : MotionActionHandler.ForEachCaret()
editor.ij.exitVisualMode()
}
return offset(editor.ij, caret.ij, context.ij, operatorArguments.count1, operatorArguments.count0, argument).toMotionOrError()
return offset(editor, caret, context, operatorArguments.count1, operatorArguments.count0, argument).toMotionOrError()
}
/**
* Calculate new offset for current [caret]
*/
abstract fun offset(
editor: Editor,
caret: Caret,
context: DataContext,
editor: VimEditor,
caret: VimCaret,
context: ExecutionContext,
count: Int,
rawCount: Int,
argument: Argument?,

View File

@ -29,11 +29,11 @@ import com.maddyhome.idea.vim.action.change.VimRepeater
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.VimMotionGroupBase
import com.maddyhome.idea.vim.command.Command
import com.maddyhome.idea.vim.command.CommandFlags
import com.maddyhome.idea.vim.command.OperatorArguments
import com.maddyhome.idea.vim.command.SelectionType
import com.maddyhome.idea.vim.group.MotionGroup
import com.maddyhome.idea.vim.group.visual.VimBlockSelection
import com.maddyhome.idea.vim.group.visual.VimSelection
import com.maddyhome.idea.vim.group.visual.VimSimpleSelection
@ -209,7 +209,7 @@ sealed class VisualOperatorActionHandler : EditorActionHandlerBase(false) {
primaryCaret to VimBlockSelection(
primaryCaret.offset,
end,
IjVimEditor(this), range.columns >= MotionGroup.LAST_COLUMN
IjVimEditor(this), range.columns >= VimMotionGroupBase.LAST_COLUMN
)
)
} else {
@ -228,7 +228,7 @@ sealed class VisualOperatorActionHandler : EditorActionHandlerBase(false) {
primaryCaret to VimBlockSelection(
primaryCaret.vimSelectionStart,
primaryCaret.offset,
IjVimEditor(this), primaryCaret.vimLastColumn >= MotionGroup.LAST_COLUMN
IjVimEditor(this), primaryCaret.vimLastColumn >= VimMotionGroupBase.LAST_COLUMN
)
)
}

View File

@ -3,9 +3,11 @@ package com.maddyhome.idea.vim.helper
import com.intellij.openapi.components.Service
import com.intellij.openapi.editor.VisualPosition
import com.maddyhome.idea.vim.api.EngineEditorHelper
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.VimVisualPosition
import com.maddyhome.idea.vim.common.TextRange
import com.maddyhome.idea.vim.newapi.IjVimCaret
import com.maddyhome.idea.vim.newapi.IjVimEditor
@Service
@ -43,4 +45,16 @@ class IjEditorHelper : EngineEditorHelper {
)
)
}
override fun getVisualLineCount(editor: VimEditor): Int {
return EditorHelper.getVisualLineCount(editor)
}
override fun prepareLastColumn(caret: VimCaret): Int {
return EditorHelper.prepareLastColumn((caret as IjVimCaret).caret)
}
override fun updateLastColumn(caret: VimCaret, prevLastColumn: Int) {
EditorHelper.updateLastColumn((caret as IjVimCaret).caret, prevLastColumn)
}
}

View File

@ -29,6 +29,7 @@ import com.maddyhome.idea.vim.api.LineDeleteShift
import com.maddyhome.idea.vim.api.MutableVimEditor
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.VimMotionGroupBase
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.CommandState
import com.maddyhome.idea.vim.command.SelectionType
@ -63,8 +64,8 @@ fun changeRange(
if (type === SelectionType.BLOCK_WISE) {
lines = ChangeGroup.getLinesCountInVisualBlock(editor, range)
col = editor.offsetToLogicalPosition(range.startOffset).column
if (caret.vimLastColumn == MotionGroup.LAST_COLUMN) {
col = MotionGroup.LAST_COLUMN
if (caret.vimLastColumn == VimMotionGroupBase.LAST_COLUMN) {
col = VimMotionGroupBase.LAST_COLUMN
}
}

View File

@ -17,6 +17,7 @@ import com.maddyhome.idea.vim.api.VimEnabler
import com.maddyhome.idea.vim.api.VimInjector
import com.maddyhome.idea.vim.api.VimKeyGroup
import com.maddyhome.idea.vim.api.VimMessages
import com.maddyhome.idea.vim.api.VimMotionGroup
import com.maddyhome.idea.vim.api.VimProcessGroup
import com.maddyhome.idea.vim.api.VimSearchHelper
import com.maddyhome.idea.vim.api.VimStringParser
@ -25,6 +26,7 @@ import com.maddyhome.idea.vim.command.CommandState
import com.maddyhome.idea.vim.common.VimMachine
import com.maddyhome.idea.vim.diagnostic.VimLogger
import com.maddyhome.idea.vim.group.MarkGroup
import com.maddyhome.idea.vim.group.MotionGroup
import com.maddyhome.idea.vim.helper.IjActionExecutor
import com.maddyhome.idea.vim.helper.IjEditorHelper
import com.maddyhome.idea.vim.helper.IjVimStringParser
@ -44,6 +46,8 @@ class IjVimInjector : VimInjector {
get() = service<IjClipboardManager>()
override val searchHelper: VimSearchHelper
get() = service<IjVimSearchHelper>()
override val motion: VimMotionGroup
get() = service<MotionGroup>()
override val nativeActionManager: NativeActionManager
get() = service<IjNativeActionManager>()
override val messages: VimMessages

View File

@ -10,4 +10,7 @@ interface EngineEditorHelper {
fun normalizeVisualLine(editor: VimEditor, line: Int): Int
fun normalizeVisualColumn(editor: VimEditor, line: Int, col: Int, allowEnd: Boolean): Int
fun amountOfInlaysBeforeVisualPosition(editor: VimEditor, pos: VimVisualPosition): Int
fun getVisualLineCount(editor: VimEditor): Int
fun prepareLastColumn(caret: VimCaret): Int
fun updateLastColumn(caret: VimCaret, prevLastColumn: Int)
}

View File

@ -33,6 +33,7 @@ interface VimInjector {
val clipboardManager: VimClipboardManager
val searchHelper: VimSearchHelper
val motion: VimMotionGroup
/**
* Please use vimLogger() function

View File

@ -0,0 +1,5 @@
package com.maddyhome.idea.vim.api
interface VimMotionGroup {
fun getVerticalMotionOffset(editor: VimEditor, caret: VimCaret, count: Int): Int
}

View File

@ -0,0 +1,43 @@
package com.maddyhome.idea.vim.api
import com.maddyhome.idea.vim.helper.isEndAllowed
import com.maddyhome.idea.vim.helper.isEndAllowedIgnoringOnemore
import com.maddyhome.idea.vim.helper.mode
abstract class VimMotionGroupBase : VimMotionGroup {
override fun getVerticalMotionOffset(editor: VimEditor, caret: VimCaret, count: Int): Int {
val pos = caret.getVisualPosition()
if ((pos.line == 0 && count < 0) || (pos.line >= injector.engineEditorHelper.getVisualLineCount(editor) - 1 && count > 0)) {
return -1
} else {
var col = caret.vimLastColumn
val line = injector.engineEditorHelper.normalizeVisualLine(editor, pos.line + count)
if (col == LAST_COLUMN) {
col = injector.engineEditorHelper.normalizeVisualColumn(
editor, line, col,
editor.mode.isEndAllowedIgnoringOnemore
)
} else {
if (line < 0) {
// https://web.ea.pages.jetbrains.team/#/issue/266279
// There is a weird exception for line < 0, but I don't understand how this may happen
throw RuntimeException("Line is " + line + " , pos.line=" + pos.line + ", count=" + count)
}
val newInlineElements = injector.engineEditorHelper
.amountOfInlaysBeforeVisualPosition(editor, VimVisualPosition(line, col, false))
col = injector.engineEditorHelper
.normalizeVisualColumn(editor, line, col, (editor).isEndAllowed)
col += newInlineElements
}
val newPos = VimVisualPosition(line, col, false)
return editor.visualPositionToOffset(newPos).point
}
}
companion object {
const val LAST_COLUMN = 9999
}
}

View File

@ -80,3 +80,15 @@ val VimEditor.inNormalMode
val CommandState.Mode.inNormalMode
get() = this == CommandState.Mode.COMMAND || this == CommandState.Mode.INSERT_NORMAL
val CommandState.Mode.isEndAllowedIgnoringOnemore: Boolean
get() = when (this) {
CommandState.Mode.INSERT, CommandState.Mode.VISUAL, CommandState.Mode.SELECT -> true
CommandState.Mode.COMMAND, CommandState.Mode.CMD_LINE, CommandState.Mode.REPLACE, CommandState.Mode.OP_PENDING -> false
CommandState.Mode.INSERT_NORMAL -> false
CommandState.Mode.INSERT_VISUAL -> true
CommandState.Mode.INSERT_SELECT -> true
}
val VimEditor.inInsertMode
get() = this.mode == CommandState.Mode.INSERT || this.mode == CommandState.Mode.REPLACE