138 lines
5.4 KiB
EmacsLisp
138 lines
5.4 KiB
EmacsLisp
;;; funcs.el --- Spacemacs Bootstrap Layer functions File
|
||
;;
|
||
;; Copyright (c) 2012-2016 Sylvain Benner & Contributors
|
||
;;
|
||
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
|
||
;; 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 \"<\" \"<gv\")"
|
||
(let ((map (intern (format "evil-%S-state-map" state))))
|
||
`(define-key ,map ,key
|
||
(lambda ()
|
||
(interactive)
|
||
,(if (string-equal key (substring seq 0 1))
|
||
`(progn
|
||
(call-interactively ',(lookup-key evil-normal-state-map key))
|
||
(execute-kbd-macro ,(substring seq 1)))
|
||
(execute-kbd-macro ,seq)))))))
|
||
|
||
(defun spacemacs/diminish-hook (_)
|
||
"Display diminished lighter in vanilla Emacs mode-line."
|
||
(let ((unicodep (dotspacemacs|symbol-value
|
||
dotspacemacs-mode-line-unicode-symbols)))
|
||
(cl-loop for (mode uni nouni) in spacemacs--diminished-minor-modes
|
||
do (diminish mode (if unicodep uni nouni)))))
|
||
|
||
|
||
|
||
(defun spacemacs//hydra-key-doc-function (key key-width doc doc-width)
|
||
"Custom hint documentation format for keys."
|
||
(format (format "[%%%ds] %%%ds" key-width (- -1 doc-width))
|
||
key doc))
|