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:
parent
69fd8d68af
commit
3784f1957f
src/main/java/com/maddyhome/idea/vim
action/motion
leftright
MotionArrowLeftAction.ktMotionArrowRightAction.ktMotionEndAction.ktMotionHomeAction.ktMotionLastColumnAction.ktMotionLastScreenColumnAction.ktMotionShiftEndAction.kt
updown
group
handler
helper
newapi
vim-engine/src/main/kotlin/com/maddyhome/idea/vim
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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?,
|
||||
|
@ -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
|
||||
)
|
||||
)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
@ -33,6 +33,7 @@ interface VimInjector {
|
||||
val clipboardManager: VimClipboardManager
|
||||
|
||||
val searchHelper: VimSearchHelper
|
||||
val motion: VimMotionGroup
|
||||
|
||||
/**
|
||||
* Please use vimLogger() function
|
||||
|
@ -0,0 +1,5 @@
|
||||
package com.maddyhome.idea.vim.api
|
||||
|
||||
interface VimMotionGroup {
|
||||
fun getVerticalMotionOffset(editor: VimEditor, caret: VimCaret, count: Int): Int
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user