;;; funcs.el --- Spacemacs Bootstrap Layer functions 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 (defun spacemacs/state-color-face (state) "Return the symbol of the face for the given STATE." (intern (format "spacemacs-%s-face" (symbol-name state)))) (defun spacemacs/state-color (state) "Return the color string associated to STATE." (face-background (spacemacs/state-color-face state))) (defun spacemacs/current-state-color () "Return the color string associated to the current state." (face-background (spacemacs/state-color-face evil-state))) (defun spacemacs/state-face (state) "Return the face associated to the STATE." (spacemacs/state-color-face state)) (defun spacemacs/current-state-face () "Return the face associated to the current state." (let ((state (if (eq evil-state 'operator) evil-previous-state evil-state))) (spacemacs/state-color-face state))) (defun spacemacs/set-state-faces () (cl-loop for (state color cursor) in spacemacs-evil-cursors do (set-face-attribute (intern (format "spacemacs-%s-face" state)) nil :foreground (face-background 'mode-line)))) (defun evil-insert-state-cursor-hide () (setq evil-insert-state-cursor '((hbar . 0)))) (defun spacemacs/evil-smart-doc-lookup () "Version of `evil-lookup' that attempts to use the mode specific goto-definition binding, i.e. `SPC m h h`, to lookup the source of the definition, while falling back to `evil-lookup'" (interactive) (let ((binding (key-binding (kbd (concat dotspacemacs-leader-key " mhh"))))) (if (commandp binding) (call-interactively binding) (evil-lookup)))) (defun spacemacs//set-evil-shift-width () "Set the value of `evil-shift-width' based on the indentation settings of the current major mode." (let ((shift-width (catch 'break (dolist (test spacemacs--indent-variable-alist) (let ((mode (car test)) (val (cdr test))) (when (or (and (symbolp mode) (derived-mode-p mode)) (and (listp mode) (apply 'derived-mode-p mode)) (eq 't mode)) (when (not (listp val)) (setq val (list val))) (dolist (v val) (cond ((integerp v) (throw 'break v)) ((and (symbolp v) (boundp v)) (throw 'break (symbol-value v)))))))) (throw 'break (default-value 'evil-shift-width))))) (when (and (integerp shift-width) (< 0 shift-width)) (setq-local evil-shift-width shift-width)))) (defmacro spacemacs|define-text-object (key name start end) "Define a text object and a surround pair. START and END are strings (not regular expressions) that define the boundaries of the text object." `(progn (spacemacs|define-text-object-regexp ,key ,name ,(regexp-quote start) ,(regexp-quote end)) (with-eval-after-load 'evil-surround (push (cons (string-to-char ,key) (if ,end (cons ,start ,end) ,start)) evil-surround-pairs-alist)))) (defmacro spacemacs|define-text-object-regexp (key name start-regexp end-regexp) "Define a text object. START-REGEXP and END-REGEXP are the boundaries of the text object." (let ((inner-name (make-symbol (concat "evil-inner-" name))) (outer-name (make-symbol (concat "evil-outer-" name)))) `(progn (evil-define-text-object ,inner-name (count &optional beg end type) (evil-select-paren ,start-regexp ,end-regexp beg end type count nil)) (evil-define-text-object ,outer-name (count &optional beg end type) (evil-select-paren ,start-regexp ,end-regexp beg end type count t)) (define-key evil-inner-text-objects-map ,key (quote ,inner-name)) (define-key evil-outer-text-objects-map ,key (quote ,outer-name))))) ;; need to delay this macro since it relies on evil key maps to be defined (with-eval-after-load 'evil (defmacro evil-map (state key seq) "Map for a given STATE a KEY to a sequence SEQ of keys. Can handle recursive definition only if KEY is the first key of SEQ. Example: (evil-map visual \"<\" \"