void (@NotNull Editor editor, @NotNull CaretStopPolicy caretStopPolicy, boolean isWithSelection, boolean isCamel) { SelectionModel selectionModel = editor.getSelectionModel(); int selectionStart = selectionModel.getLeadSelectionOffset(); CaretModel caretModel = editor.getCaretModel(); LogicalPosition blockSelectionStart = caretModel.getLogicalPosition(); int offset = editor.getCaretModel().getOffset(); if (offset == 0) return; int newOffset; FoldRegion currentFoldRegion = editor.getFoldingModel().getCollapsedRegionAtOffset(offset - 1); if (currentFoldRegion != null) { newOffset = currentFoldRegion.getStartOffset(); } else { newOffset = getPreviousCaretStopOffset(editor, caretStopPolicy, isCamel); if (newOffset == offset) return; FoldRegion foldRegion = editor.getFoldingModel().getCollapsedRegionAtOffset(newOffset); if (foldRegion != null && newOffset > foldRegion.getStartOffset()) { newOffset = foldRegion.getEndOffset(); } } if (editor instanceof EditorImpl) { int boundaryOffset = ((EditorImpl)editor).findNearestDirectionBoundary(offset, false); if (boundaryOffset >= 0) { newOffset = Math.max(boundaryOffset, newOffset); } caretModel.moveToLogicalPosition(editor.offsetToLogicalPosition(newOffset).leanForward(true)); } else { editor.getCaretModel().moveToOffset(newOffset); } EditorModificationUtilEx.scrollToCaret(editor); setupSelection(editor, isWithSelection, selectionStart, blockSelectionStart); }