From 7e1eae0b9a69dc47f669aa006f2c3efd10bec614 Mon Sep 17 00:00:00 2001 From: JAremko Date: Thu, 7 Jul 2016 20:55:19 +0300 Subject: [PATCH] space-doc/centered-buffer improvements. reformat fix stuff make sure that user wants overlays --- .../centered-buffer-mode.el | 173 +++++++++++------- .../local/space-doc/space-doc.el | 58 +++--- 2 files changed, 138 insertions(+), 93 deletions(-) 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 3113bcfca..b6b383f68 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 @@ -5,7 +5,7 @@ ;; Author: Eugene "JAremko" Yaremenko ;; 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 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 5f6aa0575..6094fa814 100644 --- a/layers/+spacemacs/spacemacs-org/local/space-doc/space-doc.el +++ b/layers/+spacemacs/spacemacs-org/local/space-doc/space-doc.el @@ -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.