Add extra checks, cleanup

simplify space-doc customization

rearrange defcustom groups

more checks
This commit is contained in:
JAremko 2016-07-15 17:15:14 +03:00 committed by Eivind Fonn
parent 9ba525cdde
commit 7140e8dfa8
3 changed files with 99 additions and 53 deletions

View File

@ -517,21 +517,19 @@ arguments of the =ag= program.
You can modify the list of visual enhancements applied by the =space-doc-mode=:
#+BEGIN_SRC emacs-lisp
(setq spacemacs-space-doc-modificators
'(spacemacs//space-doc-center-buffer-mode
spacemacs//space-doc-org-indent-mode
spacemacs//space-doc-view-mode
spacemacs//space-doc-hide-line-numbers
spacemacs//space-doc-emphasis-overlays
spacemacs//space-doc-meta-tags-overlays
spacemacs//space-doc-link-protocol
spacemacs//space-doc-org-block-line-face-remap
spacemacs//space-doc-org-kbd-face-remap
spacemacs//space-doc-resize-inline-images
spacemacs//space-doc-advice-org-do-emphasis-faces))
'(center-buffer-mode
org-indent-mode
view-mode
hide-line-numbers
emphasis-overlays
meta-tags-overlays
link-protocol
org-block-line-face-remap
org-kbd-face-remap
resize-inline-images
advice-org-do-emphasis-faces))
#+END_SRC
It's the default value of the variable with all enhancements.
Each function in the list represents some modification.
Some of them might be order dependant so don't shuffle the list!
** Remap paste key to be able to paste copied text multiple times
In vim and evil, pasting over a text would cause it to be copied, hence making it impossible to paste

View File

