/** * Get list of all carets from the editor. * * @param editor The editor from which the carets are taken * @param order Order in which the carets are given. */ @NotNull public static List<Caret> getOrderedCaretsList(@NotNull Editor editor, @NotNull CaretOrder order) { @NotNull List<Caret> carets = editor.getCaretModel().getAllCarets(); if (order == CaretOrder.INCREASING_OFFSET) { carets.sort(Comparator.comparingInt(Caret::getOffset)); } else if (order == CaretOrder.DECREASING_OFFSET) { carets.sort(Comparator.comparingInt(Caret::getOffset)); Collections.reverse(carets); } return carets; }
/** * Clears all the keystrokes from the current insert command * * @param editor The editor to clear strokes from. */ private void clearStrokes(@NotNull Editor editor) { strokes.clear(); repeatCharsCount = 0; for (Caret caret : editor.getCaretModel().getAllCarets()) { CaretData.setInsertStart(caret, caret.getOffset()); } }
/** * This repeats the previous insert count times * * @param editor The editor to insert into * @param context The data context * @param count The number of times to repeat the previous insert */ private void repeatInsertText(@NotNull Editor editor, @NotNull DataContext context, int count) { if (lastStrokes == null) { return; } for (Caret caret : editor.getCaretModel().getAllCarets()) { for (int i = 0; i < count; i++) { for (Object lastStroke : lastStrokes) { if (lastStroke instanceof AnAction) { KeyHandler.executeAction((AnAction)lastStroke, context); strokes.add(lastStroke); } else if (lastStroke instanceof char[]) { final char[] chars = (char[])lastStroke; insertText(editor, caret, new String(chars)); } } } } }
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) { boolean result = true; for (Caret caret : editor.getCaretModel().getAllCarets()) { final int line = caret.getLogicalPosition().line; if (!VimPlugin.getSearch().searchAndReplace(editor, caret, new LineRange(line, line), "s", "//~/")) { result = false; } } return result; } }
/** * Begin insert before the start of the current line * * @param editor The editor to insert into * @param context The data context */ public void insertLineStart(@NotNull Editor editor, @NotNull DataContext context) { for (Caret caret : editor.getCaretModel().getAllCarets()) { MotionGroup.moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineStart(editor, caret)); } initInsert(editor, context, CommandState.Mode.INSERT); }
/** * Begin insert before the first non-blank on the current line * * @param editor The editor to insert into */ public void insertBeforeFirstNonBlank(@NotNull Editor editor, @NotNull DataContext context) { for (Caret caret : editor.getCaretModel().getAllCarets()) { MotionGroup.moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineStartSkipLeading(editor, caret)); } initInsert(editor, context, CommandState.Mode.INSERT); }
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { if (CommandState.inVisualBlockMode(editor)) { return VimPlugin.getMotion().swapVisualBlockEnds(editor); } boolean ret = true; for (Caret caret : editor.getCaretModel().getAllCarets()) { ret = ret && VimPlugin.getMotion().swapVisualEnds(editor, caret); } return ret; } });
/** * Begin insert after the cursor position * * @param editor The editor to insert into * @param context The data context */ public void insertAfterCursor(@NotNull Editor editor, @NotNull DataContext context) { for (Caret caret : editor.getCaretModel().getAllCarets()) { MotionGroup.moveCaret(editor, caret, VimPlugin.getMotion().moveCaretHorizontal(editor, caret, 1, true)); } initInsert(editor, context, CommandState.Mode.INSERT); }
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException { boolean result = true; for (Caret caret : editor.getCaretModel().getAllCarets()) { final LineRange lineRange = cmd.getLineRange(editor, caret, context); if (!VimPlugin.getSearch().searchAndReplace(editor, caret, lineRange, cmd.getCommand(), cmd.getArgument())) { result = false; } } return result; } }
public void insertAfterLineEnd(@NotNull Editor editor, @NotNull DataContext context) { for (Caret caret : editor.getCaretModel().getAllCarets()) { MotionGroup.moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineEnd(editor, caret)); } initInsert(editor, context, CommandState.Mode.INSERT); }
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { if (CommandState.inVisualBlockMode(editor)) { return VimPlugin.getMotion().swapVisualBlockEnds(editor); } else { boolean ret = true; for (Caret caret : editor.getCaretModel().getAllCarets()) { ret = ret && VimPlugin.getMotion().swapVisualEnds(editor, caret); } return ret; } } });
private int putTextLinewise(@NotNull Editor editor, @NotNull Caret caret, @NotNull DataContext context, @NotNull String text, @NotNull SelectionType type, @NotNull CommandState.SubMode mode, int startOffset, int count, boolean indent, boolean cursorAfter) { final CaretModel caretModel = editor.getCaretModel(); final ArrayList<Caret> overlappedCarets = new ArrayList<>(caretModel.getCaretCount()); for (Caret possiblyOverlappedCaret : caretModel.getAllCarets()) { if (possiblyOverlappedCaret.getOffset() != startOffset || possiblyOverlappedCaret == caret) continue; MotionGroup.moveCaret(editor, possiblyOverlappedCaret, VimPlugin.getMotion().moveCaretHorizontal(editor, possiblyOverlappedCaret, 1, true)); overlappedCarets.add(possiblyOverlappedCaret); } final int endOffset = putTextCharacterwise(editor, caret, context, text, type, mode, startOffset, count, indent, cursorAfter); for (Caret overlappedCaret : overlappedCarets) { MotionGroup.moveCaret(editor, overlappedCaret, VimPlugin.getMotion().moveCaretHorizontal(editor, overlappedCaret, -1, true)); } return endOffset; }
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException { final String argument = cmd.getArgument(); final RegisterGroup registerGroup = VimPlugin.getRegister(); final char register; if (argument.length() > 0 && !Character.isDigit(argument.charAt(0))) { register = argument.charAt(0); cmd.setArgument(argument.substring(1)); } else { register = registerGroup.getDefaultRegister(); } if (!registerGroup.selectRegister(register)) return false; final CaretModel caretModel = editor.getCaretModel(); final List<Integer> starts = newArrayListWithCapacity(caretModel.getCaretCount()); final List<Integer> ends = newArrayListWithCapacity(caretModel.getCaretCount()); for (Caret caret : caretModel.getAllCarets()) { final TextRange range = cmd.getTextRange(editor, caret, context, true); starts.add(range.getStartOffset()); ends.add(range.getEndOffset() - 1); } return VimPlugin.getCopy().yankRange(editor, new TextRange(ArrayUtil.toIntArray(starts), ArrayUtil.toIntArray(ends)), SelectionType.LINE_WISE, false); } }
/** * Begin insert after the current line by creating a new blank line below the current line * for all carets * * @param editor The editor to insert into * @param context The data context */ public void insertNewLineBelow(@NotNull final Editor editor, @NotNull final DataContext context) { if (editor.isOneLineMode()) return; for (Caret caret : editor.getCaretModel().getAllCarets()) { MotionGroup.moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineEnd(editor, caret)); } initInsert(editor, context, CommandState.Mode.INSERT); runEnterAction(editor, context); }
/** * This yanks count lines of text * * @param editor The editor to yank from * @param count The number of lines to yank * @return true if able to yank the lines, false if not */ public boolean yankLine(@NotNull Editor editor, int count) { final CaretModel caretModel = editor.getCaretModel(); final List<Pair.NonNull<Integer, Integer>> ranges = new ArrayList<>(caretModel.getCaretCount()); for (Caret caret : caretModel.getAllCarets()) { final int start = VimPlugin.getMotion().moveCaretToLineStart(editor, caret); final int end = Math.min(VimPlugin.getMotion().moveCaretToLineEndOffset(editor, caret, count - 1, true) + 1, EditorHelper.getFileSize(editor)); if (end == -1) continue; ranges.add(Pair.createNonNull(start, end)); } final TextRange range = getTextRange(ranges, SelectionType.LINE_WISE); return yankRange(editor, range, SelectionType.LINE_WISE, null); }
public void assertOffset(int... expectedOffsets) { final List<Caret> carets = myFixture.getEditor().getCaretModel().getAllCarets(); assertEquals("Wrong amount of carets", expectedOffsets.length, carets.size()); for (int i = 0; i < expectedOffsets.length; i++) { assertEquals(expectedOffsets[i], carets.get(i).getOffset()); } }
/** * Begin insert before the current line by creating a new blank line above the current line * for all carets * * @param editor The editor to insert into */ public void insertNewLineAbove(@NotNull final Editor editor, @NotNull DataContext context) { if (editor.isOneLineMode()) return; for (Caret caret : editor.getCaretModel().getAllCarets()) { if (caret.getVisualPosition().line == 0) { MotionGroup.moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineStart(editor, caret)); CaretData.setWasInFirstLine(caret, true); } else { MotionGroup.moveCaret(editor, caret, VimPlugin.getMotion().moveCaretVertical(editor, caret, -1)); MotionGroup.moveCaret(editor, caret, VimPlugin.getMotion().moveCaretToLineEnd(editor, caret)); } } initInsert(editor, context, CommandState.Mode.INSERT); runEnterAction(editor, context); for (Caret caret : editor.getCaretModel().getAllCarets()) { if (CaretData.wasInFirstLine(caret)) { CaretData.setWasInFirstLine(caret, false); MotionGroup.moveCaret(editor, caret, VimPlugin.getMotion().moveCaretVertical(editor, caret, -1)); } } }
public int moveCaretToMark(@NotNull Editor editor, char ch, boolean toLineStart) { final Mark mark = VimPlugin.getMark().getMark(editor, ch); if (mark == null) return -1; final VirtualFile vf = EditorData.getVirtualFile(editor); if (vf == null) return -1; final int line = mark.getLogicalLine(); if (vf.getPath().equals(mark.getFilename())) { return toLineStart ? moveCaretToLineStartSkipLeading(editor, line) : editor.logicalPositionToOffset(new LogicalPosition(line, mark.getCol())); } final Editor selectedEditor = selectEditor(editor, mark); if (selectedEditor != null) { for (Caret caret : selectedEditor.getCaretModel().getAllCarets()) { moveCaret(selectedEditor, caret, toLineStart ? moveCaretToLineStartSkipLeading(selectedEditor, line) : selectedEditor.logicalPositionToOffset( new LogicalPosition(line, mark.getCol()))); } } return -2; }
public void resetVisual(@NotNull final Editor editor, final boolean removeSelection) { final boolean wasVisualBlock = CommandState.inVisualBlockMode(editor); final SelectionType selectionType = SelectionType.fromSubMode(CommandState.getInstance(editor).getSubMode()); EditorData.setLastSelectionType(editor, selectionType); final TextRange visualMarks = VimPlugin.getMark().getVisualSelectionMarks(editor); if (visualMarks != null) { EditorData.setLastVisualRange(editor, visualMarks); } if (removeSelection) { if (!EditorData.isKeepingVisualOperatorAction(editor)) { for (Caret caret : editor.getCaretModel().getAllCarets()) { caret.removeSelection(); } } if (wasVisualBlock) { editor.getCaretModel().removeSecondaryCarets(); } } CommandState.getInstance(editor).setSubMode(CommandState.SubMode.NONE); }
public void start() { logger.debug("start"); wasRepeat = CommandState.getInstance(editor).getMode() == CommandState.Mode.REPEAT; EditorData.setKeepingVisualOperatorAction(editor, (cmd.getFlags() & Command.FLAG_EXIT_VISUAL) == 0); if (myRunForEachCaret) { for (Caret caret : editor.getCaretModel().getAllCarets()) { startForCaret(caret); } } else { startForCaret(editor.getCaretModel().getPrimaryCaret()); } // If this is a mutli key change then exit visual now if (cmd != null && (cmd.getFlags() & Command.FLAG_MULTIKEY_UNDO) != 0) { logger.debug("multikey undo - exit visual"); VimPlugin.getMotion().exitVisual(editor); } else if (cmd != null && (cmd.getFlags() & Command.FLAG_FORCE_LINEWISE) != 0) { lastMode = CommandState.getInstance(editor).getSubMode(); if (lastMode != CommandState.SubMode.VISUAL_LINE && (cmd.getFlags() & Command.FLAG_FORCE_VISUAL) != 0) { VimPlugin.getMotion().toggleVisual(editor, 1, 0, CommandState.SubMode.VISUAL_LINE); } } }