void (@NotNull Editor editor, int lineShift, int columnShift, boolean moveCaret) { if (lineShift != 0) { editor.getScrollingModel().scrollVertically( editor.getScrollingModel().getVerticalScrollOffset() + lineShift * editor.getLineHeight() ); } if (columnShift != 0) { editor.getScrollingModel().scrollHorizontally( editor.getScrollingModel().getHorizontalScrollOffset() + columnShift * EditorUtil.getSpaceWidth(Font.PLAIN, editor) ); } if (!moveCaret) { return; } Rectangle viewRectangle = getVisibleArea(editor); int lineNumber = editor.getCaretModel().getVisualPosition().line; VisualPosition startPos = editor.xyToVisualPosition(new Point(0, viewRectangle.y)); int start = startPos.line + 1; VisualPosition endPos = editor.xyToVisualPosition(new Point(0, viewRectangle.y + viewRectangle.height)); int end = endPos.line - 2; if (lineNumber < start) { editor.getCaretModel().moveCaretRelatively(0, start - lineNumber, false, false, true); } else if (lineNumber > end) { editor.getCaretModel().moveCaretRelatively(0, end - lineNumber, false, false, true); } }