void (@NotNull Editor editor, boolean isWithSelection) { Document document = editor.getDocument(); SelectionModel selectionModel = editor.getSelectionModel(); int selectionStart = selectionModel.getLeadSelectionOffset(); CaretModel caretModel = editor.getCaretModel(); LogicalPosition blockSelectionStart = caretModel.getLogicalPosition(); EditorSettings editorSettings = editor.getSettings(); int logCaretLine = caretModel.getLogicalPosition().line; VisualPosition currentVisCaret = caretModel.getVisualPosition(); VisualPosition caretLogLineStartVis = editor.offsetToVisualPosition(document.getLineStartOffset(logCaretLine)); if (currentVisCaret.line > caretLogLineStartVis.line) { // Caret is located not at the first visual line of soft-wrapped logical line. if (editorSettings.isSmartHome()) { moveCaretToStartOfSoftWrappedLine(editor, currentVisCaret); } else { caretModel.moveToVisualPosition(new VisualPosition(currentVisCaret.line, 0)); } setupSelection(editor, isWithSelection, selectionStart, blockSelectionStart); EditorModificationUtil.scrollToCaret(editor); return; } // Skip folded lines. int logLineToUse = logCaretLine - 1; while (logLineToUse >= 0 && editor.offsetToVisualPosition(document.getLineEndOffset(logLineToUse)).line == currentVisCaret.line) { logLineToUse--; } logLineToUse++; if (logLineToUse >= document.getLineCount() || !editorSettings.isSmartHome()) { editor.getCaretModel().moveToLogicalPosition(new LogicalPosition(logLineToUse, 0)); } else if (logLineToUse == logCaretLine) { int line = currentVisCaret.line; int column; if (currentVisCaret.column == 0) { column = findSmartIndentColumn(editor, currentVisCaret.line); } else { column = findFirstNonSpaceColumnOnTheLine(editor, currentVisCaret.line); if (column >= currentVisCaret.column) { column = 0; } } caretModel.moveToVisualPosition(new VisualPosition(line, Math.max(column, 0))); } else { LogicalPosition logLineEndLog = editor.offsetToLogicalPosition(document.getLineEndOffset(logLineToUse)); VisualPosition logLineEndVis = editor.logicalToVisualPosition(logLineEndLog); int softWrapCount = EditorUtil.getSoftWrapCountAfterLineStart(editor, logLineEndLog); if (softWrapCount > 0) { moveCaretToStartOfSoftWrappedLine(editor, logLineEndVis); } else { int line = logLineEndVis.line; int column = 0; if (currentVisCaret.column > 0) { int firstNonSpaceColumnOnTheLine = Math.max(0, findFirstNonSpaceColumnOnTheLine(editor, currentVisCaret.line)); if (firstNonSpaceColumnOnTheLine < currentVisCaret.column) { column = firstNonSpaceColumnOnTheLine; } } caretModel.moveToVisualPosition(new VisualPosition(line, column)); } } setupSelection(editor, isWithSelection, selectionStart, blockSelectionStart); EditorModificationUtilEx.scrollToCaret(editor); }