Search code examples
emacsclojurelispcommon-lispslime

emacs setup for both clojure and common lisp with slime-fancy (slime-autodoc)


I set up emacs for both clojure and common lisp, but I want also (slime-setup '(slime-fancy)) for common lisp. If I add that line to init.el, clojure won't work: it gives me repl, but it hangs after I run any code.

My configuration

For clojure:

  • I set up clojure-mode, slime, slime-repl via ELPA
  • I run $ lein swank in project directory
  • Then M-x slime-connect to hack clojure

For common lisp I place this after ELPA code in init.el:

(add-to-list 'load-path "~/.elisp/slime")
(require 'slime)
(add-to-list 'slime-lisp-implementations '(sbcl ("/opt/local/bin/sbcl") :coding-system utf-8-unix))
;; (slime-setup '(slime-fancy))

So if I uncomment the last line, clojure will be broken. But slime-fancy a very important meta package for hacking common lisp.


Is there a way to set them both up to work without changing configuration and restarting when I need to switch languages?


Update

I found that slime-autodoc loaded with slime-fancy is the cause of hangs.

(slime-setup '(slime-fancy))
(setq slime-use-autodoc-mode nil)

This configuration lets run both common lisp and clojure SLIMEs. Even simultaneously. But without slime-autodoc.

I also found I'm using the CVS version of SLIME since I manually do (add-to-list 'load-path "~/.elisp/slime") after ELPA code. That does not solve the problem. Maybe there is a version from some magic date which works with clojure? Here a guy says CVS version works for him: http://www.youtube.com/watch?v=lf_xI3fZdIg&feature=player_detailpage#t=221s


Solution

  • Here is a solution. (using hooks)
    That is ugly but quite convenient.

    (add-hook 'slime-connected-hook
              (lambda ()
                (if (string= (slime-lisp-implementation-type) "Clojure")
                    (setq slime-use-autodoc-mode nil)
                  (setq slime-use-autodoc-mode t))
                ))
    
    (add-hook 'slime-mode-hook
              (lambda ()
                (if (eq major-mode 'clojure-mode)
                      (slime-autodoc-mode 0)
                    (slime-autodoc-mode 1))))
    

    Update If the problem still exists on the slime-repl buffer, try the following code:

    (add-hook 'slime-repl-mode-hook
              (lambda ()
                (if (string= (slime-lisp-implementation-type) "Clojure")
                    (progn (setq slime-use-autodoc-mode nil)
                           (slime-autodoc-mode 0))
                  (progn (setq slime-use-autodoc-mode t)
                         (slime-autodoc-mode 1)))))