;;; packages.el --- Emacs Lisp Layer packages File for Spacemacs ;; ;; Copyright (c) 2012-2018 Sylvain Benner & Contributors ;; ;; Author: Sylvain Benner ;; 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 emr )) (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))) (defun emacs-lisp/init-emr () (use-package emr :config (let ((key-binding-prefixes '(("mr" . "refactor") ("mrd" . "delete") ("mre" . "extract/expand") ("mrf" . "find/function") ("mri" . "insert/inline")))) (mapc (lambda (x) (spacemacs/declare-prefix-for-mode 'emacs-lisp-mode (car x) (cdr x))) key-binding-prefixes)) (spacemacs/set-leader-keys-for-major-mode 'emacs-lisp-mode "rfe" #'emr-el-implement-function "rfd" #'emr-el-find-unused-definitions "ref" #'emr-el-extract-function "rev" #'emr-el-extract-variable "rel" #'emr-el-extract-to-let "rec" #'emr-el-extract-constant "rea" #'emr-el-extract-autoload "riv" #'emr-el-inline-variable "ris" #'emr-el-inline-let-variable "rif" #'emr-el-inline-function "ria" #'emr-el-insert-autoload-directive "rdl" #'emr-el-delete-let-binding-form "rdd" #'emr-el-delete-unused-definition "ew" #'emr-el-eval-and-replace)))