Clojure için Emacs / Swank / Paredit için nazik bir eğitim


87

Clojure / Lisp üzerinde çalışmak için Emacs'e geçiyorum. Aşağıdakileri yapabilmek için Emacs'ta kurmam gereken tüm bilgiler nelerdir?

  1. otomatik eşleştirme / karşılık gelen kapatma parantezlerinin oluşturulması
  2. autoindent Lisp / Clojure stili, C ++ / Java stili değil
  3. Sözdizimi vurgulama
  4. çağıran REPL
  5. Dosyadan kodun bir kısmını REPL'e yükleyip değerlendirebilme.

Emacs üzerinde bir şeyler kurduktan sonra bunları almak için komutların bir listesini de alabilirsem harika olurdu.

Yanıtlar:


89

[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:

  1. 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.

  2. 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:

  1. 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.

  2. 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. :-)

  3. 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 useveya requireonun 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 .emacsbaş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-projectile 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
      '(
        ; "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))

2
Bu güzel yazı için çok teşekkür ederim!
user855

3
Rica ederim. Umarım Clojure ile yolunuza devam eder. Mutlu hacklemeler! :-)
Michał Marczyk

2
ł: Çok güzel bir yazı. Teşekkürler.
Ralph

Bu gerçekten çok güzel bir öğretici. Gerçekten beğenmesem de en iyi seçeneğin Emacs olduğunu öğrendim. IDEA, Eclipse ve ağ fasulyeleri resme uymuyor.
Adam Arold


8

Emacs Starter Kit Clojure başlarken için büyük değerlendirmeleri ele geçirmiş bulunmaktadır:

Sorunuzun yalnızca havalı kısmını yanıtlamak için:

Leiningen, doğru sınıf yolu ile swank kurmanın ve onu Emacs'e bağlamanın gerçekten kolay bir yoludur.

Harika bir video burada: http://vimeo.com/channels/fulldisclojure#8934942 İşte bir project.clj dosyası örneği

(defproject project "0.1"
    :dependencies [[org.clojure/clojure
                      "1.1.0-master-SNAPSHOT"]
                   [org.clojure/clojure-contrib
                      "1.0-SNAPSHOT"]]
    :dev-dependencies [[leiningen/lein-swank "1.1.0"]]
    :main my.project.main)

o zaman koş:

lein swank

ve Emacs'tan:

 alt-x slime-connect


1

CIDER (Clojure Interactive Development Environment) burada belirtilmelidir.

Aradığınız şeyin çoğunu kapsayacaktır. O içerir:

  • etkileşimli REPL
  • hata ayıklama
  • test çalışması
  • kod gezintisi
  • dokümantasyon araması
  • çok daha fazlası

CIDER'a ek olarak, sırasıyla (ve sübjektif olarak) gruplandırmaya çalışacağım, clojure geliştirme için bazı diğer önemli ve olması iyi eklentiler var:

Essentials

  • smartparens - parantez eşleştirme, işleme, gezinme (veya tercih ederseniz ayrıştırma )

  • clj-refactor –- ad alanlarını otomatik ekleme / derleme gibi birkaç harika özelliğe sahiptir (yakında CIDER'a dahil edilebilir)

  • clojure-mode - yazı tipi kilidi, girinti, gezinme

  • şirket - metin tamamlama çerçevesi (veya başka bir otomatik tamamlayıcı seçin)

  • gökkuşağı ayırıcılar - derinliklerine göre parantezler, parantezler veya parantezler gibi sınırlayıcıları vurgular / renklendirir

  • flycheck - anında sözdizimi denetimi uzantısı

  • flycheck-clj-kondo - clj-kondo için entegrasyon

Nitelikler

Genel Temel Bilgiler (herhangi bir dil için)

  • magit - Emacs içinde git porselen

  • mermi - dosyaları bulmak, aramak vb. için proje yönetimi

  • dümen - artımlı tamamlama ve seçim daraltma çerçevesi (veya kaydırıcı )

Diğer kaynaklar

Bu çalışmanın çoğunu / tamamını sizin için halihazırda yapmış bir kurulum arıyorsanız, birkaç seçenek şunlardır:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.