@ -27,21 +27,24 @@
;;; Code:
(require 'face-remap)
(defgroup spacemacs-centered-buffer-mode nil "Minor mode to center buffer in its window."
:group 'convenience)
(defcustom spacemacs-centered-buffer-mode-min-fringe-width 50
"Minimal fringe width."
:type 'integer
:group 'editing-basics)
:group 'spacemacs-centered-buffer-mode)
(defcustom spacemacs-centered-buffer-mode-safety-gap-width 20
"Add extra width to the modified buffer to make sure
that differed modifications won't cause an overflow."
:type 'integer
:group 'editing-basics)
:group 'spacemacs-centered-buffer-mode)
(defcustom spacemacs-centered-buffer-mode-fringe-color "black"
"Color of the fringes."
:type 'color
:group 'editing-basics)
:group 'spacemacs-centered-buffer-mode)
(defvar-local spacemacs--centered-buffer-mode-origin-buffer nil)
(defvar-local spacemacs--centered-buffer-mode-indirect-buffer nil)
@ -52,7 +55,7 @@ that differed modifications won't cause an overflow."
(define-minor-mode spacemacs-centered-buffer-mode
"Minor mode to center buffer in its window."
:init-value nil
:group 'editing-basics
:group 'spacemacs-centered-buffer-mode
(if spacemacs-centered-buffer-mode
(if (not (window-dedicated-p))
(spacemacs//centered-buffer-mode-enable-branch (called-interactively-p 'any))
@ -80,7 +83,10 @@ Assume to be called interactively when INTERACT has non nil value."
origin-buffer)
t)))))
(spacemacs//centered-buffer-mode-buffer-fringr-color-toggle origin-buffer t)
(setq spacemacs--centered-buffer-mode-indirect-buffer indirect-buffer)
(setq spacemacs--centered-buffer-mode-indirect-buffer
indirect-buffer
spacemacs-centered-buffer-mode-default-fringe-color
(face-background 'fringe))
(when (derived-mode-p 'org-mode)
(setq-local org-startup-folded nil)
(outline-show-all))
@ -203,17 +209,19 @@ if the buffer hasn't at least one live window. Disables `centered-buffer-mode' h
and advices if `spacemacs--centered-buffer-mode-indirect-buffers' has no elements left to
minimize the performance hit when the mode isn't used."
(dolist (buffer spacemacs--centered-buffer-mode-indirect-buffers)
(unless (and (buffer-live-p buffer)
(window-live-p (get-buffer-window buffer t)))
(delete buffer 'spacemacs--centered-buffer-mode-indirect-buffers)
(unless (or (and (buffer-live-p buffer)
(window-live-p (get-buffer-window buffer t)))
(not 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)))
(when (ignore-errors (kill-buffer buffer))
(delete buffer 'spacemacs--centered-buffer-mode-indirect-buffers)
(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)))))))
;; Remove hooks and advices when they are not needed anymore.
(unless spacemacs--centered-buffer-mode-indirect-buffers
(advice-remove 'spacemacs/previous-useful-buffer
#'spacemacs//centered-buffer-mode-prev-next-useful-buffer-advice)

View File

@ -29,8 +29,11 @@
(require 'org)
(require 'centered-buffer-mode)
(defgroup space-doc nil "Minor mode for viewing Spacemacs documentation files."
:group 'convenience)
(define-minor-mode space-doc-mode
"Buffer local minor mode for Spacemacs documentation files.
"Buffer local minor mode for viewing Spacemacs documentation files.
This mode:
- hides `org-mode' meta tags like #+TITLE: while
keeping their content visible.
@ -41,38 +44,74 @@ keeping their content visible.
================================================="
: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))
:group 'space-doc
(spacemacs//space-doc-centered-buffer-mode-goto-origin space-doc-mode)
(if (derived-mode-p 'org-mode)
(dolist (modificator (append (list 'spacemacs//space-doc-set-cache)
spacemacs-space-doc-modificators))
(funcall modificator space-doc-mode))
(progn
(spacemacs//space-doc-set-cache space-doc-mode)
(dolist (modificator spacemacs-space-doc-modificators-functions)
(when (member (car modificator)
spacemacs-space-doc-modificators)
(funcall (cdr modificator) space-doc-mode))))
(message (format "space-doc-mode error:%s isn't an org-mode buffer"
(buffer-name)))
(setq space-doc-mode nil)))
;; NOTE: Dont forget to update Spacemacs FAQ if you modify this list!
(defvar spacemacs-space-doc-modificators
'(spacemacs//space-doc-center-buffer-mode
spacemacs//space-doc-org-indent-mode
spacemacs//space-doc-view-mode
spacemacs//space-doc-hide-line-numbers
spacemacs//space-doc-emphasis-overlays
spacemacs//space-doc-meta-tags-overlays
spacemacs//space-doc-link-protocol
spacemacs//space-doc-org-block-line-face-remap
spacemacs//space-doc-org-kbd-face-remap
spacemacs//space-doc-resize-inline-images
spacemacs//space-doc-advice-org-do-emphasis-faces)
"List of `space-doc' modificator functions for `org-mode' buffers.
(defcustom spacemacs-space-doc-modificators
'(center-buffer-mode
org-indent-mode
view-mode
hide-line-numbers
emphasis-overlays
meta-tags-overlays
link-protocol
org-block-line-face-remap
org-kbd-face-remap
resize-inline-images
advice-org-do-emphasis-faces)
"List of `space-doc' modificators."
:type '(set (const center-buffer-mode)
(const org-indent-mode)
(const view-mode)
(const hide-line-numbers)
(const emphasis-overlays)
(const meta-tags-overlays)
(const link-protocol)
(const org-block-line-face-remap)
(const org-kbd-face-remap)
(const resize-inline-images)
(const advice-org-do-emphasis-faces))
:group 'space-doc)
(defvar spacemacs-space-doc-modificators-functions
'((center-buffer-mode . spacemacs//space-doc-center-buffer-mode)
(org-indent-mode . spacemacs//space-doc-org-indent-mode)
(view-mode . spacemacs//space-doc-view-mode)
(hide-line-numbers . spacemacs//space-doc-hide-line-numbers)
(emphasis-overlays . spacemacs//space-doc-emphasis-overlays)
(meta-tags-overlays . spacemacs//space-doc-meta-tags-overlays)
(link-protocol . spacemacs//space-doc-link-protocol)
(org-block-line-face-remap . spacemacs//space-doc-org-block-line-face-remap)
(org-kbd-face-remap . spacemacs//space-doc-org-kbd-face-remap)
(resize-inline-images . spacemacs//space-doc-resize-inline-images)
(advice-org-do-emphasis-faces . spacemacs//space-doc-advice-org-do-emphasis-faces))
"alist of `space-doc' modificator (tag . function) for `org-mode' buffers.
The functions work with a current buffer and accept ENABLE(flag) argument.
If the argument has non-nil value - enable the modifications introduced
by the function. Otherwise - disable.")
by the function. Otherwise - disable. The tags used in `spacemacs-space-doc-modificators'")
(defun spacemacs//space-doc-centered-buffer-mode-goto-origin (flag)
"Switch to the origin buffer if `spacemacs-centere-buffer-mode' is
enabled. Set the value of `space-doc-mode' variable in the origin
buffer to FLAG."
(when spacemacs-centered-buffer-mode
(let ((old-flag space-doc-mode))
(spacemacs-centered-buffer-mode -1)
(setq space-doc-mode old-flag))))
(defun spacemacs//space-doc-centered-buffer-mode-hook ()
"Applies `spacemacs//space-doc-emphasis-overlays' to the
"Apply `spacemacs//space-doc-emphasis-overlays' to the
indirect buffer (because overlays aren't copied from the original one).
And calculates `spacemacs//space-doc-set-cache' (it's buffer local)."
(when space-doc-mode
@ -89,10 +128,11 @@ And calculates `spacemacs//space-doc-set-cache' (it's buffer local)."
(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'."
(when (and flag (not spacemacs-centered-buffer-mode))
;; `spacemacs-centered-buffer-mode' is heavy so it's better to make if deferred.
;; Also it has to be run when the `window-body-width' is properly calculated.
(run-with-idle-timer 0 nil 'spacemacs-centered-buffer-mode)))
(if (and flag (not spacemacs-centered-buffer-mode))
;; `spacemacs-centered-buffer-mode' is heavy so it's better to make if deferred.
;; Also it has to be run when the `window-body-width' is properly calculated.
(run-with-idle-timer 0 nil 'spacemacs-centered-buffer-mode))
(spacemacs-centered-buffer-mode -1))
(defun spacemacs//space-doc-org-indent-mode (&optional flag)
"Enable `org-indent-mode' if flag is non nil, disable it otherwise.