spacemacs/layers/+lang/emacs-lisp/packages.el
madand e1ad035513 Improve rainbow-identifiers experience for Elisp and CL
Make rainbow-identifiers not colorize special operators and macros, so they
always visually stand out. Rationale behind this change is that special
operators and macros in Lisp may be considered "syntax" elements, so it makes
sense to have them visually distinguished at all times.
2020-01-20 11:37:20 +01:00

313 lines
11 KiB
EmacsLisp

;;; packages.el --- Emacs Lisp Layer packages File for Spacemacs
;;
;; Copyright (c) 2012-2018 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
(setq emacs-lisp-packages
'(
auto-compile
company
(debug :location built-in)
(edebug :location built-in)
eldoc
elisp-slime-nav
(emacs-lisp :location built-in)
evil
evil-cleverparens
eval-sexp-fu
flycheck
flycheck-elsa
flycheck-package
ggtags
counsel-gtags
helm-gtags
(ielm :location built-in)
macrostep
nameless
overseer
parinfer
rainbow-identifiers
semantic
smartparens
srefactor
))
(defun emacs-lisp/init-ielm ()
(use-package ielm
:defer t
:init
(progn
(spacemacs/register-repl 'ielm 'ielm)
(dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(spacemacs/declare-prefix-for-mode mode "ms" "ielm")
(spacemacs/set-leader-keys-for-major-mode mode
"'" 'ielm
"si" 'ielm)))
:config
(defun ielm-indent-line ()
(interactive)
(let ((current-point (point)))
(save-restriction
(narrow-to-region (search-backward-regexp "^ELISP>") (goto-char current-point))
(lisp-indent-line))))))
(defun emacs-lisp/post-init-company ()
(spacemacs|add-company-backends :backends company-capf
:modes emacs-lisp-mode)
(spacemacs|add-company-backends :backends (company-files company-capf)
:modes ielm-mode))
(defun emacs-lisp/init-debug ()
(use-package debug
:defer t
:init (dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(spacemacs/declare-prefix-for-mode mode "md" "debug")
(spacemacs/set-leader-keys-for-major-mode mode
"dt" 'spacemacs/elisp-toggle-debug-expr-and-eval-func))
:config (evilified-state-evilify-map debugger-mode-map
:mode debugger-mode)))
(defun emacs-lisp/init-edebug ()
(use-package edebug
:defer t
:init
(progn
;; key bindings
(dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(spacemacs/set-leader-keys-for-major-mode mode
"df" 'spacemacs/edebug-instrument-defun-on
"dF" 'spacemacs/edebug-instrument-defun-off))
;; since we evilify `edebug-mode-map' we don't need to intercept it to
;; make it work with evil
(evil-set-custom-state-maps
'evil-intercept-maps
'evil-pending-intercept-maps
'intercept-state
'evil-make-intercept-map
(delq (assq 'edebug-mode-map evil-intercept-maps)
evil-intercept-maps))
(evilified-state-evilify-map edebug-mode-map
:eval-after-load edebug
:bindings
"a" 'edebug-stop
"c" 'edebug-go-mode
"s" 'edebug-step-mode
"S" 'edebug-next-mode)
(evilified-state-evilify-map edebug-eval-mode-map
:eval-after-load edebug
:bindings
"a" 'edebug-stop
"c" 'edebug-go-mode
"s" 'edebug-step-mode
"S" 'edebug-next-mode)
(advice-add 'edebug-mode :after 'spacemacs//edebug-mode))))
(defun emacs-lisp/post-init-eldoc ()
(add-hook 'emacs-lisp-mode-hook 'eldoc-mode))
(defun emacs-lisp/init-auto-compile ()
(use-package auto-compile
:defer (spacemacs/defer)
:init
(progn
(spacemacs|require 'auto-compile)
(setq auto-compile-display-buffer nil
;; lets spaceline manage the mode-line
auto-compile-use-mode-line nil
auto-compile-mode-line-counter t)
(add-hook 'emacs-lisp-mode-hook 'auto-compile-mode))
:config
(progn
(spacemacs|hide-lighter auto-compile-mode)
(spacemacs/set-leader-keys-for-major-mode 'emacs-lisp-mode
"cl" 'auto-compile-display-log))))
(defun emacs-lisp/init-elisp-slime-nav ()
;; Elisp go-to-definition with M-. and back again with M-,
(use-package elisp-slime-nav
:defer (spacemacs/defer)
:init
(progn
(spacemacs|require 'elisp-slime-nav)
(add-hook 'emacs-lisp-mode-hook 'elisp-slime-nav-mode)
(dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(spacemacs/declare-prefix-for-mode mode "mg" "find-symbol")
(spacemacs/set-leader-keys-for-major-mode mode
"gb" 'xref-pop-marker-stack)
(spacemacs/declare-prefix-for-mode mode "mh" "help")
;; Load better help mode if helpful is installed
(if (configuration-layer/layer-used-p 'helpful)
(spacemacs/set-leader-keys-for-major-mode mode
"hh" 'helpful-at-point)
(spacemacs/set-leader-keys-for-major-mode mode
"hh" 'elisp-slime-nav-describe-elisp-thing-at-point))
(let ((jumpl (intern (format "spacemacs-jump-handlers-%S" mode))))
(add-to-list jumpl 'elisp-slime-nav-find-elisp-thing-at-point))))
:config (spacemacs|hide-lighter elisp-slime-nav-mode)))
(defun emacs-lisp/init-emacs-lisp ()
(dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(spacemacs/declare-prefix-for-mode mode "mc" "compile")
(spacemacs/declare-prefix-for-mode mode "me" "eval")
(spacemacs/declare-prefix-for-mode mode "mt" "tests")
(spacemacs/set-leader-keys-for-major-mode mode
"cc" 'emacs-lisp-byte-compile
"e$" 'lisp-state-eval-sexp-end-of-line
"eb" 'eval-buffer
"eC" 'spacemacs/eval-current-form
"ee" 'eval-last-sexp
"er" 'eval-region
"ef" 'eval-defun
"el" 'lisp-state-eval-sexp-end-of-line
"gG" 'spacemacs/nav-find-elisp-thing-at-point-other-window
"," 'lisp-state-toggle-lisp-state
"tb" 'spacemacs/ert-run-tests-buffer
"tq" 'ert)))
(defun emacs-lisp/init-macrostep ()
(use-package macrostep
:defer t
:mode (("\\*.el\\'" . emacs-lisp-mode)
("Cask\\'" . emacs-lisp-mode))
:init
(progn
(evil-define-key 'normal macrostep-keymap "q" 'macrostep-collapse-all)
(spacemacs|define-transient-state macrostep
:title "MacroStep Transient State"
:doc "\n[_e_] expand [_c_] collapse [_n_/_N_] next/previous [_q_] quit"
:foreign-keys run
:bindings
("e" macrostep-expand)
("c" macrostep-collapse)
("n" macrostep-next-macro)
("N" macrostep-prev-macro)
("q" macrostep-collapse-all :exit t))
(spacemacs/set-leader-keys-for-major-mode 'emacs-lisp-mode
"dm" 'spacemacs/macrostep-transient-state/body))))
(defun emacs-lisp/init-nameless ()
(use-package nameless
:defer (spacemacs/defer)
:init
(progn
(spacemacs|require 'nameless)
(setq
;; always show the separator since it can have a semantic purpose
;; like in Spacemacs where - is variable and / is a function.
;; moreover it makes nameless work for all kind of separators.
nameless-separator nil
;; Use > as the defautl prefix : is already used for
;; keywords
nameless-prefix ">")
;; some default aliases for Spacemacs source code
(setq nameless-global-aliases '(("SB" . "spacemacs-buffer")
("S" . "spacemacs")
(".S" . "dotspacemacs")
("CL" . "configuration-layer")))
;; make `nameless-current-name' safe as a local variable for string values
(put 'nameless-current-name 'safe-local-variable #'stringp)
(spacemacs|diminish nameless-mode " 🅽" " [n]")
(spacemacs|add-toggle nameless
:status nameless-mode
:on (nameless-mode)
:off (nameless-mode -1)
:documentation "Hide package namespaces in your emacs-lisp code."
:evil-leader-for-mode (emacs-lisp-mode . "Tn"))
;; activate nameless only when in a GUI
;; in a terminal nameless triggers all sorts of graphical glitches.
(spacemacs|do-after-display-system-init
(when emacs-lisp-hide-namespace-prefix
(spacemacs/toggle-nameless-on-register-hook-emacs-lisp-mode))))))
(defun emacs-lisp/init-overseer ()
(use-package overseer
:defer t
:init (spacemacs/set-leader-keys-for-major-mode 'emacs-lisp-mode
"ta" 'overseer-test
"tt" 'overseer-test-run-test
"tb" 'overseer-test-this-buffer
"tf" 'overseer-test-file
"tg" 'overseer-test-tags
"tp" 'overseer-test-prompt
"tA" 'overseer-test-debug
"tq" 'overseer-test-quiet
"tv" 'overseer-test-verbose
"th" 'overseer-help)))
(defun emacs-lisp/post-init-evil ()
(add-hook 'emacs-lisp-mode-hook #'spacemacs//define-elisp-comment-text-object))
(defun emacs-lisp/pre-init-evil-cleverparens ()
(spacemacs|use-package-add-hook evil-cleverparens
:pre-init
(add-to-list 'evil-lisp-safe-structural-editing-modes 'emacs-lisp-mode)))
(defun emacs-lisp/post-init-eval-sexp-fu ()
(add-hook 'emacs-lisp-mode-hook 'eval-sexp-fu-flash-mode))
(defun emacs-lisp/post-init-flycheck ()
;; Don't activate flycheck by default in elisp
;; because of too much false warnings
;; (spacemacs/enable-flycheck 'emacs-lisp-mode)
;; Make flycheck recognize packages in loadpath
;; i.e (require 'company) will not give an error now
(setq flycheck-emacs-lisp-load-path 'inherit))
(defun emacs-lisp/init-flycheck-package ()
(use-package flycheck-package
:hook (emacs-lisp-mode . flycheck-package-setup)))
(defun emacs-lisp/init-flycheck-elsa ()
(use-package flycheck-elsa
:hook (emacs-lisp-mode . flycheck-elsa-setup)))
(defun emacs-lisp/post-init-counsel-gtags ()
(spacemacs/counsel-gtags-define-keys-for-mode 'emacs-lisp-mode))
(defun emacs-lisp/post-init-helm-gtags ()
(spacemacs/helm-gtags-define-keys-for-mode 'emacs-lisp-mode))
(defun emacs-lisp/post-init-ggtags ()
(add-hook 'emacs-lisp-mode-local-vars-hook #'spacemacs/ggtags-mode-enable))
(defun emacs-lisp/post-init-parinfer ()
(add-hook 'emacs-lisp-mode-hook 'parinfer-mode))
(defun emacs-lisp/post-init-rainbow-identifiers ()
(add-hook 'emacs-lisp-mode-hook #'colors//rainbow-identifiers-ignore-keywords))
(defun emacs-lisp/post-init-semantic ()
(add-hook 'emacs-lisp-mode-hook 'semantic-mode)
(with-eval-after-load 'semantic
(semantic-default-elisp-setup)))
(defun emacs-lisp/post-init-srefactor ()
(add-hook 'emacs-lisp-mode-hook 'spacemacs/load-srefactor)
(use-package srefactor-lisp
:commands (srefactor-lisp-format-buffer
srefactor-lisp-format-defun
srefactor-lisp-format-sexp
srefactor-lisp-one-line)
:init
(dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(spacemacs/declare-prefix-for-mode mode "m=" "srefactor")
(spacemacs/set-leader-keys-for-major-mode mode
"=b" 'srefactor-lisp-format-buffer
"=d" 'srefactor-lisp-format-defun
"=o" 'srefactor-lisp-one-line
"=s" 'srefactor-lisp-format-sexp))))
(defun emacs-lisp/post-init-smartparens ()
(dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(spacemacs/set-leader-keys-for-major-mode mode
"ec" 'spacemacs/eval-current-form-sp
"es" 'spacemacs/eval-current-symbol-sp)))