public List<Integer> getOrderedLines(@NotNull Editor editor, @NotNull DataContext context, @NotNull CaretOrder caretOrder) { final ArrayList<Integer> lines = new ArrayList<>(editor.getCaretModel().getCaretCount()); for (Caret caret : EditorHelper.getOrderedCaretsList(editor, caretOrder)) { final int line = getLine(editor, caret, context); lines.add(line); } return lines; }
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); } }
/** * 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); }
final int[] rangeEndOffsets = range.getEndOffsets(); if (selectionType == SelectionType.LINE_WISE) { final List<Pair.NonNull<Integer, Integer>> ranges = new ArrayList<>(caretModel.getCaretCount()); for (int i = 0; i < caretModel.getCaretCount(); i++) { ranges.add(Pair.createNonNull(EditorHelper.getLineStartForOffset(editor, rangeStartOffsets[i]), EditorHelper.getLineEndForOffset(editor, rangeEndOffsets[i]) + 1)); final Map<Caret, Integer> startOffsets = new HashMap<>(caretModel.getCaretCount()); if (type == SelectionType.BLOCK_WISE) { startOffsets.put(caretModel.getPrimaryCaret(), range.normalize().getStartOffset());
/** * This yanks the text moved over by the motion command argument. * * @param editor The editor to yank from * @param context The data context * @param count The number of times to yank * @param rawCount The actual count entered by the user * @param argument The motion command argument * @return true if able to yank the text, false if not */ public boolean yankMotion(@NotNull Editor editor, DataContext context, int count, int rawCount, @NotNull Argument argument) { final Command motion = argument.getMotion(); if (motion == null) return false; final CaretModel caretModel = editor.getCaretModel(); final List<Pair.NonNull<Integer, Integer>> ranges = new ArrayList<>(caretModel.getCaretCount()); final Map<Caret, Integer> startOffsets = new HashMap<>(caretModel.getCaretCount()); for (Caret caret : caretModel.getAllCarets()) { final TextRange motionRange = MotionGroup.getMotionRange(editor, caret, context, count, rawCount, argument, true); if (motionRange == null) continue; assert motionRange.size() == 1; ranges.add(Pair.createNonNull(motionRange.getStartOffset(), motionRange.getEndOffset())); startOffsets.put(caret, motionRange.normalize().getStartOffset()); } final SelectionType type = SelectionType.fromCommandFlags(motion.getFlags()); final TextRange range = getTextRange(ranges, type); final SelectionType selectionType = type == SelectionType.CHARACTER_WISE && range.isMultiple() ? SelectionType.BLOCK_WISE : type; return yankRange(editor, range, selectionType, startOffsets); }
final ArrayList<Pair.NonNull<Integer, Integer>> ranges = new ArrayList<>(caretModel.getCaretCount()); final List<Integer> endLines = new ArrayList<>(caretModel.getCaretCount()); final int[] starts = new int[caretModel.getCaretCount()]; final int[] ends = new int[caretModel.getCaretCount()]; for (int i = 0; i < ranges.size(); i++) { final Pair.NonNull<Integer, Integer> subRange = ranges.get(i);
public boolean deleteCharacter(@NotNull Editor editor, int count, boolean isChange) { final int caretCount = editor.getCaretModel().getCaretCount(); final List<Integer> startOffsets = Lists.newArrayListWithCapacity(caretCount); final List<Integer> endOffsets = Lists.newArrayListWithCapacity(caretCount); final List<Caret> carets = EditorHelper.getOrderedCaretsList(editor, count > 0 ? CaretOrder.DECREASING_OFFSET : CaretOrder.INCREASING_OFFSET); boolean result = true; for (int i = 0; i < caretCount; i++) { final Caret caret = carets.get(i); final int endOffset = VimPlugin.getMotion().moveCaretHorizontal(editor, caret, count, true); if (endOffset == -1) { result = false; continue; } final int startOffset = caret.getOffset(); startOffsets.add(startOffset); endOffsets.add(endOffset); result = deleteText(editor, new TextRange(startOffset, endOffset), SelectionType.CHARACTER_WISE); final int normalizeOffset = EditorHelper.normalizeOffset(editor, caret.getLogicalPosition().line, startOffset, isChange); if (normalizeOffset != startOffset) MotionGroup.moveCaret(editor, caret, normalizeOffset); } if (caretCount > 1 && result) { final TextRange range = new TextRange(ArrayUtil.toIntArray(startOffsets), ArrayUtil.toIntArray(endOffsets)); VimPlugin.getRegister().storeText(editor, range, range.isMultiple() ? SelectionType.LINE_WISE : SelectionType.CHARACTER_WISE, true); } return result; }
final List<Caret> carets = EditorHelper.getOrderedCaretsList(editor, CaretOrder.DECREASING_OFFSET); final CaretModel caretModel = editor.getCaretModel(); final int caretCount = caretModel.getCaretCount();
public void testMovementMerging() { Editor editor = typeTextInFile(parseKeys("2h"), "o<caret>n<caret>e"); assertEquals(1, editor.getCaretModel().getCaretCount()); myFixture.checkResult("<caret>one"); }
if (CommandState.getInstance(editor).getMode() != CommandState.Mode.VISUAL) { if (rawCount > 0) { if (editor.getCaretModel().getCaretCount() > 1) { return false;