(defun window-recenter-region-start-position (&optional from to window buffer) "Return window start position for recentered region. WINDOW specifies the window whose start position to return and defaults to the selected window. BUFFER specifies the buffer that contains the region and defaults to WINDOW's buffer. FROM and TO specify the beginning and end of the region in BUFFER and default to the active region or the entire text of BUFFER." (let* ((window (or window (selected-window))) (buffer (or buffer (window-buffer))) (from (or from (and (eq buffer (current-buffer)) (region-active-p) (region-beginning)) (with-current-buffer buffer (point-min)))) (to (or to (and (eq buffer (current-buffer)) (region-active-p) (region-end)) (with-current-buffer buffer (point-max)))) (body-width (window-body-width window)) (body-height (window-body-height window)) old-buffer old-start old-point height start) (unless (eq (window-buffer window) buffer) (setq old-buffer (window-buffer window)) (setq old-start (window-start window)) (setq old-point (window-point window)) (set-window-buffer window buffer)) (setq height (/ (cdr (window-text-pixel-size window from to body-width body-height)) (frame-char-height (window-frame window)))) (save-excursion (goto-char from) (when (<= height body-height) (forward-line (- (max (/ (- body-height height) 2) 0)))) (setq start (pos-bol))) (when old-buffer (set-window-buffer window old-buffer) (set-window-point window old-point) (set-window-start window old-point)) start)) (defun recenter-region () (interactive) (mark-paragraph) (set-window-start (selected-window) (window-recenter-region-start-position)))