[Modifier par un non-auteur: il s'agit de 2010, et le processus a été considérablement simplifié depuis mai 2011. J'ajouterai un message à cette réponse avec mes notes de configuration à compter de février 2012.]
Vous devrez assembler quelques morceaux: Emacs, SLIME (qui fonctionne parfaitement avec Clojure - voir swank-clojure), swank-clojure (l'implémentation Clojure de l'homologue serveur de SLIME), clojure-mode, Paredit et, de Bien sûr, le pot Clojure pour commencer, puis peut-être quelques extras parmi lesquels Leiningen serait peut-être le plus notable. Une fois que vous avez tout configuré, vous aurez - dans Emacs - toutes les fonctionnalités de flux de travail / d'édition que vous mentionnez dans la question.
Configuration de base:
Ce qui suit sont d'excellents tutoriels qui décrivent comment configurer tout cela; il y en a plus sur le Web, mais certains des autres sont assez obsolètes, alors que ces deux semblent bien pour le moment:
dans lequel on trouve des trucs du métier concernant le post d'auteur de clojure sur le blog de Phil Hagelberg; Phil maintient le mode swank-clojure et clojure-mode, ainsi qu'un package appelé Emacs Starter Kit qui est quelque chose que tout nouveau venu dans le monde Emacs aurait intérêt à regarder. Ces instructions semblent avoir été mises à jour avec les récents changements apportés à l'infrastructure; en cas de doute, recherchez des informations supplémentaires sur le groupe Google de Clojure.
Mise en place de Clojure, Incanter, Emacs, Slime, Swank et Paredit post sur le blog du projet Incanter. Incanter est un package fascinant fournissant un DSL de type R pour les calculs statistiques intégrés directement dans Clojure. Cet article sera utile même si vous ne prévoyez pas d'utiliser - ou même d'installer - Incanter.
Tout mettre en œuvre:
Une fois que vous avez configuré tout cela, vous pouvez essayer de commencer à l'utiliser tout de suite, mais je vous conseillerais fortement de faire ce qui suit:
Jetez un œil au manuel de SLIME - il est inclus dans les sources et est en fait très lisible. De plus, il n'y a absolument aucune raison pour laquelle vous devriez lire tout le manuel de monstre de 50 pages; Jetez simplement un œil pour voir quelles fonctionnalités sont disponibles.
Remarque: la fonctionnalité autodoc de SLIME telle que trouvée dans les dernières sources en amont est incompatible avec swank-clojure - ce problème ne se posera pas si vous suivez la recommandation de Phil Hagelberg d'utiliser la version ELPA (voir son article de blog susmentionné pour une explication) ou laissez simplement autodoc désactivé (qui est l'état par défaut des choses). Cette dernière option a un attrait supplémentaire dans la mesure où vous pouvez toujours utiliser le dernier SLIME avec Common Lisp, au cas où vous l'utiliseriez également.
Jetez un œil à la documentation pour paredit. Il y a deux façons de procéder: (1) regardez la source - il y a une énorme quantité de commentaires en haut du fichier qui contiennent toutes les informations dont vous aurez probablement besoin; (2) tapez C-h mEmacs pendant que le mode paredit est actif - un tampon apparaîtra avec des informations sur le mode majeur actuel suivi par des informations sur tous les modes mineurs actifs (paredit est l'un de ceux-ci).
Mise à jour: Je viens de trouver cet ensemble de notes sympas sur Paredit par Phil Hagelberg ... C'est un lien vers un fichier texte, je me souviens avoir vu un bel ensemble de diapositives avec ces informations quelque part, mais je n'arrive pas à le trouver maintenant . Quoi qu'il en soit, c'est un bon résumé de la façon dont cela fonctionne. Jetez-y un coup d'œil, je ne peux pas vivre sans Paredit maintenant et ce fichier devrait vous permettre de commencer à l'utiliser très facilement, je crois. :-)
En fait, la C-h mcombinaison vous informera de toutes les combinaisons de touches actives sur le SLIME REPL, en mode clojure (vous voudrez vous rappeler C-c C-kd'envoyer le tampon actuel pour la compilation) et en fait dans n'importe quel tampon Emacs.
En ce qui concerne le chargement du code à partir d' un fichier et l' expérimentation puis avec elle au REPL: utiliser précité C-c C-kcombinaison pour compiler le tampon courant, puis use
ou require
son espace de noms au REMPL. Ensuite, faites des expériences.
Notes finales:
Soyez prêt à devoir peaufiner les choses pendant un certain temps avant que tout ne clique. De nombreux outils sont impliqués et leurs interactions sont pour la plupart assez fluides, mais pas au point où il serait prudent de supposer que vous n'aurez pas à faire certains ajustements au départ.
Enfin, voici un peu de code que je garde dans .emacs
lequel vous ne trouverez pas ailleurs (bien qu'il soit basé sur une fonction sympa de Phil Hagelberg). J'alterne entre le démarrage de mes instances swank avec lein swank
(l'une des fonctionnalités les plus cool de Leiningen) et l'utilisation de la clojure-project
fonction ci-dessous pour démarrer le tout depuis Emacs. J'ai fait de mon mieux pour que ce dernier produise un environnement correspondant étroitement à celui fourni par lein swank
. Oh, et si vous voulez juste une REPL dans Emacs pour une expérience rapide et sale, alors avec la configuration correcte, vous devriez pouvoir l'utiliser M-x slimedirectement.
(setq clojure-project-extra-classpaths
'(
; "deps/"
"src/"
"classes/"
"test/"
))
(setq clojure-project-jar-classpaths
'(
; "deps/"
"lib/"
))
(defun find-clojure-project-jars (path)
(apply #'append
(mapcar (lambda (d)
(loop for jar in (remove-if (lambda (f) (member f '("." "..")))
(directory-files d t))
collect jar into jars
finally return jars))
(remove-if-not #'file-exists-p
clojure-project-jar-classpaths))))
(defun find-clojure-jar (jars)
(let ((candidates
(remove-if-not
(lambda (jar)
(string-match-p "clojure\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
jars)))
(if candidates
(car candidates)
(expand-file-name "~/.clojure/clojure.jar"))))
(defun find-clojure-contrib-jar (jars)
(let ((candidates
(remove-if-not
(lambda (jar)
(string-match-p "clojure-contrib\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
jars)))
(if candidates
(car candidates)
(expand-file-name "~/.clojure/clojure-contrib.jar"))))
;;; original due to Phil Hagelberg
;;; (see `Best practices for Slime with Clojure' thread on Clojure Google Group)
(defun clojure-project (path)
"Sets up classpaths for a clojure project and starts a new SLIME session.
Kills existing SLIME session, if any."
(interactive (list (ido-read-directory-name
"Project root:"
(locate-dominating-file default-directory "pom.xml"))))
(when (get-buffer "*inferior-lisp*")
(kill-buffer "*inferior-lisp*"))
(cd path)
;; I'm not sure if I want to mkdir; doing that would be a problem
;; if I wanted to open e.g. clojure or clojure-contrib as a project
;; (both lack "deps/")
; (mapcar (lambda (d) (mkdir d t)) '("deps" "src" "classes" "test"))
(let* ((jars (find-clojure-project-jars path))
(clojure-jar (find-clojure-jar jars))
(clojure-contrib-jar (find-clojure-contrib-jar jars)))
(setq swank-clojure-binary nil
;; swank-clojure-jar-path (expand-file-name "~/.clojure/clojure.jar")
swank-clojure-jar-path clojure-jar
swank-clojure-extra-classpaths
(cons clojure-contrib-jar
(append (mapcar (lambda (d) (expand-file-name d path))
clojure-project-extra-classpaths)
(find-clojure-project-jars path)))
swank-clojure-extra-vm-args
(list (format "-Dclojure.compile.path=%s"
(expand-file-name "classes/" path)))
slime-lisp-implementations
(cons `(clojure ,(swank-clojure-cmd) :init swank-clojure-init)
(remove-if #'(lambda (x) (eq (car x) 'clojure))
slime-lisp-implementations))))
(slime))