;;; packages.el --- Common Lisp Layer packages File for Spacemacs
;;
;; 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

(setq common-lisp-packages
      '(auto-highlight-symbol
        (common-lisp-snippets :toggle (configuration-layer/package-usedp 'yasnippet))
        ggtags
        helm
        helm-gtags
        slime
        slime-company))

(defun common-lisp/post-init-auto-highlight-symbol ()
  (with-eval-after-load 'auto-highlight-symbol
    (add-to-list 'ahs-plugin-bod-modes 'lisp-mode)))

(defun common-lisp/init-common-lisp-snippets ())

(defun common-lisp/post-init-helm ()
  (spacemacs/set-leader-keys-for-major-mode 'lisp-mode
    "sI" 'spacemacs/helm-slime))

(defun common-lisp/post-init-ggtags ()
  (add-hook 'common-lisp-mode-local-vars-hook #'spacemacs/ggtags-mode-enable))

(defun common-lisp/post-init-helm-gtags ()
  (spacemacs/helm-gtags-define-keys-for-mode 'common-lisp-mode))

(defun common-lisp/init-slime-company ()
  (setq slime-company-completion 'fuzzy))

(defun common-lisp/init-slime ()
  (use-package slime
    :commands slime-mode
    :init
    (progn
      (spacemacs/register-repl 'slime 'slime)
      (setq slime-contribs '(slime-fancy
                             slime-indentation
                             slime-sbcl-exts
                             slime-scratch)
            inferior-lisp-program "sbcl")
      (when (configuration-layer/package-usedp 'slime-company)
        (push 'slime-company slime-contribs))
      ;; enable fuzzy matching in code buffer and SLIME REPL
      (setq slime-complete-symbol*-fancy t)
      (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
      ;; enabel smartparen in code buffer and SLIME REPL
      ;; (add-hook 'slime-repl-mode-hook #'smartparens-strict-mode)
      (defun slime/disable-smartparens ()
        (smartparens-strict-mode -1)
        (turn-off-smartparens-mode))
      (add-hook 'slime-repl-mode-hook #'slime/disable-smartparens)
      (spacemacs/add-to-hooks 'slime-mode '(lisp-mode-hook)))
    :config
    (progn
      (slime-setup)
      ;; TODO: Add bindings for the SLIME debugger?
      (spacemacs/set-leader-keys-for-major-mode 'lisp-mode
        "'" 'slime

        "cc" 'slime-compile-file
        "cC" 'slime-compile-and-load-file
        "cl" 'slime-load-file
        "cf" 'slime-compile-defun
        "cr" 'slime-compile-region
        "cn" 'slime-remove-notes

        "eb" 'slime-eval-buffer
        "ef" 'slime-eval-defun
        "eF" 'slime-undefine-function
        "ee" 'slime-eval-last-expression
        "er" 'slime-eval-region

        "gb" 'slime-pop-find-definition-stack
        "gn" 'slime-next-note
        "gN" 'slime-previous-note

        "ha" 'slime-apropos
        "hA" 'slime-apropos-all
        "hd" 'slime-disassemble-symbol
        "hh" 'slime-describe-symbol
        "hH" 'slime-hyperspec-lookup
        "hp" 'slime-apropos-package
        "ht" 'slime-toggle-trace-fdefinition
        "hT" 'slime-untrace-all
        "h<" 'slime-who-calls
        "h>" 'slime-calls-who
        ;; TODO: Add key bindings for who binds/sets globals?
        "hr" 'slime-who-references
        "hm" 'slime-who-macroexpands
        "hs" 'slime-who-specializes

        "ma" 'slime-macroexpand-all
        "mo" 'slime-macroexpand-1

        "se" 'slime-eval-last-expression-in-repl
        "si" 'slime
        "sq" 'slime-quit-lisp

        "tf" 'slime-toggle-fancy-trace)
      ;; prefix names for which-key
      (mapc (lambda (x)
              (spacemacs/declare-prefix-for-mode 'lisp-mode (car x) (cdr x)))
            '(("mh" . "help")
              ("me" . "eval")
              ("ms" . "repl")
              ("mc" . "compile")
              ("mg" . "nav")
              ("mm" . "macro")
              ("mt" . "toggle"))))))
