Compare commits
No commits in common. "509db9bbdef21063d18085140719b1ed2d8c8b16" and "c2524b420eb32a2b0085db431ef7de95fdc3c453" have entirely different histories.
509db9bbde
...
c2524b420e
@ -1,4 +1,4 @@
|
||||
;;; center-content.el --- Center buffer content -*- lexical-binding: t; -*-
|
||||
;;; center-content.el --- Center buffer content horizontally and vertically -*- lexical-binding: t; -*-
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
@ -9,45 +9,13 @@
|
||||
|
||||
(require 'face-remap)
|
||||
|
||||
(defgroup center-content ()
|
||||
"Center buffer content."
|
||||
:group 'convenience
|
||||
:prefix "center-content-")
|
||||
|
||||
(defcustom center-content-horizontal t
|
||||
"Enable horizontal centering."
|
||||
:type 'boolean
|
||||
:group 'center-content)
|
||||
|
||||
(defcustom center-content-vertical t
|
||||
"Enable vertical centering."
|
||||
:type 'boolean
|
||||
:group 'center-content)
|
||||
|
||||
(defcustom center-content-vertical-by-overlay nil
|
||||
"Enable vertical by using overlays.
|
||||
|
||||
Using overlays for vertical centering may give some undesirable
|
||||
effects on the first line. By default, vertical centering is achieved
|
||||
by using setting `header-line-format'."
|
||||
:type 'boolean
|
||||
:group 'center-content)
|
||||
|
||||
(defcustom center-content-hide-mode-line nil
|
||||
"Hide mode-line when centering."
|
||||
:type 'boolean
|
||||
:group 'center-content)
|
||||
|
||||
(defvar-local center-content--horizontal-overlay nil
|
||||
"Overlay used to add left margin for horizontal centering.")
|
||||
|
||||
(defvar-local center-content--vertical-overlay nil
|
||||
"Overlay used to add top margin for vertical centering.")
|
||||
|
||||
(defvar-local center-content--original-header-line-format header-line-format
|
||||
(defvar-local center-content--original-header-line-format nil
|
||||
"Stores the original `header-line-format` to restore upon disabling.")
|
||||
|
||||
(defvar-local center-content--original-mode-line-format mode-line-format
|
||||
(defvar-local center-content--original-mode-line-format nil
|
||||
"Stores the original `mode-line-format` to restore upon disabling.")
|
||||
|
||||
(defvar-local center-content--header-line-face-remap-cookie nil
|
||||
@ -55,7 +23,7 @@
|
||||
|
||||
(defun center-content--content-pixel-size ()
|
||||
"Return the size of the content of the visible text in pixels."
|
||||
(window-text-pixel-size (selected-window) (window-start) (window-end nil t)))
|
||||
(window-text-pixel-size (selected-window) (window-start) (window-end)))
|
||||
|
||||
(defun center-content--calculate-left-margin (content-width)
|
||||
"Calculate the left margin relative to CONTENT-WIDTH."
|
||||
@ -69,44 +37,29 @@
|
||||
(line-height (default-line-height)))
|
||||
(/ (max 0 (- window-height content-height)) (* 2 line-height))))
|
||||
|
||||
(defun center-content--horizontal (content-width)
|
||||
"Add overlay for horizontal centering relative to CONTENT-WIDTH."
|
||||
(let* ((left-margin (center-content--calculate-left-margin content-width))
|
||||
(overlay (make-overlay (point-min) (point-max)))
|
||||
(space (propertize " " 'display `(space :width ,left-margin))))
|
||||
(overlay-put overlay 'line-prefix space)
|
||||
(setq center-content--horizontal-overlay overlay)))
|
||||
|
||||
(defun center-content--vertical (content-height)
|
||||
"Add overlay for vertical centering relative to CONTENT-HEIGHT."
|
||||
(let* ((top-margin (center-content--calculate-top-margin content-height)))
|
||||
;; Save and remap the header-line face to match the default face
|
||||
(setq center-content--header-line-face-remap-cookie
|
||||
(face-remap-add-relative 'header-line 'default))
|
||||
(setq header-line-format (propertize " " 'display `(height ,top-margin)))))
|
||||
|
||||
(defun center-content--vertical-by-overlay (content-height)
|
||||
"Add overlay for vertical centering relative to CONTENT-HEIGHT."
|
||||
(let* ((top-margin (center-content--calculate-top-margin content-height))
|
||||
(overlay (make-overlay (window-start) (window-start) nil t t))
|
||||
(space (propertize " " 'display `(space :width 0 :height ,top-margin))))
|
||||
(overlay-put overlay 'intangible t)
|
||||
(overlay-put overlay 'before-string space)
|
||||
(setq center-content--vertical-overlay overlay)))
|
||||
|
||||
(defun center-content--enable ()
|
||||
"Enable horizontal and vertical centering of content."
|
||||
(setq center-content--original-header-line-format header-line-format)
|
||||
(setq center-content--original-mode-line-format mode-line-format)
|
||||
(let* ((content-size (center-content--content-pixel-size)))
|
||||
(when center-content-horizontal
|
||||
(center-content--horizontal (car content-size)))
|
||||
(when center-content-vertical
|
||||
(if center-content-vertical-by-overlay
|
||||
(center-content--vertical-by-overlay (cdr content-size))
|
||||
(center-content--vertical (cdr content-size))))
|
||||
(when center-content-hide-mode-line
|
||||
(setq mode-line-format nil))))
|
||||
(let* ((content-size (center-content--content-pixel-size))
|
||||
(left-margin (center-content--calculate-left-margin (car content-size)))
|
||||
(top-margin (center-content--calculate-top-margin (cdr content-size))))
|
||||
;; Apply horizontal centering using overlay
|
||||
(let ((overlay (make-overlay (point-min) (point-max))))
|
||||
(overlay-put overlay 'line-prefix
|
||||
(propertize " " 'display `(space :width ,left-margin)))
|
||||
(setq center-content--horizontal-overlay overlay))
|
||||
;; Apply vertical centering using header-line-format
|
||||
;; Save and remap the header-line face to match the default face
|
||||
(setq center-content--original-header-line-format header-line-format)
|
||||
(setq center-content--header-line-face-remap-cookie
|
||||
(face-remap-add-relative 'header-line 'default))
|
||||
(setq header-line-format
|
||||
(propertize " " 'display `(height ,top-margin)))
|
||||
;; Save and hide the mode line
|
||||
(setq center-content--original-mode-line-format mode-line-format)
|
||||
(setq mode-line-format nil)
|
||||
;; Force redisplay
|
||||
(force-mode-line-update)
|
||||
(redisplay)))
|
||||
|
||||
(defun center-content--disable ()
|
||||
"Disable centering of content."
|
||||
@ -114,35 +67,30 @@
|
||||
(when (overlayp center-content--horizontal-overlay)
|
||||
(delete-overlay center-content--horizontal-overlay)
|
||||
(setq center-content--horizontal-overlay nil))
|
||||
;; Remove vertical centering overlay
|
||||
(when (overlayp center-content--vertical-overlay)
|
||||
(delete-overlay center-content--vertical-overlay)
|
||||
(setq center-content--vertical-overlay nil))
|
||||
;; Restore the header-line face remapping
|
||||
(when center-content--header-line-face-remap-cookie
|
||||
(face-remap-remove-relative center-content--header-line-face-remap-cookie)
|
||||
(setq center-content--header-line-face-remap-cookie nil))
|
||||
;; Restore the header-line-format
|
||||
(setq header-line-format center-content--original-header-line-format)
|
||||
(setq center-content--original-mode-line-format nil)
|
||||
;; Restore the original mode-line-format
|
||||
(setq mode-line-format center-content--original-mode-line-format))
|
||||
|
||||
(defun center-content-update ()
|
||||
"Updates the centering if `center-content-mode' is enabled."
|
||||
(interactive)
|
||||
(when (bound-and-true-p center-content-mode)
|
||||
(center-content--disable)
|
||||
(center-content--enable)))
|
||||
(setq mode-line-format center-content--original-mode-line-format)
|
||||
(setq center-content--original-header-line-format nil)
|
||||
;; Force redisplay
|
||||
(force-mode-line-update)
|
||||
(redisplay))
|
||||
|
||||
;;;###autoload
|
||||
(define-minor-mode center-content-mode
|
||||
"Toggle horizontal and vertical centering of buffer content.
|
||||
|
||||
When enabled, the content of the buffer is centered both horizontally
|
||||
and vertically within the window."
|
||||
When enabled, the content of the buffer is centered both
|
||||
horizontally and vertically within the window. The mode line is
|
||||
hidden for a clean appearance."
|
||||
:init-value nil
|
||||
:global nil
|
||||
:lighter " Center"
|
||||
:lighter nil ;; Remove the lighter to keep the mode line clean
|
||||
(if center-content-mode
|
||||
(center-content--enable)
|
||||
(center-content--disable)))
|
||||
|
Loading…
Reference in New Issue
Block a user