diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 2097563a8..b8506fa54 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -2,14 +2,7 @@ <code_scheme name="Project" version="173"> <option name="OTHER_INDENT_OPTIONS"> <value> - <option name="INDENT_SIZE" value="4" /> <option name="CONTINUATION_INDENT_SIZE" value="4" /> - <option name="TAB_SIZE" value="4" /> - <option name="USE_TAB_CHARACTER" value="false" /> - <option name="SMART_TABS" value="false" /> - <option name="LABEL_INDENT_SIZE" value="0" /> - <option name="LABEL_INDENT_ABSOLUTE" value="false" /> - <option name="USE_RELATIVE_INDENTS" value="false" /> </value> </option> <option name="LINE_COMMENT_AT_FIRST_COLUMN" value="false" /> @@ -70,7 +63,6 @@ <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" /> <option name="FOR_STATEMENT_WRAP" value="5" /> <option name="ASSIGNMENT_WRAP" value="1" /> - <option name="PARENT_SETTINGS_INSTALLED" value="true" /> </codeStyleSettings> <codeStyleSettings language="ECMA Script Level 4"> <option name="KEEP_LINE_BREAKS" value="false" /> @@ -96,7 +88,6 @@ <option name="DOWHILE_BRACE_FORCE" value="1" /> <option name="WHILE_BRACE_FORCE" value="1" /> <option name="FOR_BRACE_FORCE" value="1" /> - <option name="PARENT_SETTINGS_INSTALLED" value="true" /> </codeStyleSettings> <codeStyleSettings language="GSP"> <indentOptions> @@ -130,7 +121,6 @@ <option name="WHILE_BRACE_FORCE" value="1" /> <option name="FOR_BRACE_FORCE" value="1" /> <option name="FIELD_ANNOTATION_WRAP" value="0" /> - <option name="PARENT_SETTINGS_INSTALLED" value="true" /> <indentOptions> <option name="INDENT_SIZE" value="2" /> </indentOptions> @@ -176,7 +166,6 @@ <option name="WHILE_BRACE_FORCE" value="1" /> <option name="FOR_BRACE_FORCE" value="1" /> <option name="FIELD_ANNOTATION_WRAP" value="0" /> - <option name="PARENT_SETTINGS_INSTALLED" value="true" /> <indentOptions> <option name="INDENT_SIZE" value="2" /> <option name="CONTINUATION_INDENT_SIZE" value="2" /> @@ -185,7 +174,6 @@ </codeStyleSettings> <codeStyleSettings language="JSON"> <option name="KEEP_LINE_BREAKS" value="false" /> - <option name="PARENT_SETTINGS_INSTALLED" value="true" /> </codeStyleSettings> <codeStyleSettings language="JSP"> <indentOptions> @@ -215,15 +203,11 @@ <option name="DOWHILE_BRACE_FORCE" value="1" /> <option name="WHILE_BRACE_FORCE" value="1" /> <option name="FOR_BRACE_FORCE" value="1" /> - <option name="PARENT_SETTINGS_INSTALLED" value="true" /> </codeStyleSettings> <codeStyleSettings language="Python"> <option name="KEEP_LINE_BREAKS" value="false" /> <option name="PARENT_SETTINGS_INSTALLED" value="true" /> </codeStyleSettings> - <codeStyleSettings language="SQL"> - <option name="PARENT_SETTINGS_INSTALLED" value="true" /> - </codeStyleSettings> <codeStyleSettings language="XML"> <indentOptions> <option name="INDENT_SIZE" value="2" /> diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionColumnAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionColumnAction.java index 3dfbb573b..1621e9381 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionColumnAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionColumnAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -36,10 +37,17 @@ public class MotionColumnAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) { - return VimPlugin.getMotion().moveCaretToColumn(editor, count - 1, false); + public Handler() { + super(true); } + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, Argument argument) { + return VimPlugin.getMotion().moveCaretToColumn(editor, caret, count - 1, false); + } + + @Override protected void postMove(@NotNull Editor editor, DataContext context, @NotNull Command cmd) { EditorData.setLastColumn(editor, cmd.getCount() - 1); } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstColumnAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstColumnAction.java index e7797e72a..9e3632ced 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstColumnAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstColumnAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -34,8 +35,14 @@ public class MotionFirstColumnAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) { - return VimPlugin.getMotion().moveCaretToLineStart(editor); + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, Argument argument) { + return VimPlugin.getMotion().moveCaretToLineStart(editor, caret); } } } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstNonSpaceAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstNonSpaceAction.java index 8334b772d..129992e45 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstNonSpaceAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionFirstNonSpaceAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -34,8 +35,14 @@ public class MotionFirstNonSpaceAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) { - return VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor); + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, Argument argument) { + return VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, caret); } } } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastColumnAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastColumnAction.java index 11c056af5..cf0fe1fe5 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastColumnAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastColumnAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -40,7 +41,13 @@ public class MotionLastColumnAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) { + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, Argument argument) { boolean allow = false; if (CommandState.inInsertMode(editor)) { allow = true; @@ -52,7 +59,7 @@ public class MotionLastColumnAction extends MotionEditorAction { } } - return VimPlugin.getMotion().moveCaretToLineEndOffset(editor, count - 1, allow); + return VimPlugin.getMotion().moveCaretToLineEndOffset(editor, caret,count - 1, allow); } protected void postMove(@NotNull Editor editor, DataContext context, Command cmd) { diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharAction.java index f06009c17..4f2106501 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -34,8 +35,14 @@ public class MotionLastMatchCharAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) { - return VimPlugin.getMotion().repeatLastMatchChar(editor, count); + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, Argument argument) { + return VimPlugin.getMotion().repeatLastMatchChar(editor, caret, count); } } } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharReverseAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharReverseAction.java index 9d09db181..cc63e3346 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharReverseAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastMatchCharReverseAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -34,8 +35,14 @@ public class MotionLastMatchCharReverseAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) { - return VimPlugin.getMotion().repeatLastMatchChar(editor, -count); + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, Argument argument) { + return VimPlugin.getMotion().repeatLastMatchChar(editor, caret, -count); } } } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastNonSpaceAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastNonSpaceAction.java index 4fb7b8fa1..5581f8cab 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastNonSpaceAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLastNonSpaceAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -34,8 +35,14 @@ public class MotionLastNonSpaceAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) { - return VimPlugin.getMotion().moveCaretToLineEndSkipLeadingOffset(editor, count - 1); + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, Argument argument) { + return VimPlugin.getMotion().moveCaretToLineEndSkipLeadingOffset(editor, caret, count - 1); } } } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftAction.java index e4a624f7e..d3acda7bb 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftAction.java @@ -24,6 +24,7 @@ import com.intellij.openapi.editor.Editor; import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.action.motion.MotionEditorAction; import com.maddyhome.idea.vim.command.Argument; +import com.maddyhome.idea.vim.command.CommandState; import com.maddyhome.idea.vim.handler.MotionEditorActionHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,9 +41,19 @@ public class MotionLeftAction extends MotionEditorAction { super(true); } - public int getOffset(@NotNull Editor editor, @Nullable Caret caret, @NotNull DataContext context, int count, + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) { + if (CommandState.inVisualBlockMode(editor)) { + // In visual block mode, ideavim creates multiple carets to make a selection on each line. + // Only the primary caret of the selection should be moved though. This temporary hack + // prevents the additional carets from being moved. + if (caret != editor.getCaretModel().getPrimaryCaret()) { + count = 0; + } + } return VimPlugin.getMotion().moveCaretHorizontal(editor, caret, -count, false); } } } + diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftMatchCharAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftMatchCharAction.java index cef7cae44..fa71cbe41 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftMatchCharAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftMatchCharAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -35,8 +36,14 @@ public class MotionLeftMatchCharAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, @NotNull Argument argument) { - int res = VimPlugin.getMotion().moveCaretToNextCharacterOnLine(editor, -count, argument.getCharacter()); + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, @NotNull Argument argument) { + int res = VimPlugin.getMotion().moveCaretToNextCharacterOnLine(editor, caret, -count, argument.getCharacter()); VimPlugin.getMotion().setLastFTCmd(MotionGroup.LAST_F, argument.getCharacter()); return res; } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftTillMatchCharAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftTillMatchCharAction.java index 2b2624e18..e93c8cf69 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftTillMatchCharAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionLeftTillMatchCharAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -35,8 +36,14 @@ public class MotionLeftTillMatchCharAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, @NotNull Argument argument) { - int res = VimPlugin.getMotion().moveCaretToBeforeNextCharacterOnLine(editor, -count, argument.getCharacter()); + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, @NotNull Argument argument) { + int res = VimPlugin.getMotion().moveCaretToBeforeNextCharacterOnLine(editor, caret, -count, argument.getCharacter()); VimPlugin.getMotion().setLastFTCmd(MotionGroup.LAST_T, argument.getCharacter()); return res; } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightAction.java index 188efb823..295439ce8 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightAction.java @@ -24,6 +24,7 @@ import com.intellij.openapi.editor.Editor; import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.action.motion.MotionEditorAction; import com.maddyhome.idea.vim.command.Argument; +import com.maddyhome.idea.vim.command.CommandState; import com.maddyhome.idea.vim.handler.MotionEditorActionHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,8 +41,17 @@ public class MotionRightAction extends MotionEditorAction { super(true); } + @Override public int getOffset(@NotNull Editor editor, @Nullable Caret caret, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) { + if (CommandState.inVisualBlockMode(editor)) { + // In visual block mode, ideavim creates multiple carets to make a selection on each line. + // Only the primary caret of the selection should be moved though. This temporary hack + // prevents the additional carets from being moved. + if (caret != editor.getCaretModel().getPrimaryCaret()) { + count = 0; + } + } return VimPlugin.getMotion().moveCaretHorizontal(editor, caret, count, true); } } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightMatchCharAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightMatchCharAction.java index c48d5df98..02f9bb625 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightMatchCharAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightMatchCharAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -35,8 +36,14 @@ public class MotionRightMatchCharAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, @NotNull Argument argument) { - int res = VimPlugin.getMotion().moveCaretToNextCharacterOnLine(editor, count, argument.getCharacter()); + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, @NotNull Argument argument) { + int res = VimPlugin.getMotion().moveCaretToNextCharacterOnLine(editor, caret, count, argument.getCharacter()); VimPlugin.getMotion().setLastFTCmd(MotionGroup.LAST_f, argument.getCharacter()); return res; } diff --git a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightTillMatchCharAction.java b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightTillMatchCharAction.java index c4cecadf5..b770e1b00 100644 --- a/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightTillMatchCharAction.java +++ b/src/com/maddyhome/idea/vim/action/motion/leftright/MotionRightTillMatchCharAction.java @@ -19,6 +19,7 @@ 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.motion.MotionEditorAction; @@ -35,8 +36,14 @@ public class MotionRightTillMatchCharAction extends MotionEditorAction { } private static class Handler extends MotionEditorActionHandler { - public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, @NotNull Argument argument) { - int res = VimPlugin.getMotion().moveCaretToBeforeNextCharacterOnLine(editor, count, argument.getCharacter()); + public Handler() { + super(true); + } + + @Override + public int getOffset(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, + int count, int rawCount, @NotNull Argument argument) { + int res = VimPlugin.getMotion().moveCaretToBeforeNextCharacterOnLine(editor, caret, count, argument.getCharacter()); VimPlugin.getMotion().setLastFTCmd(MotionGroup.LAST_t, argument.getCharacter()); return res; } diff --git a/src/com/maddyhome/idea/vim/group/MotionGroup.java b/src/com/maddyhome/idea/vim/group/MotionGroup.java index 07a6e51b9..05ef3783e 100755 --- a/src/com/maddyhome/idea/vim/group/MotionGroup.java +++ b/src/com/maddyhome/idea/vim/group/MotionGroup.java @@ -700,26 +700,26 @@ public class MotionGroup { this.lastFTChar = lastChar; } - public int repeatLastMatchChar(@NotNull Editor editor, int count) { + public int repeatLastMatchChar(@NotNull Editor editor, @NotNull Caret caret, int count) { int res = -1; int startPos = editor.getCaretModel().getOffset(); switch (lastFTCmd) { case LAST_F: - res = moveCaretToNextCharacterOnLine(editor, -count, lastFTChar); + res = moveCaretToNextCharacterOnLine(editor, caret, -count, lastFTChar); break; case LAST_f: - res = moveCaretToNextCharacterOnLine(editor, count, lastFTChar); + res = moveCaretToNextCharacterOnLine(editor, caret, count, lastFTChar); break; case LAST_T: - res = moveCaretToBeforeNextCharacterOnLine(editor, -count, lastFTChar); + res = moveCaretToBeforeNextCharacterOnLine(editor, caret, -count, lastFTChar); if (res == startPos && Math.abs(count) == 1) { - res = moveCaretToBeforeNextCharacterOnLine(editor, 2 * count, lastFTChar); + res = moveCaretToBeforeNextCharacterOnLine(editor, caret, 2 * count, lastFTChar); } break; case LAST_t: - res = moveCaretToBeforeNextCharacterOnLine(editor, count, lastFTChar); + res = moveCaretToBeforeNextCharacterOnLine(editor, caret, count, lastFTChar); if (res == startPos && Math.abs(count) == 1) { - res = moveCaretToBeforeNextCharacterOnLine(editor, 2 * count, lastFTChar); + res = moveCaretToBeforeNextCharacterOnLine(editor, caret, 2 * count, lastFTChar); } break; } @@ -730,13 +730,14 @@ public class MotionGroup { /** * This moves the caret to the next/previous matching character on the current line * + * @param caret The caret to be moved * @param count The number of occurrences to move to * @param ch The character to search for * @param editor The editor to search in * @return True if [count] character matches were found, false if not */ - public int moveCaretToNextCharacterOnLine(@NotNull Editor editor, int count, char ch) { - int pos = SearchHelper.findNextCharacterOnLine(editor, count, ch); + public int moveCaretToNextCharacterOnLine(@NotNull Editor editor, @NotNull Caret caret, int count, char ch) { + int pos = SearchHelper.findNextCharacterOnLine(editor, caret, count, ch); if (pos >= 0) { return pos; @@ -749,13 +750,14 @@ public class MotionGroup { /** * This moves the caret next to the next/previous matching character on the current line * + * @param caret The caret to be moved * @param count The number of occurrences to move to * @param ch The character to search for * @param editor The editor to search in * @return True if [count] character matches were found, false if not */ - public int moveCaretToBeforeNextCharacterOnLine(@NotNull Editor editor, int count, char ch) { - int pos = SearchHelper.findNextCharacterOnLine(editor, count, ch); + public int moveCaretToBeforeNextCharacterOnLine(@NotNull Editor editor, @NotNull Caret caret, int count, char ch) { + int pos = SearchHelper.findNextCharacterOnLine(editor, caret, count, ch); if (pos >= 0) { int step = count >= 0 ? 1 : -1; @@ -1046,18 +1048,32 @@ public class MotionGroup { return moveCaretToColumn(editor, Math.max(0, Math.min(len - 1, width)), false); } - public int moveCaretToColumn(@NotNull Editor editor, int count, boolean allowEnd) { - int line = editor.getCaretModel().getLogicalPosition().line; + public int moveCaretToColumn(@NotNull Editor editor, @NotNull Caret caret, int count, boolean allowEnd) { + int line = caret.getLogicalPosition().line; int pos = EditorHelper.normalizeColumn(editor, line, count, allowEnd); return editor.logicalPositionToOffset(new LogicalPosition(line, pos)); } - public int moveCaretToLineStartSkipLeading(@NotNull Editor editor) { - int logicalLine = editor.getCaretModel().getLogicalPosition().line; + /** + * @deprecated To move the caret, use {@link #moveCaretToColumn(Editor, Caret, int, boolean)} + */ + public int moveCaretToColumn(@NotNull Editor editor, int count, boolean allowEnd) { + return moveCaretToColumn(editor, editor.getCaretModel().getPrimaryCaret(), count, allowEnd); + } + + public int moveCaretToLineStartSkipLeading(@NotNull Editor editor, @NotNull Caret caret) { + int logicalLine = caret.getLogicalPosition().line; return moveCaretToLineStartSkipLeading(editor, logicalLine); } + /** + * @deprecated To move the caret, use {@link #moveCaretToLineStartSkipLeading(Editor, Caret)} + */ + public int moveCaretToLineStartSkipLeading(@NotNull Editor editor) { + return moveCaretToLineStartSkipLeading(editor, editor.getCaretModel().getPrimaryCaret()); + } + public int moveCaretToLineStartSkipLeadingOffset(@NotNull Editor editor, int linesOffset) { int line = EditorHelper.normalizeVisualLine(editor, editor.getCaretModel().getVisualPosition().line + linesOffset); return moveCaretToLineStartSkipLeading(editor, EditorHelper.visualLineToLogicalLine(editor, line)); @@ -1072,8 +1088,8 @@ public class MotionGroup { return moveCaretToLineEndSkipLeading(editor, logicalLine); } - public int moveCaretToLineEndSkipLeadingOffset(@NotNull Editor editor, int linesOffset) { - int line = EditorHelper.normalizeVisualLine(editor, editor.getCaretModel().getVisualPosition().line + linesOffset); + public int moveCaretToLineEndSkipLeadingOffset(@NotNull Editor editor, @NotNull Caret caret, int linesOffset) { + int line = EditorHelper.normalizeVisualLine(editor, caret.getVisualPosition().line + linesOffset); return moveCaretToLineEndSkipLeading(editor, EditorHelper.visualLineToLogicalLine(editor, line)); } @@ -1108,22 +1124,36 @@ public class MotionGroup { allowPastEnd); } - public int moveCaretToLineEndOffset(@NotNull Editor editor, int cntForward, boolean allowPastEnd) { - int line = EditorHelper.normalizeVisualLine(editor, editor.getCaretModel().getVisualPosition().line + cntForward); + public int moveCaretToLineEndOffset(@NotNull Editor editor, @NotNull Caret caret, int cntForward, boolean allowPastEnd) { + int line = EditorHelper.normalizeVisualLine(editor, caret.getVisualPosition().line + cntForward); if (line < 0) { return 0; } else { - return moveCaretToLineEnd(editor, EditorHelper.visualLineToLogicalLine(editor, line), allowPastEnd); + return moveCaretToLineEnd(editor, EditorHelper.visualLineToLogicalLine(editor, line), allowPastEnd); } } - public int moveCaretToLineStart(@NotNull Editor editor) { - int logicalLine = editor.getCaretModel().getLogicalPosition().line; + /** + * @deprecated To move the caret, use {@link #moveCaretToLineEndOffset(Editor, Caret, int, boolean)} + */ + public int moveCaretToLineEndOffset(@NotNull Editor editor, int cntForward, boolean allowPastEnd) { + return moveCaretToLineEndOffset(editor, editor.getCaretModel().getPrimaryCaret(), cntForward, allowPastEnd); + } + + public int moveCaretToLineStart(@NotNull Editor editor, @NotNull Caret caret) { + int logicalLine = caret.getLogicalPosition().line; return moveCaretToLineStart(editor, logicalLine); } + /** + * @deprecated To move the caret, use {@link #moveCaretToLineStart(Editor, Caret)} + */ + public int moveCaretToLineStart(@NotNull Editor editor) { + return moveCaretToLineStart(editor, editor.getCaretModel().getPrimaryCaret()); + } + public int moveCaretToLineStart(@NotNull Editor editor, int line) { if (line >= EditorHelper.getLineCount(editor)) { return EditorHelper.getFileSize(editor); diff --git a/src/com/maddyhome/idea/vim/helper/SearchHelper.java b/src/com/maddyhome/idea/vim/helper/SearchHelper.java index 0bf8d94e9..16df52791 100644 --- a/src/com/maddyhome/idea/vim/helper/SearchHelper.java +++ b/src/com/maddyhome/idea/vim/helper/SearchHelper.java @@ -24,6 +24,7 @@ import com.intellij.lang.Commenter; import com.intellij.lang.Language; import com.intellij.lang.LanguageCommenters; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; @@ -1183,18 +1184,19 @@ public class SearchHelper { * This locates the position with the document of the count-th occurrence of ch on the current line * * @param editor The editor to search in + * @param caret The caret to be searched starting from * @param count The number of occurrences of ch to locate. Negative for backward searches * @param ch The character on the line to find * @return The document offset of the matching character match, -1 */ - public static int findNextCharacterOnLine(@NotNull Editor editor, int count, char ch) { - int line = editor.getCaretModel().getLogicalPosition().line; + public static int findNextCharacterOnLine(@NotNull Editor editor, @NotNull Caret caret, int count, char ch) { + int line = caret.getLogicalPosition().line; int start = EditorHelper.getLineStartOffset(editor, line); int end = EditorHelper.getLineEndOffset(editor, line, true); CharSequence chars = editor.getDocument().getCharsSequence(); int found = 0; int step = count >= 0 ? 1 : -1; - int pos = editor.getCaretModel().getOffset() + step; + int pos = caret.getOffset() + step; while (pos >= start && pos < end && pos >= 0 && pos < chars.length()) { if (chars.charAt(pos) == ch) { found++; diff --git a/test/org/jetbrains/plugins/ideavim/action/MultiCaretTest.java b/test/org/jetbrains/plugins/ideavim/action/MultiCaretTest.java deleted file mode 100644 index adf6fc39e..000000000 --- a/test/org/jetbrains/plugins/ideavim/action/MultiCaretTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.jetbrains.plugins.ideavim.action; - -import com.intellij.openapi.editor.Editor; -import org.jetbrains.plugins.ideavim.VimTestCase; - -import static com.maddyhome.idea.vim.helper.StringHelper.parseKeys; - -public class MultiCaretTest extends VimTestCase { - public void testMultipleCaretsInsert() { - Editor editor = typeTextInFile(parseKeys("ix"), - "a<caret>b<caret>c<caret>d"); - myFixture.checkResult("ax<caret>bx<caret>cx<caret>d"); - } - - public void testMultipleCaretsLeftMove() { - Editor editor = typeTextInFile(parseKeys("3h"), - "abc<caret>de<caret>"); - myFixture.checkResult("<caret>ab<caret>cde"); - } - - public void testMultipleCaretsRightMove() { - Editor editor = typeTextInFile(parseKeys("l"), - "ab<caret>cd<caret>ef"); - myFixture.checkResult("abc<caret>de<caret>f"); - } - - public void testMutlipleCaretsUpMove() { - Editor editor = typeTextInFile(parseKeys("2k"), - "one two\n" + - "three four\n" + - "fi<caret>ve<caret> six<caret> seven\n"); - myFixture.checkResult("on<caret>e <caret>two<caret>\n" + - "three four\n" + - "five six seven\n"); - } - - public void testMultipleCaretsDownMove() { - Editor editor = typeTextInFile(parseKeys("2j"), - "on<caret>e <caret>two<caret>\n" + - "three four\n" + - "five six seven\n"); - myFixture.checkResult("one two\n" + - "three four\n" + - "fi<caret>ve<caret> si<caret>x seven"); - } - - public void testMultipleCaretsMovementMerging() { - Editor editor = typeTextInFile(parseKeys("2h"), - "o<caret>n<caret>e"); - assertEquals(1, editor.getCaretModel().getCaretCount()); - myFixture.checkResult("<caret>one"); - } -} diff --git a/test/org/jetbrains/plugins/ideavim/action/MultipleCaretsTest.java b/test/org/jetbrains/plugins/ideavim/action/MultipleCaretsTest.java new file mode 100644 index 000000000..9143897dc --- /dev/null +++ b/test/org/jetbrains/plugins/ideavim/action/MultipleCaretsTest.java @@ -0,0 +1,142 @@ +package org.jetbrains.plugins.ideavim.action; + +import com.intellij.openapi.editor.Editor; +import org.jetbrains.plugins.ideavim.VimTestCase; + +import static com.maddyhome.idea.vim.helper.StringHelper.parseKeys; + +/** + * @author Vasily Alferov + */ +public class MultipleCaretsTest extends VimTestCase { + // com.maddyhome.idea.vim.action.motion.leftright + + public void testMotionLeftAction() { + typeTextInFile(parseKeys("3h"), + "abc<caret>de<caret>"); + myFixture.checkResult("<caret>ab<caret>cde"); + } + + public void testMotionRightAction() { + typeTextInFile(parseKeys("l"), + "ab<caret>cd<caret>ef"); + myFixture.checkResult("abc<caret>de<caret>f"); + } + + public void testMovementMerging() { + Editor editor = typeTextInFile(parseKeys("2h"), + "o<caret>n<caret>e"); + assertEquals(1, editor.getCaretModel().getCaretCount()); + myFixture.checkResult("<caret>one"); + } + + public void testMotionColumnAction() { + typeTextInFile(parseKeys("4|"), + "one<caret> two\n" + + "three four fiv<caret>e\n" + + "si<caret>x seven<caret>\n" + + "<caret>eig<caret>ht nine ten<caret>"); + myFixture.checkResult("one<caret> two\n" + + "thr<caret>ee four five\n" + + "six<caret> seven\n" + + "eig<caret>ht nine ten"); + } + + public void testMotionFirstColumnAction() { + typeTextInFile(parseKeys("0"), + "one<caret> two\n" + + "three four fiv<caret>e\n" + + "si<caret>x seven<caret>\n" + + "<caret>eig<caret>ht nine te<caret>n"); + myFixture.checkResult("<caret>one two\n" + + "<caret>three four five\n" + + "<caret>six seven\n" + + "<caret>eight nine ten"); + } + + public void testMotionFirstNonSpaceAction() { + typeTextInFile(parseKeys("^"), + " one<caret> two\n" + + "three<caret> four\n" + + " five<caret> six\n" + + " <caret> seven eight"); + myFixture.checkResult(" <caret>one two\n" + + "<caret>three four\n" + + " <caret>five six\n" + + " <caret>seven eight"); + } + + public void testMotionLastNonSpaceAction() { + typeTextInFile(parseKeys("g_"), + "one<caret> two \n" + + "three<caret> four \n" + + " five si<caret>x\n" + + "seven eight <caret> \n"); + myFixture.checkResult("one tw<caret>o \n" + + "three fou<caret>r \n" + + " five si<caret>x\n" + + "seven eigh<caret>t \n"); + } + + public void testMotionLastColumnAction() { + typeTextInFile(parseKeys("$"), + "one <caret>two\n" + + "three fou<caret>r"); + myFixture.checkResult("one tw<caret>o\n" + + "three fou<caret>r"); + } + + public void testMotionLeftMatchCharAction() { + typeTextInFile(parseKeys("2Fa"), + "a<caret>a<caret>abab<caret>ab<caret>ab<caret>b<caret>x"); + myFixture.checkResult("<caret>a<caret>a<caret>ab<caret>ab<caret>ababbx"); + } + + public void testMotionRightMatchCharAction() { + typeTextInFile(parseKeys("2fb"), + "a<caret>a<caret>abab<caret>ab<caret>ab<caret>b<caret>x"); + myFixture.checkResult("aaaba<caret>baba<caret>b<caret>b<caret>x"); + } + + public void testMotionLeftTillMatchCharAction() { + typeTextInFile(parseKeys("2Ta"), + "b<caret>a<caret>ba<caret>a<caret>a<caret>ba<caret>b"); + myFixture.checkResult("b<caret>a<caret>ba<caret>a<caret>a<caret>bab"); + } + + public void testMotionRightTillMatchCharAction() { + typeTextInFile(parseKeys("2ta"), + "<caret>b<caret>a<caret>b<caret>a<caret>a<caret>a<caret>ba<caret>b"); + myFixture.checkResult("ba<caret>b<caret>a<caret>a<caret>a<caret>ba<caret>b"); + } + + public void testMotionLastLeftMatchChar() { + typeTextInFile(parseKeys("Fa;"), + "a<caret>a<caret>abab<caret>ab<caret>ab<caret>b<caret>x"); + myFixture.checkResult("<caret>aa<caret>ab<caret>ab<caret>ababbx"); + } + + public void testMotionLastRightMatchChar() { + typeTextInFile(parseKeys("fb;"), + "<caret>a<caret>aabab<caret>ab<caret>ab<caret>b<caret>x"); + myFixture.checkResult("aaaba<caret>baba<caret>b<caret>b<caret>x"); + } + + public void testMotionLastLeftTillMatchChar() { + typeTextInFile(parseKeys("Ta,"), + "b<caret>aba<caret>a<caret>a<caret>ba<caret>b"); + myFixture.checkResult("ba<caret>baa<caret>a<caret>ba<caret>b"); + } + + public void testMotionLastRightTillMatchChar() { + typeTextInFile(parseKeys("ta;"), + "<caret>b<caret>a<caret>b<caret>a<caret>a<caret>a<caret>ba<caret>b"); + myFixture.checkResult("ba<caret>b<caret>a<caret>aa<caret>ba<caret>b"); + } + + public void testMotionLastMatchCharReverse() { + typeTextInFile(parseKeys("fa", "2;", "3,"), + "abaab<caret>a<caret>baaa<caret>abaaba"); + myFixture.checkResult("abaab<caret>abaaa<caret>abaaba"); + } +}