[Yazarı olmayan kişiden düzenleme: Bu 2010 yılına aittir ve süreç Mayıs 2011'den beri önemli ölçüde basitleştirilmiştir. Şubat 2012 itibarıyla kurulum notlarımla bu yanıta bir gönderi ekleyeceğim.]
Birkaç parçayı bir araya getirmeniz gerekecek: Emacs, SLIME (Clojure ile mükemmel bir şekilde çalışıyor - bkz. Swank-clojure), swank-clojure (SLIME sunucusundaki Clojure uygulaması), clojure-mode, Paredit ve elbette, başlangıç için Clojure kavanozu, sonra belki de Leiningen'in belki de en dikkate değer olanı olacağı bazı ekstralar. Her şeyi ayarladıktan sonra, soruda bahsettiğiniz tüm iş akışı / düzenleme özelliklerine - Emacs içinde - sahip olacaksınız.
Temel kurulum:
Aşağıdakiler, tüm bunların nasıl kurulacağını açıklayan harika öğreticilerdir; Web'de daha fazlası var, ancak diğerlerinden bazıları oldukça güncel değil, oysa bu ikisi şimdilik uygun görünüyor:
Phil Hagelberg'in blogundaki clojure yazarlık gönderisiyle ilgili ticaretin püf noktaları bulunan ; Phil, taklit-clojure ve clojure-modunun yanı sıra, Emacs dünyasına yeni gelen herkesin göz atması gereken bir şey olan Emacs Başlangıç Kiti adlı bir paketi sürdürüyor. Bu talimatlar, altyapıdaki son değişikliklerle güncelleştirilmiş görünmektedir; şüphe durumunda, Clojure'un Google grubu hakkında ek bilgi arayın.
Incanter projesinin blogunda Clojure, Incanter, Emacs, Slime, Swank ve Paredit gönderisini kurma. Incanter, Clojure'e gömülü istatistiksel hesaplamalar için R benzeri bir DSL sağlayan büyüleyici bir pakettir. Bu gönderi, Incanter'ı kullanmayı, hatta yüklemeyi planlamıyor olsanız bile faydalı olacaktır.
Her şeyin işe yaraması:
Tüm bunları kurduğunuzda hemen kullanmaya başlayabilirsiniz, ancak aşağıdakileri yapmanızı şiddetle tavsiye ederim:
SLIME'nin kılavuzuna bir göz atın - kaynaklarda bulunur ve aslında çok okunabilir. Ayrıca, 50 sayfalık canavar kılavuzunun tamamını okumanız için kesinlikle hiçbir neden yok ; hangi özelliklerin mevcut olduğunu görmek için etrafa bir göz atın.
Not: SLIME'nin en son upstream kaynaklarda bulunan autodoc özelliği, swank-clojure ile uyumlu değildir - Phil Hagelberg'in ELPA versiyonunu kullanma önerisini takip ederseniz bu sorun ortaya çıkmayacaktır (açıklama için yukarıda bahsedilen blog gönderisine bakın) veya sadece autodoc'u kapalı bırakın (bu, şeylerin varsayılan durumudur). İkinci seçenek, onu da kullanmanız durumunda, en son SLIME'yi Common Lisp ile kullanmaya devam edebilmeniz açısından bazı ek çekiciliğe sahiptir.
Paredit için dokümanlara bir göz atın. Bunu yapmanın iki yolu vardır: (1) kaynağa bakın - dosyanın üst kısmında ihtiyacınız olabilecek tüm bilgileri içeren çok sayıda yorum vardır; (2) C-h mparedit modu etkinken Emacs yazın - geçerli ana mod hakkında bilgi ve ardından tüm aktif küçük modlar hakkında bilgi içeren bir tampon açılır (paredit bunlardan biridir).
Güncelleme: Phil Hagelberg'in Paredit ile ilgili bu harika not setini yeni buldum ... Bu bir metin dosyasına bağlantı, bir yerde bu bilgilerle güzel bir slayt seti gördüğümü hatırlıyorum, ancak şimdi bulamıyorum . Her neyse, nasıl çalıştığının güzel bir özeti. Kesinlikle bir göz atın, Paredit olmadan yaşayamam ve bu dosyanın onu kullanmaya başlamayı çok kolaylaştıracağına inanıyorum. :-)
Aslında, C-h mkombinasyon size SLIME REPL'de, clojure modunda ( C-c C-kderleme için mevcut arabelleği göndermeyi hatırlamak isteyeceksiniz ) ve aslında herhangi bir Emacs arabelleğinde aktif olan tüm tuş atamaları hakkında bilgi verecektir .
Kodun bir dosyadan yüklenmesi ve daha sonra REPL'de denenmesi için: Yukarıda belirtilen C-c C-kkombinasyonu mevcut tamponu derlemek için kullanın , sonra use
veya require
onun ad alanını REPL'de derleyin . Sonra, deney yapın.
Son notlar:
Her şey tıklanmadan önce bir süre ince ayar yapmak zorunda kalmaya hazır olun. Dahil olan birçok araç var ve bunların etkileşimleri çoğunlukla oldukça pürüzsüz, ancak başlangıçta bazı ayarlamalar yapmanız gerekmeyeceğini varsaymanın güvenli olacağı noktaya kadar değil.
Son olarak, burada sakladığım ve .emacs
başka yerde bulamayacağınız bir kod parçası var (her ne kadar bu Phil Hagelberg'in harika bir fonksiyonuna dayanıyor olsa da). Swank örneklerimi lein swank
(Leiningen'in daha havalı özelliklerinden biri) clojure-project
ile başlatmak ve her şeyi Emacs içinden başlatmak için aşağıda bulunan işlevi kullanmak arasında geçiş yapıyorum . İkincisinin, tarafından sağlananla yakından eşleşen bir ortam üretmesini sağlamak için elimden geleni yaptım lein swank
. Oh, ve eğer hızlı ve kirli bir deney için Emacs'ta sadece bir REPL istiyorsanız, doğru kurulumla M-x slimedoğrudan kullanabilmelisiniz .
(setq clojure-project-extra-classpaths
'(
"src/"
"classes/"
"test/"
))
(setq clojure-project-jar-classpaths
'(
"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"))))
(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)
(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 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))