views:

1903

answers:

4

I've tried to migrate to Emacs several times for Clojure development, following a variety of blogposts, screencast and tutorials, but somewhere along the way something always went wrong - keybindings that didn't work, incompatible versions, etc, and I found myself scrambling back to Vim. But I know I want Paredit and SLIME.

So, I'm going to try again, this time backed by the powerful StackOverflow™ community.

I hope that the answer to this question will remain up-to-date, and can serve as a reference for tentative converts like me.

What I'd like is: - The latest stable release of Clojure - Aquamacs (if it's good enough for Rich Hickey, it's good enough for me), a recent version - Clojure Mode - SLIME/SWANK - Paredit - Anything else that's indispensible?

Step-by-step instructions to install the above would be excellent - preferably in shell script format. I'd also like some hints on how to get started with the most common Clojure-related actions (including key-bindings), including links to documentation and cheatsheets.

+2  A: 

Download and install Aquamacs.

Download and install ELPA (http://tromey.com/elpa/install.html)

Do M-x package-list-packages

Mark the lines called "clojure-mode" and "swank-clojure" with "I" then press "X".

Done.

mac
There are no instructions for installing ELPA on Aquamacs, and the instructions for Emacs 22 don't work.
Michiel de Mare
Don't work in what way? do you get an error message. Oh - you execute by positioning the cursor right of the last paren and press C-x-e.
mac
The ELPA-documentation said C-j, but C-x-e (that's C-x C-e) works. Well, it gave a http error the first time, but the second time showed the package list. I also selected the packages slime, and slime-repl, by pressing 'i', not 'I'. Pressing 'x' started compilation, which gave me a bunch of warnings and one error (in slime-repl), hopefully not fatal.
Michiel de Mare
You can always do C-h m (That's a separate simple m, not C-m) to get help on the current major mode, as well as any minor modes in operation, which will tell you all the current keybindings. That's true for Emacs, anyway; but I imagine Aquamacs probably has it too.
Michał Marczyk
+3  A: 

Here's a blog post that mentions Aquamacs: Setting up Clojure, Incanter, Emacs, Slime, Swank, and Paredit

Jouni K. Seppänen
The blog is a more detailed version of my reply above. It also explains the diffs btw versions of Emacs for OSX. Good find!
mac
Great article - pity it used Maven. I picked up an virulent allergy to maven around 2004 or so - apparently it's gotten better but I'd like to do without it all the same.
Michiel de Mare
A: 

I know the OP wants to use Emacs for Clojure dev. I'm an emacs fan myself, but I found using Enclojure (http://www.enclojure.org/home) to be a great way to get started quickly with hacking Clojure.

pratik patel
Thanks for the tip, I'm aware that there are good alternatives, but this thread is really for Aquamacs tips - even Carbon Emacs is off-topic.
Michiel de Mare
+3  A: 

These are the steps I took to set them up without using ELPA. Hope this helps.

Get SLIME using MacPorts

sudo port -v install slime

Get paredit

curl -O http://mumble.net/~campbell/emacs/paredit.el

Get clojure & clojure-contrib

  • Either using MacPorts
sudo port -v install clojure clojure-contrib
  • Or downloading directly
curl -O http://build.clojure.org/snapshots/org/clojure/clojure/1.1.0-master-SNAPSHOT/clojure-1.1.0-master-20091202.150145-1.jar
curl -O http://build.clojure.org/snapshots/org/clojure/clojure-contrib/1.1.0-master-SNAPSHOT/clojure-contrib-1.1.0-master-20091212.205045-1.jar

Get clojure-mode and swank-clojure (Emacs side)

git clone http://github.com/technomancy/clojure-mode.git
git clone http://github.com/technomancy/swank-clojure.git

Get swank-clojure (Clojure side)

  • Either downloading pre-built jar file
curl -O http://repo.technomancy.us/swank-clojure-1.1.0.jar
  • Or building from source (assuming lein is installed)
cd path/to/dir/swank-clojure
lein jar

Put clojure, clojure-contrib and swank-clojure .jar files in ~/.swank-clojure or ~/.clojure (the default places where swank-clojure.el searches for them).


Add to either ~/.emacs or ~/Library/Preferences/Aquamacs Emacs/customization.el (change paths to match your own settings)

(add-to-list 'load-path "/opt/local/share/emacs/site-lisp/slime/")
(add-to-list 'load-path "/opt/local/share/emacs/site-lisp/slime/contrib/")
;; Change these paths to match your settings
(add-to-list 'load-path "path/to/dir/clojure-mode/")
(add-to-list 'load-path "path/to/dir/swank-clojure/")
(add-to-list 'load-path "path/to/dir/paredit/")

;; Customize swank-clojure start-up to reflect possible classpath changes
;; M-x ielm `slime-lisp-implementations RET or see `swank-clojure.el' for more info 
(defadvice slime-read-interactive-args (before add-clojure)
(require 'assoc)
(aput 'slime-lisp-implementations 'clojure
(list (swank-clojure-cmd) :init 'swank-clojure-init)))

(require 'slime)
(require 'paredit)
(require 'clojure-mode)
(require 'swank-clojure)

(eval-after-load "slime"
  '(progn
    ;; "Extra" features (contrib)
    (slime-setup 
     '(slime-repl slime-banner slime-highlight-edits slime-fuzzy))
    (setq 
     ;; Use UTF-8 coding
     slime-net-coding-system 'utf-8-unix
     ;; Use fuzzy completion (M-Tab)
     slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
    ;; Use parentheses editting mode paredit
    (defun paredit-mode-enable () (paredit-mode 1))
    (add-hook 'slime-mode-hook 'paredit-mode-enable)
    (add-hook 'slime-repl-mode-hook 'paredit-mode-enable)))

;; By default inputs and results have the same color
;; Customize result color to differentiate them
;; Look for `defface' in `slime-repl.el' if you want to further customize
(custom-set-faces
 '(slime-repl-result-face ((t (:foreground "LightGreen")))))

(eval-after-load "swank-clojure"
  '(progn
    ;; Make REPL more friendly to Clojure (ELPA does not include this?)
    ;; The function is defined in swank-clojure.el but not used?!?
    (add-hook 'slime-repl-mode-hook
      'swank-clojure-slime-repl-modify-syntax t)
    ;; Add classpath for Incanter (just an example)
    ;; The preferred way to set classpath is to use swank-clojure-project
    (add-to-list 'swank-clojure-classpath 
"path/to/incanter/modules/incanter-app/target/*")))
ubolonton
Thanks for your elaborate reply - I'm going to give it a try tonight. Do you have an alternative to installing SLIME with MacPorts? I'm aiming to have a minimal set of dependencies.
Michiel de Mare
You can download it at http://common-lisp.net/project/slime/snapshots/slime-current.tgz or use CVS to clone the repo: cvs -d :pserver:anonymous:[email protected]:/project/slime/cvsroot co slime
ubolonton