From 7140e8dfa80e5b802230190e134937d36eea88e2 Mon Sep 17 00:00:00 2001 From: JAremko Date: Fri, 15 Jul 2016 17:15:14 +0300 Subject: [PATCH] Add extra checks, cleanup simplify space-doc customization rearrange defcustom groups more checks --- doc/FAQ.org | 24 +++-- .../centered-buffer-mode.el | 34 ++++--- .../local/space-doc/space-doc.el | 94 +++++++++++++------ 3 files changed, 99 insertions(+), 53 deletions(-) diff --git a/doc/FAQ.org b/doc/FAQ.org index 69a74ffc8..91e66d445 100644 --- a/doc/FAQ.org +++ b/doc/FAQ.org @@ -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 diff --git a/layers/+distributions/spacemacs-base/local/centered-buffer-mode/centered-buffer-mode.el b/layers/+distributions/spacemacs-base/local/centered-buffer-mode/centered-buffer-mode.el index e8c9dd26b..385193bf2 100644 --- a/layers/+distributions/spacemacs-base/local/centered-buffer-mode/centered-buffer-mode.el +++ b/layers/+distributions/spacemacs-base/local/centered-buffer-mode/centered-buffer-mode.el @@ -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) diff --git a/layers/+spacemacs/spacemacs-org/local/space-doc/space-doc.el b/layers/+spacemacs/spacemacs-org/local/space-doc/space-doc.el index 09373513c..e9122b77c 100644 --- a/layers/+spacemacs/spacemacs-org/local/space-doc/space-doc.el +++ b/layers/+spacemacs/spacemacs-org/local/space-doc/space-doc.el @@ -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.