space-doc/centered-buffer improvements.
reformat fix stuff make sure that user wants overlays
This commit is contained in:
parent
e94ab321cd
commit
7e1eae0b9a
|
@ -5,7 +5,7 @@
|
|||
;; Author: Eugene "JAremko" Yaremenko <w3techplayground@gmail.com>
|
||||
;; Keywords: centering buffer minor-mode
|
||||
;; Created: 1 July 2016
|
||||
;; Version: 1.00
|
||||
;; Version: 1.01
|
||||
;; Package-Requires: ((emacs "24.4"))
|
||||
;; URL: https://github.com/syl20bnr/spacemacs
|
||||
|
||||
|
@ -46,6 +46,7 @@ that differed modifications won't cause an overflow."
|
|||
(defvar-local spacemacs--centered-buffer-mode-origin-buffer nil)
|
||||
(defvar-local spacemacs--centered-buffer-mode-indirect-buffer nil)
|
||||
(defvar-local spacemacs--centered-buffer-mode-text-pixel-size nil)
|
||||
(defvar spacemacs-centered-buffer-mode-default-fringe-color (face-background 'fringe))
|
||||
(defvar spacemacs--centered-buffer-mode-indirect-buffers (list))
|
||||
|
||||
(define-minor-mode spacemacs-centered-buffer-mode
|
||||
|
@ -53,76 +54,112 @@ that differed modifications won't cause an overflow."
|
|||
:init-value nil
|
||||
:group 'editing-basics
|
||||
(if spacemacs-centered-buffer-mode
|
||||
(let* ((window (selected-window))
|
||||
(origin-buffer (window-buffer window))
|
||||
(indirect-buffer
|
||||
(if (buffer-live-p
|
||||
spacemacs--centered-buffer-mode-indirect-buffer)
|
||||
spacemacs--centered-buffer-mode-indirect-buffer
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffer
|
||||
(make-indirect-buffer origin-buffer
|
||||
(format "%s(centered)"
|
||||
origin-buffer)
|
||||
t)))))
|
||||
;; Mode will be applied to the indirect buffer.
|
||||
(setq spacemacs-centered-buffer-mode
|
||||
nil
|
||||
spacemacs--centered-buffer-mode-indirect-buffer
|
||||
indirect-buffer)
|
||||
(when (derived-mode-p 'org-mode)
|
||||
(setq-local org-startup-folded nil)
|
||||
(outline-show-all))
|
||||
(switch-to-buffer indirect-buffer nil t)
|
||||
(with-mode-disabled page-break-lines-mode
|
||||
(let* ((fringe-w (spacemacs//centered-buffer-calc-fringe
|
||||
window)))
|
||||
(if (> fringe-w spacemacs-centered-buffer-mode-min-fringe-width)
|
||||
(progn
|
||||
;; Fix visual glitch.
|
||||
(spacemacs/toggle-line-numbers)
|
||||
(spacemacs/toggle-line-numbers)
|
||||
;;
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffers
|
||||
(append (list indirect-buffer)
|
||||
spacemacs--centered-buffer-mode-indirect-buffers)
|
||||
spacemacs--centered-buffer-mode-origin-buffer origin-buffer
|
||||
spacemacs-centered-buffer-mode t
|
||||
indicate-empty-lines nil
|
||||
fringes-outside-margins t
|
||||
left-fringe-width fringe-w
|
||||
right-fringe-width fringe-w
|
||||
;; looks better with some margin.
|
||||
left-margin-width (if (or (not left-margin-width)
|
||||
(= left-margin-width 0))
|
||||
1
|
||||
left-margin-width)
|
||||
spacemacs--centered-buffer-mode-text-pixel-size
|
||||
(car (window-text-pixel-size window)))
|
||||
(face-remap-add-relative 'fringe :background
|
||||
spacemacs-centered-buffer-mode-fringe-color)
|
||||
(set-window-buffer window indirect-buffer)
|
||||
(add-hook 'buffer-list-update-hook
|
||||
'spacemacs//centered-buffer-buffer-list-update-fringes)
|
||||
(add-hook 'window-configuration-change-hook
|
||||
'spacemacs//centered-buffer-buffer-list-update-fringes))
|
||||
(setq spacemacs--centered-buffer-mode-origin-buffer nil)
|
||||
(set-buffer origin-buffer)
|
||||
(kill-buffer indirect-buffer)
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffer nil)
|
||||
(when (called-interactively-p 'any)
|
||||
(message "Not enough space to center the buffer!"))))))
|
||||
(if (not (window-dedicated-p))
|
||||
(spacemacs//centered-buffer-mode-enable-branch (called-interactively-p 'any))
|
||||
(setq spacemacs-centered-buffer-mode nil)
|
||||
(when (called-interactively-p 'any)
|
||||
(message "Can't center in dedicated window!")))
|
||||
(spacemacs//centered-buffer-mode-disable-branch)))
|
||||
|
||||
(defun spacemacs//centered-buffer-mode-enable-branch (interact)
|
||||
"Assume to be called interactively when INTERACT has non nil value."
|
||||
;; Mode will be applied to the indirect buffer.
|
||||
(setq spacemacs-centered-buffer-mode nil)
|
||||
(unless spacemacs--centered-buffer-mode-origin-buffer
|
||||
(let* ((window (selected-window))
|
||||
(origin-buffer (window-buffer window))
|
||||
(indirect-buffer
|
||||
(if (buffer-live-p
|
||||
spacemacs--centered-buffer-mode-indirect-buffer)
|
||||
spacemacs--centered-buffer-mode-indirect-buffer
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffer
|
||||
(make-indirect-buffer origin-buffer
|
||||
(format "%s(centered)"
|
||||
origin-buffer)
|
||||
t)))))
|
||||
(spacemacs//centered-buffer-mode-buffer-fringr-color-toggle origin-buffer t)
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffer indirect-buffer)
|
||||
(when (derived-mode-p 'org-mode)
|
||||
(setq-local org-startup-folded nil)
|
||||
(outline-show-all))
|
||||
(switch-to-buffer indirect-buffer nil t)
|
||||
(with-mode-disabled
|
||||
page-break-lines-mode
|
||||
(let* ((fringe-w (spacemacs//centered-buffer-calc-fringe
|
||||
window)))
|
||||
(if (> fringe-w spacemacs-centered-buffer-mode-min-fringe-width)
|
||||
(progn
|
||||
;; Fix visual glitch.
|
||||
(spacemacs/toggle-line-numbers)
|
||||
(spacemacs/toggle-line-numbers)
|
||||
;;
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffers
|
||||
(append (list indirect-buffer)
|
||||
spacemacs--centered-buffer-mode-indirect-buffers)
|
||||
spacemacs--centered-buffer-mode-origin-buffer origin-buffer
|
||||
spacemacs-centered-buffer-mode t
|
||||
indicate-empty-lines nil
|
||||
fringes-outside-margins t
|
||||
left-fringe-width fringe-w
|
||||
right-fringe-width fringe-w
|
||||
;; looks better with some margin.
|
||||
left-margin-width (if (or (not left-margin-width)
|
||||
(= left-margin-width 0))
|
||||
1
|
||||
left-margin-width)
|
||||
spacemacs--centered-buffer-mode-text-pixel-size
|
||||
(car (window-text-pixel-size window)))
|
||||
(face-remap-add-relative 'fringe :background
|
||||
spacemacs-centered-buffer-mode-fringe-color)
|
||||
(set-window-buffer window indirect-buffer)
|
||||
(advice-add 'spacemacs/previous-useful-buffer
|
||||
:before
|
||||
#'spacemacs//centered-buffer-mode-prev-next-useful-buffer-advice)
|
||||
(advice-add 'spacemacs/next-useful-buffer
|
||||
:before
|
||||
#'spacemacs//centered-buffer-mode-prev-next-useful-buffer-advice)
|
||||
(add-hook 'buffer-list-update-hook
|
||||
'spacemacs//centered-buffer-buffer-list-update-fringes)
|
||||
(add-hook 'window-configuration-change-hook
|
||||
'spacemacs//centered-buffer-buffer-list-update-fringes))
|
||||
(setq spacemacs--centered-buffer-mode-origin-buffer nil)
|
||||
(set-buffer origin-buffer)
|
||||
(spacemacs//centered-buffer-mode-buffer-fringr-color-toggle origin-buffer nil)
|
||||
(kill-buffer indirect-buffer)
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffer nil)
|
||||
(when interact
|
||||
(message "Not enough space to center the buffer!"))))))))
|
||||
|
||||
(defun spacemacs//centered-buffer-mode-prev-next-useful-buffer-advice ()
|
||||
(when (bound-and-true-p spacemacs-centered-buffer-mode)
|
||||
(spacemacs-centered-buffer-mode -1)))
|
||||
|
||||
(defun spacemacs//centered-buffer-mode-disable-branch ()
|
||||
(when spacemacs--centered-buffer-mode-origin-buffer
|
||||
(let* ((window (selected-window))
|
||||
(origin-buffer spacemacs--centered-buffer-mode-origin-buffer)
|
||||
(indirect-buffer (window-buffer window)))
|
||||
(setq spacemacs--centered-buffer-mode-origin-buffer nil)
|
||||
(when (buffer-live-p origin-buffer)
|
||||
(switch-to-buffer origin-buffer nil t)
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffer nil))
|
||||
(switch-to-buffer origin-buffer nil t)
|
||||
(spacemacs//centered-buffer-mode-buffer-fringr-color-toggle origin-buffer nil)
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffer nil)
|
||||
(when (buffer-live-p indirect-buffer)
|
||||
(dolist (window (get-buffer-window-list indirect-buffer 2))
|
||||
(set-window-buffer window origin-buffer))
|
||||
(kill-buffer indirect-buffer)))))
|
||||
|
||||
(defun spacemacs//centered-buffer-mode-buffer-fringr-color-toggle (buffer flag)
|
||||
"Change fringe color of the BUFFER if FLAG has non-nil value.
|
||||
Revert changes Otherwise."
|
||||
(with-current-buffer buffer
|
||||
(if flag
|
||||
(face-remap-add-relative 'fringe :background
|
||||
spacemacs-centered-buffer-mode-fringe-color)
|
||||
(face-remap-reset-base 'fringe)
|
||||
(face-remap-add-relative 'fringe
|
||||
:background
|
||||
spacemacs-centered-buffer-mode-default-fringe-color))))
|
||||
|
||||
(defun spacemacs//centered-buffer-calc-fringe (&optional window text-pixel-size)
|
||||
"Calculate fringe width for `spacemacs-centered-buffer-mode'.
|
||||
Uses text-pixel-size if provided, otherwise calculates it with `window-pixel-width'."
|
||||
|
@ -134,8 +171,7 @@ Uses text-pixel-size if provided, otherwise calculates it with `window-pixel-wid
|
|||
spacemacs-centered-buffer-mode-safety-gap-width)))
|
||||
|
||||
(defun spacemacs//centered-buffer-buffer-list-update-fringes ()
|
||||
"Used in `spacemacs//centered-buffer-buffer-list-update-hook' and
|
||||
`spacemacs//centered-buffer-buffer-window-configuration-change-hook'."
|
||||
"Used in `buffer-list-update-hook' and `window-configuration-change-hook'."
|
||||
(dolist (frame (frame-list))
|
||||
(when (frame-live-p frame)
|
||||
(dolist (window (window-list frame 2))
|
||||
|
@ -159,17 +195,22 @@ Uses text-pixel-size if provided, otherwise calculates it with `window-pixel-wid
|
|||
if it not displayed. Disables `centered-buffer-mode' hooks
|
||||
if `spacemacs--centered-buffer-mode-indirect-buffers' has no elements left(nil)."
|
||||
(dolist (buffer spacemacs--centered-buffer-mode-indirect-buffers)
|
||||
(unless (and (buffer-live-p buffer)
|
||||
(window-live-p (get-buffer-window buffer t)))
|
||||
(unless (and (buffer-live-p buffer)
|
||||
(window-live-p (get-buffer-window buffer t)))
|
||||
(delete buffer 'spacemacs--centered-buffer-mode-indirect-buffers)
|
||||
(let ((origin-buffer (buffer-local-value
|
||||
'spacemacs--centered-buffer-mode-origin-buffer
|
||||
buffer)))
|
||||
(when (buffer-live-p origin-buffer)
|
||||
(spacemacs//centered-buffer-mode-buffer-fringr-color-toggle origin-buffer nil)
|
||||
(with-current-buffer origin-buffer
|
||||
(setq spacemacs--centered-buffer-mode-indirect-buffers nil))))
|
||||
(kill-buffer buffer)))
|
||||
(unless spacemacs--centered-buffer-mode-indirect-buffers
|
||||
(advice-remove 'spacemacs/previous-useful-buffer
|
||||
#'spacemacs//centered-buffer-mode-prev-next-useful-buffer-advice)
|
||||
(advice-remove 'spacemacs/next-useful-buffer
|
||||
#'spacemacs//centered-buffer-mode-prev-next-useful-buffer-advice)
|
||||
(remove-hook 'buffer-list-update-hook
|
||||
'spacemacs//centered-buffer-buffer-list-update-fringes)
|
||||
(remove-hook 'window-configuration-change-hook
|
||||
|
|
|
@ -35,9 +35,16 @@ This mode:
|
|||
- hides `org-mode' meta tags like #+TITLE: while
|
||||
keeping their content visible.
|
||||
- Improves emphasized region apparence.
|
||||
- enables buffer local link opening with `spacemacs//space-doc-open'."
|
||||
- enables buffer local link opening with `spacemacs//space-doc-open'.
|
||||
=================================================
|
||||
= THE MODE IS CUSTOMIZABLE - read Spacemacs FAQ =
|
||||
================================================="
|
||||
:init-value nil
|
||||
:lighter " SD"
|
||||
;; Trans-buffer local minor mode...
|
||||
(let ((old-flag space-doc-mode))
|
||||
(spacemacs-centered-buffer-mode -1)
|
||||
(setq space-doc-mode old-flag))
|
||||
(if (derived-mode-p 'org-mode)
|
||||
(dolist (modificator (append '(spacemacs//space-doc-set-cache
|
||||
spacemacs//space-doc-runs-deferred)
|
||||
|
@ -71,35 +78,32 @@ by the function. Otherwise - disable.")
|
|||
"Same as `spacemacs-space-doc-modificators' but the modificators will
|
||||
be run deferred.")
|
||||
|
||||
(defun spacemacs//space-doc-centered-buffer-mode-hook ()
|
||||
"Applies `spacemacs//space-doc-emphasis-overlays' to the
|
||||
indirect buffer (because overlays aren't copied for the original one)."
|
||||
(when space-doc-mode
|
||||
(spacemacs//space-doc-set-cache t)
|
||||
(when (or (member 'spacemacs//space-doc-emphasis-overlays
|
||||
spacemacs-space-doc-modificators)
|
||||
(member 'spacemacs//space-doc-emphasis-overlays
|
||||
spacemacs-space-doc-modificators-deferred))
|
||||
(spacemacs//space-doc-emphasis-overlays t))))
|
||||
|
||||
(when (member 'spacemacs//space-doc-center-buffer-mode
|
||||
spacemacs-space-doc-modificators)
|
||||
(add-hook 'spacemacs-centered-buffer-mode-hook
|
||||
'spacemacs//space-doc-centered-buffer-mode-hook))
|
||||
|
||||
(defun spacemacs//space-doc-center-buffer-mode (&optional flag)
|
||||
"Enable `spacemacs-centered-buffer-mode' if flag is non nil, disable it otherwise.
|
||||
This functions is aimed to be used with `spacemacs-space-doc-modificators'."
|
||||
;;FIXME: Need to redesign this.. One day.
|
||||
(if flag
|
||||
(progn
|
||||
;; HACK: Hide the original buffer from `spacemacs/useful-buffer-p'.
|
||||
(unless (and (string-prefix-p "*" (buffer-name))
|
||||
(string-suffix-p "*" (buffer-name)))
|
||||
(rename-buffer (format "*%s*" (buffer-name))))
|
||||
(set (make-local-variable 'spacemacs--space-doc-origin-fringe-color)
|
||||
(face-background 'fringe))
|
||||
;; HACK: Fix glitchy fringe color.
|
||||
(face-remap-add-relative 'fringe :background
|
||||
spacemacs-centered-buffer-mode-fringe-color)
|
||||
;; HACK: Needed to get proper content width.
|
||||
(run-with-idle-timer 0 nil 'spacemacs-centered-buffer-mode +1))
|
||||
(when spacemacs-centered-buffer-mode
|
||||
(set-window-buffer
|
||||
(selected-window)
|
||||
spacemacs--centered-buffer-mode-origin-buffer)
|
||||
(rename-buffer (substring (buffer-name) 1 (1- (length (buffer-name)))))
|
||||
(kill-buffer spacemacs--centered-buffer-mode-indirect-buffer)
|
||||
;; HACK: Now we call it for the original buffer.
|
||||
(space-doc-mode -1))
|
||||
(when (bound-and-true-p spacemacs--space-doc-origin-fringe-color)
|
||||
;; HACK: Removing or reseting doesn't work.
|
||||
(face-remap-add-relative 'fringe :background
|
||||
spacemacs--space-doc-origin-fringe-color))))
|
||||
(when (and flag (not spacemacs-centered-buffer-mode))
|
||||
(run-with-idle-timer 0
|
||||
nil
|
||||
(lambda ()
|
||||
(spacemacs-centered-buffer-mode +1)
|
||||
(spacemacs//space-doc-set-cache t)
|
||||
(spacemacs//space-doc-emphasis-overlays t)))))
|
||||
|
||||
(defun spacemacs//space-doc-org-indent-mode (&optional flag)
|
||||
"Enable `org-indent-mode' if flag is non nil, disable it otherwise.
|
||||
|
|
Loading…
Reference in New Issue