spacemacs/layers/+lang/emacs-lisp/packages.el
justbur 776c4f0a97 emacs-lisp: Add eval funcs and fix leader bindings
Functions for evaluating the form (not an atom) that the point is
currently in, and for evaluating the symbol underneath the point. Both
require smartparens to work.

Also, add all evil-leader bindings to lisp-interaction-mode and declare
prefixes.
2015-09-27 22:15:31 -04:00

169 lines
5.7 KiB
EmacsLisp

;;; packages.el --- Emacs Lisp Layer packages File for Spacemacs
;;
;; Copyright (c) 2012-2014 Sylvain Benner
;; Copyright (c) 2014-2015 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
'(
company
eldoc
elisp-slime-nav
(emacs-lisp :location built-in)
evil
flycheck
ielm
macrostep
semantic
smartparens
srefactor
))
(use-package ielm
:config
(progn
(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))))
(dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(spacemacs/declare-prefix-for-mode mode "ms" "ielm")
(evil-leader/set-key-for-mode mode
"msi" 'ielm))))
(defun emacs-lisp/post-init-company ()
(spacemacs|add-company-hook ielm-mode)
(push '(company-files company-capf) company-backends-ielm-mode))
(defun emacs-lisp/post-init-eldoc ()
(add-hook 'emacs-lisp-mode-hook 'eldoc-mode))
(defun emacs-lisp/init-elisp-slime-nav ()
;; Elisp go-to-definition with M-. and back again with M-,
(use-package elisp-slime-nav
:defer t
:init
(progn
(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/declare-prefix-for-mode mode "mh" "help")
(evil-leader/set-key-for-mode mode
"mgg" 'elisp-slime-nav-find-elisp-thing-at-point
"mhh" 'elisp-slime-nav-describe-elisp-thing-at-point)))))
(defun emacs-lisp/init-emacs-lisp ()
(dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(spacemacs/declare-prefix-for-mode mode "me" "eval")
(spacemacs/declare-prefix-for-mode mode "mt" "tests")
(evil-leader/set-key-for-mode mode
"me$" 'lisp-state-eval-sexp-end-of-line
"meb" 'eval-buffer
"mee" 'eval-last-sexp
"mer" 'eval-region
"mef" 'eval-defun
"mel" 'lisp-state-eval-sexp-end-of-line
"m," 'lisp-state-toggle-lisp-state
"mtb" 'spacemacs/ert-run-tests-buffer
"mtq" 'ert))
;; company support
(push 'company-capf company-backends-emacs-lisp-mode)
(spacemacs|add-company-hook emacs-lisp-mode))
(defun emacs-lisp/init-macrostep ()
(use-package macrostep
:defer t
:mode ("\\*.el\\'" . emacs-lisp-mode)
:init
(progn
(spacemacs|define-micro-state macrostep
:doc "[e] expand [c] collapse [n/N] next/previous [q] quit"
:disable-evil-leader t
:persistent t
:evil-leader-for-mode (emacs-lisp-mode . "mdm")
:bindings
("e" macrostep-expand)
("c" macrostep-collapse)
("n" macrostep-next-macro)
("N" macrostep-prev-macro)
("q" macrostep-collapse-all :exit t)))))
(defun emacs-lisp/post-init-evil ()
(spacemacs/add-to-hook 'emacs-lisp-mode
'(lambda ()
(spacemacs|define-text-object ";"
"elisp-comment"
";; "
""))))
(defun emacs-lisp/post-init-flycheck ()
;; 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/post-init-semantic ()
(semantic/enable-semantic-mode 'emacs-lisp-mode)
(eval-after-load 'semantic
'(semantic-default-elisp-setup)))
(defun emacs-lisp/post-init-srefactor ()
(add-hook 'emacs-lisp-mode-hook 'spacemacs/lazy-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")
(evil-leader/set-key-for-mode mode
"m=b" 'srefactor-lisp-format-buffer
"m=d" 'srefactor-lisp-format-defun
"m=o" 'srefactor-lisp-one-line
"m=s" 'srefactor-lisp-format-sexp))))
(defun emacs-lisp/post-init-smartparens ()
(if (version< emacs-version "24.4")
(ad-disable-advice 'preceding-sexp 'around 'evil)
(advice-remove 'elisp--preceding-sexp 'evil--preceding-sexp))
(defun spacemacs/eval-current-form-sp (&optional arg)
"Call `eval-last-sexp' after moving out of one level of
parentheses. Will exit any strings and/or comments first.
Requires smartparens because all movement is done using
`sp-up-sexp'. An optional ARG can be used which is passed to
`sp-up-sexp' to move out of more than one sexp."
(interactive "p")
(require 'smartparens)
(save-excursion
(let ((max 10))
(while (and (> max 0)
(sp-point-in-string-or-comment))
(decf max)
(sp-up-sexp)))
(sp-up-sexp arg)
(call-interactively 'eval-last-sexp)))
(defun spacemacs/eval-current-symbol-sp ()
"Call `eval-last-sexp' on the symbol underneath the
point. Requires smartparens because all movement is done using
`sp-forward-symbol'."
(interactive)
(require 'smartparens)
(save-excursion
(sp-forward-symbol)
(call-interactively 'eval-last-sexp)))
(dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
(evil-leader/set-key-for-mode mode
"mec" 'spacemacs/eval-current-form-sp
"mes" 'spacemacs/eval-current-symbol-sp)))