moveMultiCursorsDown method
Moves every secondary cursor down one line, maintaining its column.
Folded regions are skipped exactly as they are for the primary cursor.
When isShiftPressed is true the secondary cursors are cleared.
Implementation
void moveMultiCursorsDown({bool isShiftPressed = false}) {
if (_multiCursors.isEmpty) return;
if (isShiftPressed) {
clearMultiCursors();
return;
}
final updated = <({int line, int character})>[];
for (final cursor in _multiCursors) {
final cursorLine = cursor.line.clamp(0, lineCount - 1);
if (cursorLine >= lineCount - 1) {
final lastLineText = getLineText(lineCount - 1);
updated.add((line: lineCount - 1, character: lastLineText.length));
continue;
}
final foldAtCurrent = _getFoldRangeAtCurrentLine(cursorLine);
int targetLine;
if (foldAtCurrent != null && foldAtCurrent.isFolded) {
targetLine = foldAtCurrent.endIndex + 1;
} else {
targetLine = cursorLine + 1;
}
while (targetLine < lineCount && _isLineInFoldedRegion(targetLine)) {
final foldStart = _getFoldStartForLine(targetLine);
if (foldStart != null) {
final fold = foldings[foldStart] ?? FoldRange(targetLine, targetLine);
targetLine = fold.endIndex + 1;
} else {
targetLine++;
}
}
if (targetLine >= lineCount) {
final lastLineText = getLineText(lineCount - 1);
updated.add((line: lineCount - 1, character: lastLineText.length));
continue;
}
final nextLineText = getLineText(targetLine);
final newChar = cursor.character.clamp(0, nextLineText.length);
updated.add((line: targetLine, character: newChar));
}
_updateMultiCursorsFromList(updated);
}