;;; packages.el --- Spacemacs Editing Visual Layer packages File ;; ;; Copyright (c) 2012-2016 Sylvain Benner & Contributors ;; ;; Author: Sylvain Benner ;; URL: https://github.com/syl20bnr/spacemacs ;; ;; This file is not part of GNU Emacs. ;; ;;; License: GPLv3 (setq spacemacs-editing-visual-packages '( ;; default adaptive-wrap auto-highlight-symbol column-enforce-mode hide-comnt highlight-indentation highlight-numbers highlight-parentheses ;; waiting for an overlay bug to be fixed ;; see https://github.com/syl20bnr/spacemacs/issues/2529 (hl-anything :excluded t) indent-guide rainbow-delimiters volatile-highlights )) ;; Initialization of packages (defun spacemacs-editing-visual/init-adaptive-wrap () (use-package adaptive-wrap :config (progn (add-hook 'visual-line-mode-hook 'adaptive-wrap-prefix-mode)))) (defun spacemacs-editing-visual/init-auto-highlight-symbol () (use-package auto-highlight-symbol :defer t :init (progn (setq ahs-case-fold-search nil ahs-default-range 'ahs-range-whole-buffer ;; by default disable auto-highlight of symbol ;; current symbol can always be highlighted with `SPC s h' ahs-idle-timer 0 ahs-idle-interval 0.25 ahs-inhibit-face-list nil spacemacs--symbol-highlight-transient-state-doc " %s [_n_] next [_N_/_p_] previous [_r_] change range [_R_] reset [_e_] iedit %s [_d_/_D_] next/previous definition") ;; since we are creating our own maps, ;; prevent the default keymap from getting created (setq auto-highlight-symbol-mode-map (make-sparse-keymap)) (spacemacs|add-toggle automatic-symbol-highlight :status (timerp ahs-idle-timer) :on (progn (auto-highlight-symbol-mode) (setq ahs-idle-timer (run-with-idle-timer ahs-idle-interval t 'ahs-idle-function))) :off (when (timerp ahs-idle-timer) (auto-highlight-symbol-mode) (cancel-timer ahs-idle-timer) (setq ahs-idle-timer 0)) :documentation "Automatic highlight of current symbol." :evil-leader "tha") (spacemacs/add-to-hooks 'auto-highlight-symbol-mode '(prog-mode-hook markdown-mode-hook))) :config (progn (spacemacs|hide-lighter auto-highlight-symbol-mode) (defvar-local spacemacs-last-ahs-highlight-p nil "Info on the last searched highlighted symbol.") (defvar-local spacemacs--ahs-searching-forward t) (defun spacemacs/goto-last-searched-ahs-symbol () "Go to the last known occurrence of the last symbol searched with `auto-highlight-symbol'." (interactive) (if spacemacs-last-ahs-highlight-p (progn (goto-char (nth 1 spacemacs-last-ahs-highlight-p)) (spacemacs/ahs-highlight-now-wrapper) (spacemacs/symbol-highlight-transient-state/body)) (message "No symbol has been searched for now."))) (defun spacemacs/integrate-evil-search (forward) ;; isearch-string is last searched item. Next time ;; "n" is hit we will use this. (let* ((symbol (evil-find-thing forward 'symbol)) (regexp (concat "\\<" symbol "\\>"))) (setq isearch-string regexp isearch-regexp regexp evil-ex-search-pattern (evil-ex-make-search-pattern regexp))) ;; Next time "n" is hit, go the correct direction. (setq isearch-forward forward) ;; ahs does a case sensitive search. We could set ;; this, but it would break the user's current ;; sensitivity settings. We could save the setting, ;; then next time the user starts a search we could ;; restore the setting. ;;(setq case-fold-search nil) ;; Place the search term into the search rings. (isearch-update-ring isearch-string t) (evil-push-search-history isearch-string forward) ;; Use this search term for empty pattern "%s//replacement/" ;; Append case sensitivity (setq evil-ex-last-was-search nil evil-ex-substitute-pattern `(,(concat isearch-string "\\C") nil (0 0)))) (defun spacemacs/ensure-ahs-enabled-locally () "Ensures ahs is enabled for the local buffer." (unless (bound-and-true-p ahs-mode-line) (auto-highlight-symbol-mode) )) (defun spacemacs/ahs-highlight-now-wrapper () "Safe wrapper for ahs-highlight-now" (eval '(progn (spacemacs/ensure-ahs-enabled-locally) (ahs-highlight-now)) nil)) (defun spacemacs/enter-ahs-forward () "Go to the next occurrence of symbol under point with `auto-highlight-symbol'" (interactive) (setq spacemacs--ahs-searching-forward t) (spacemacs/quick-ahs-forward)) (defun spacemacs/enter-ahs-backward () "Go to the previous occurrence of symbol under point with `auto-highlight-symbol'" (interactive) (setq spacemacs--ahs-searching-forward nil) (spacemacs/quick-ahs-forward)) (defun spacemacs/quick-ahs-forward () "Go to the next occurrence of symbol under point with `auto-highlight-symbol'" (interactive) (spacemacs//quick-ahs-move t)) (defun spacemacs/quick-ahs-backward () "Go to the previous occurrence of symbol under point with `auto-highlight-symbol'" (interactive) (spacemacs//quick-ahs-move nil)) (defun spacemacs//quick-ahs-move (forward) "Go to the next occurrence of symbol under point with `auto-highlight-symbol'" (if (eq forward spacemacs--ahs-searching-forward) (progn (spacemacs/integrate-evil-search t) (spacemacs/ahs-highlight-now-wrapper) (evil-set-jump) (spacemacs/symbol-highlight-transient-state/body) (ahs-forward)) (progn (spacemacs/integrate-evil-search nil) (spacemacs/ahs-highlight-now-wrapper) (evil-set-jump) (spacemacs/symbol-highlight-transient-state/body) (ahs-backward)))) (with-eval-after-load 'evil (define-key evil-motion-state-map (kbd "*") 'spacemacs/enter-ahs-forward) (define-key evil-motion-state-map (kbd "#") 'spacemacs/enter-ahs-backward)) (defun spacemacs/symbol-highlight () "Highlight the symbol under point with `auto-highlight-symbol'." (interactive) (spacemacs/ahs-highlight-now-wrapper) (setq spacemacs-last-ahs-highlight-p (ahs-highlight-p)) (spacemacs/symbol-highlight-transient-state/body) (spacemacs/integrate-evil-search nil)) (defun spacemacs//ahs-ms-on-exit () ;; Restore user search direction state as ahs has exitted in a state ;; good for , but not for 'n' and 'N'" (setq isearch-forward spacemacs--ahs-searching-forward)) (defun spacemacs/symbol-highlight-reset-range () "Reset the range for `auto-highlight-symbol'." (interactive) (ahs-change-range ahs-default-range)) (spacemacs/set-leader-keys "sh" 'spacemacs/symbol-highlight "sH" 'spacemacs/goto-last-searched-ahs-symbol) ;; micro-state to easily jump from a highlighted symbol to the others (dolist (sym '(ahs-forward ahs-forward-definition ahs-backward ahs-backward-definition ahs-back-to-start ahs-change-range)) (let* ((advice (intern (format "spacemacs/%s" (symbol-name sym))))) (eval `(defadvice ,sym (around ,advice activate) (spacemacs/ahs-highlight-now-wrapper) ad-do-it (spacemacs/ahs-highlight-now-wrapper) (setq spacemacs-last-ahs-highlight-p (ahs-highlight-p)))))) (defun symbol-highlight-doc () (let* ((i 0) (overlay-count (length ahs-overlay-list)) (overlay (format "%s" (nth i ahs-overlay-list))) (current-overlay (format "%s" ahs-current-overlay)) (st (ahs-stat)) (plighter (ahs-current-plugin-prop 'lighter)) (plugin (format "%s" (cond ((string= plighter "HS") "Display") ((string= plighter "HSA") "Buffer") ((string= plighter "HSD") "Function")))) (face (cond ((string= plighter "HS") ahs-plugin-defalt-face) ((string= plighter "HSA") ahs-plugin-whole-buffer-face) ((string= plighter "HSD") ahs-plugin-bod-face)))) (while (not (string= overlay current-overlay)) (setq i (1+ i)) (setq overlay (format "%s" (nth i ahs-overlay-list)))) (let* ((x/y (format "[%s/%s]" (- overlay-count i) overlay-count)) (hidden (if (< 0 (- overlay-count (nth 4 st))) "*" ""))) (concat (propertize (format " %s " plugin) 'face face) (propertize (format " %s%s " x/y hidden) 'face `(:foreground "#ffffff" :background "#000000")))))) (defun ahs-to-iedit () (interactive) (cond ((and (not (eq dotspacemacs-editing-style 'emacs)) (configuration-layer/package-usedp 'evil-iedit-state)) (evil-iedit-state/iedit-mode) (iedit-restrict-region (ahs-current-plugin-prop 'start) (ahs-current-plugin-prop 'end))) ((and (eq dotspacemacs-editing-style 'emacs) (configuration-layer/package-usedp 'iedit)) (iedit-mode) (iedit-restrict-region (ahs-current-plugin-prop 'start) (ahs-current-plugin-prop 'end))) (t (ahs-edit-mode t)))) ;; transient state (defun spacemacs//symbol-highlight-ts-doc () (spacemacs//transient-state-make-doc 'symbol-highlight (format spacemacs--symbol-highlight-transient-state-doc (symbol-highlight-doc) (make-string (length (symbol-highlight-doc)) 32)))) (spacemacs|define-transient-state symbol-highlight :title "Symbol Highlight Transient State" :dynamic-hint (spacemacs//symbol-highlight-ts-doc) :before-exit (spacemacs//ahs-ms-on-exit) :bindings ("d" ahs-forward-definition) ("D" ahs-backward-definition) ("e" ahs-to-iedit :exit t) ("n" spacemacs/quick-ahs-forward) ("N" spacemacs/quick-ahs-backward) ("p" spacemacs/quick-ahs-backward) ("R" ahs-back-to-start) ("r" ahs-change-range) ("q" nil :exit t))))) (defun spacemacs-editing-visual/init-column-enforce-mode () (use-package column-enforce-mode :commands (column-enforce-mode global-column-enforce-mode) :init (progn (spacemacs|add-toggle highlight-long-lines :status column-enforce-mode :prefix columns :on (column-enforce-n (or columns column-enforce-column)) :on-message (format "long-lines enabled for %s columns." (or columns column-enforce-column)) :off (column-enforce-mode -1) :documentation "Highlight the characters past the 80th column." :evil-leader "t8") (spacemacs|add-toggle highlight-long-lines-globally :mode global-column-enforce-mode :documentation "Globally Highlight the characters past the 80th column." :evil-leader "t C-8")) :config (spacemacs|diminish column-enforce-mode "⑧" "8"))) (defun spacemacs-editing-visual/init-hide-comnt () (use-package hide-comnt :commands hide/show-comments-toggle :init (spacemacs/set-leader-keys "ch" 'hide/show-comments-toggle))) (defun spacemacs-editing-visual/init-highlight-indentation () (use-package highlight-indentation :defer t :init (progn (spacemacs|add-toggle highlight-indentation :mode highlight-indentation-mode :documentation "Highlight indentation levels." :evil-leader "thi") (spacemacs|add-toggle highlight-indentation-current-column :mode highlight-indentation-current-column-mode :documentation "Highlight indentation level at point." :evil-leader "thc")) :config (progn (spacemacs|diminish highlight-indentation-mode " ⓗi" " hi") (spacemacs|diminish highlight-indentation-current-column-mode " ⓗc" " hc")))) (defun spacemacs-editing-visual/init-highlight-numbers () (use-package highlight-numbers :defer t :init (progn (add-hook 'prog-mode-hook 'highlight-numbers-mode) (add-hook 'asm-mode-hook (lambda () (highlight-numbers-mode -1)))))) (defun spacemacs-editing-visual/init-highlight-parentheses () (use-package highlight-parentheses :defer t :init (progn (when (member dotspacemacs-highlight-delimiters '(all current)) (add-hook 'prog-mode-hook #'highlight-parentheses-mode)) (setq hl-paren-delay 0.2) (spacemacs/set-leader-keys "tCp" 'highlight-parentheses-mode) (setq hl-paren-colors '("Springgreen3" "IndianRed1" "IndianRed3" "IndianRed4"))) :config (spacemacs|hide-lighter highlight-parentheses-mode) (set-face-attribute 'hl-paren-face nil :weight 'ultra-bold))) (defun spacemacs-editing-visual/init-hl-anything () (use-package hl-anything :init (progn (hl-highlight-mode) (setq-default hl-highlight-save-file (concat spacemacs-cache-directory ".hl-save")) (spacemacs/set-leader-keys "hc" 'hl-unhighlight-all-local "hC" 'hl-unhighlight-all-global "hh" 'hl-highlight-thingatpt-local "hH" 'hl-highlight-thingatpt-global "hn" 'hl-find-next-thing "hN" 'hl-find-prev-thing "hr" 'hl-restore-highlights "hs" 'hl-save-highlights)) :config (spacemacs|hide-lighter hl-highlight-mode))) (defun spacemacs-editing-visual/init-indent-guide () (use-package indent-guide :defer t :init (progn (setq indent-guide-delay 0.3) (spacemacs|add-toggle indent-guide :mode indent-guide-mode :documentation "Highlight indentation level at point. (alternative to highlight-indentation)." :evil-leader "ti") (spacemacs|add-toggle indent-guide-globally :mode indent-guide-global-mode :documentation "Highlight indentation level at point globally. (alternative to highlight-indentation)." :evil-leader "t TAB")) :config (spacemacs|diminish indent-guide-mode " ⓘ" " i"))) (defun spacemacs-editing-visual/init-rainbow-delimiters () (use-package rainbow-delimiters :defer t :init (progn (spacemacs/set-leader-keys "tCd" 'rainbow-delimiters-mode) (when (member dotspacemacs-highlight-delimiters '(any all)) (spacemacs/add-to-hooks 'rainbow-delimiters-mode '(prog-mode-hook)))))) (defun spacemacs-editing-visual/init-volatile-highlights () (use-package volatile-highlights :config (progn ;; additional extensions ;; evil (vhl/define-extension 'evil 'evil-move 'evil-paste-after 'evil-paste-before 'evil-paste-pop) (with-eval-after-load 'evil (vhl/install-extension 'evil) (vhl/load-extension 'evil)) ;; undo-tree (vhl/define-extension 'undo-tree 'undo-tree-move 'undo-tree-yank) (with-eval-after-load 'undo-tree (vhl/install-extension 'undo-tree) (vhl/load-extension 'undo-tree)) (volatile-highlights-mode) (spacemacs|hide-lighter volatile-highlights-mode))))