space-doc/centered-buffer improvements.

reformat

fix stuff

make sure that user wants overlays
This commit is contained in:
JAremko 2016-07-07 20:55:19 +03:00 committed by Eivind Fonn
parent e94ab321cd
commit 7e1eae0b9a
2 changed files with 138 additions and 93 deletions

View File

@ -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

View File

@ -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.