Compare commits

..

No commits in common. "509db9bbdef21063d18085140719b1ed2d8c8b16" and "c2524b420eb32a2b0085db431ef7de95fdc3c453" have entirely different histories.

View File

@ -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: ;;; Commentary:
@ -9,45 +9,13 @@
(require 'face-remap) (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 (defvar-local center-content--horizontal-overlay nil
"Overlay used to add left margin for horizontal centering.") "Overlay used to add left margin for horizontal centering.")
(defvar-local center-content--vertical-overlay nil (defvar-local center-content--original-header-line-format nil
"Overlay used to add top margin for vertical centering.")
(defvar-local center-content--original-header-line-format header-line-format
"Stores the original `header-line-format` to restore upon disabling.") "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.") "Stores the original `mode-line-format` to restore upon disabling.")
(defvar-local center-content--header-line-face-remap-cookie nil (defvar-local center-content--header-line-face-remap-cookie nil
@ -55,7 +23,7 @@
(defun center-content--content-pixel-size () (defun center-content--content-pixel-size ()
"Return the size of the content of the visible text in pixels." "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) (defun center-content--calculate-left-margin (content-width)
"Calculate the left margin relative to CONTENT-WIDTH." "Calculate the left margin relative to CONTENT-WIDTH."
@ -69,44 +37,29 @@
(line-height (default-line-height))) (line-height (default-line-height)))
(/ (max 0 (- window-height content-height)) (* 2 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 () (defun center-content--enable ()
"Enable horizontal and vertical centering of content." "Enable horizontal and vertical centering of content."
(setq center-content--original-header-line-format header-line-format) (let* ((content-size (center-content--content-pixel-size))
(setq center-content--original-mode-line-format mode-line-format) (left-margin (center-content--calculate-left-margin (car content-size)))
(let* ((content-size (center-content--content-pixel-size))) (top-margin (center-content--calculate-top-margin (cdr content-size))))
(when center-content-horizontal ;; Apply horizontal centering using overlay
(center-content--horizontal (car content-size))) (let ((overlay (make-overlay (point-min) (point-max))))
(when center-content-vertical (overlay-put overlay 'line-prefix
(if center-content-vertical-by-overlay (propertize " " 'display `(space :width ,left-margin)))
(center-content--vertical-by-overlay (cdr content-size)) (setq center-content--horizontal-overlay overlay))
(center-content--vertical (cdr content-size)))) ;; Apply vertical centering using header-line-format
(when center-content-hide-mode-line ;; Save and remap the header-line face to match the default face
(setq mode-line-format nil)))) (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 () (defun center-content--disable ()
"Disable centering of content." "Disable centering of content."
@ -114,35 +67,30 @@
(when (overlayp center-content--horizontal-overlay) (when (overlayp center-content--horizontal-overlay)
(delete-overlay center-content--horizontal-overlay) (delete-overlay center-content--horizontal-overlay)
(setq center-content--horizontal-overlay nil)) (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 ;; Restore the header-line face remapping
(when center-content--header-line-face-remap-cookie (when center-content--header-line-face-remap-cookie
(face-remap-remove-relative 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)) (setq center-content--header-line-face-remap-cookie nil))
;; Restore the header-line-format ;; Restore the header-line-format
(setq header-line-format center-content--original-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 ;; Restore the original mode-line-format
(setq mode-line-format center-content--original-mode-line-format)) (setq mode-line-format center-content--original-mode-line-format)
(setq center-content--original-header-line-format nil)
(defun center-content-update () ;; Force redisplay
"Updates the centering if `center-content-mode' is enabled." (force-mode-line-update)
(interactive) (redisplay))
(when (bound-and-true-p center-content-mode)
(center-content--disable)
(center-content--enable)))
;;;###autoload ;;;###autoload
(define-minor-mode center-content-mode (define-minor-mode center-content-mode
"Toggle horizontal and vertical centering of buffer content. "Toggle horizontal and vertical centering of buffer content.
When enabled, the content of the buffer is centered both horizontally When enabled, the content of the buffer is centered both
and vertically within the window." horizontally and vertically within the window. The mode line is
hidden for a clean appearance."
:init-value nil :init-value nil
:global nil :global nil
:lighter " Center" :lighter nil ;; Remove the lighter to keep the mode line clean
(if center-content-mode (if center-content-mode
(center-content--enable) (center-content--enable)
(center-content--disable))) (center-content--disable)))