ClojureのEmacs / Swank / Pareditへの優しいチュートリアル


87

Clojure / Lispに取り組むためにEmacsに移動しています。以下を実行できるようにするためにEmacsでセットアップする必要があるすべての情報は何ですか?

  1. 対応する閉じ括弧の自動マッチング/生成
  2. C ++ / Javaスタイルではなく、Lisp / Clojureスタイルを自動インデントする
  3. 構文の強調表示
  4. 起動REPL
  5. コードの一部をファイルからREPLにロードして評価できるようにするため。

Emacsで設定した後、これらを取得するためのコマンドのリストも取得できれば素晴らしいと思います。

回答:


89

[非著者からの編集:これは2010年のものであり、プロセスは2011年5月から大幅に簡素化されています。2012年2月のセットアップノートとともに、この回答に投稿を追加します。]

Emacs、SLIME(Clojureと完全に連携します-swank-clojureを参照)、swank-clojure(SLIMEの対応するサーバーのClojure実装)、clojure-mode、Pareditなどのいくつかの要素をまとめる必要があります。もちろん、最初はClojure jarで、次にLeiningenがおそらく最も注目に値するいくつかの追加機能があります。すべてを設定すると、Emacs内で、質問で言及したすべてのワークフロー/編集機能が利用できるようになります。

基本設定:

以下は、これらすべてを設定する方法を説明する優れたチュートリアルです。Webには他にもありますが、他のいくつかはかなり時代遅れですが、これら2つは今のところ問題ないようです。

  1. PhilHagelbergのブログに投稿されたclojureの作者に関する取引のトリックが見つかりました。Philは、swank-clojureとclojure-modeのほか、Emacsの世界に初めて来た人なら誰でも見ることをお勧めするEmacsスターターキットと呼ばれるパッケージを維持しています。これらの指示は、インフラストラクチャへの最近の変更で最新のものになっているようです。疑わしい場合は、ClojureのGoogleグループで追加情報を探してください。

  2. Clojure、Incanter、Emacs、Slime、Swank、およびPareditの設定は、Incanterプロジェクトのブログに投稿されます。Incanterは、Clojureに直接埋め込まれた統計計算用のRのようなDSLを提供する魅力的なパッケージです。この投稿は、Incanterを使用する予定がない場合、またはインストールする予定がない場合でも役立ちます。

すべてを機能させる:

これらすべてを設定したら、すぐに使用を開始できますが、次のことを強くお勧めします。

  1. SLIMEのマニュアルをご覧ください。ソースに含まれており、実際には非常に読みやすくなっています。また、50ページのモンスターマニュアル全体を読む必要ある理由はまったくありません。利用可能な機能を確認するために周りを見てください。

    注:最新のアップストリームソースにあるSLIMEのautodoc機能はswank-clojureと互換性がありません-Phil HagelbergがELPAバージョンを使用するように推奨している場合、この問題は発生しません(説明については前述のブログ投稿を参照してください)または、autodocをオフのままにします(これはデフォルトの状態です)。後者のオプションには、Common Lispで最新のSLIMEを使用する場合でも使用できるという、いくつかの追加の魅力があります。

  2. pareditのドキュメントをご覧ください。これを行うには2つの方法があります。(1)ソースを確認します。ファイルの先頭には、必要になる可能性のあるすべての情報を含む大量のコメントがあります。(2)C-h mparedit-modeがアクティブなときにEmacsと入力します-バッファがポップアップし、現在のメジャーモードに関する情報に続いて、すべてのアクティブなマイナーモードに関する情報が表示されます(pareditはその1つです)。

    更新: Phil HagelbergによるPareditでこのクールなメモのセットを見つけました...これはテキストファイルへのリンクです。この情報が記載された素晴らしいスライドのセットをどこかで見たのを覚えていますが、今は見つからないようです。 。とにかく、それはそれがどのように機能するかについての素晴らしい要約です。間違いなくそれを見てください、私は今Pareditなしでは生きられません、そしてこのファイルはそれを使い始めるのを非常に簡単にするはずです、と私は信じます。:-)

  3. 実際、このC-h m組み合わせにより、SLIME REPL、clojureモード(C-c C-kコンパイルのために現在のバッファーを送信するために覚えておく必要があります)、そして実際にEmacsバッファーでアクティブなすべてのキーバインディングについて知ることができます。

ファイルからコードをロードした後、REPLでそれを実験用として:前述の使用C-c C-k次に、現在のバッファをコンパイルするために組み合わせてuse又はrequireREPLでその名前空間。次に、実験してください。

最後の注意:

すべてがクリックされる前に、しばらくの間調整する必要があることに備えてください。関係するツールはたくさんあり、それらの相互作用はほとんどスムーズですが、最初にいくつかの調整を行う必要がないと想定しても安全なほどではありません。

最後に、.emacs他では見つけられないコードを少し示します(ただし、Phil Hagelbergによるクールな関数に基づいています)。私は、スワンクインスタンスをlein swank(Leiningenのクールな機能の1つ)でclojure-project開始することと、以下に示す関数を使用してEmacs内からすべてを開始することを交互に行います。私は、後者がによって提供される環境と厳密に一致する環境を生成するように最善を尽くしましたlein swank。ああ、そしてEmacsでREPLを使ってすばやく汚い実験をしたいだけなら、正しい設定でM-x slime直接使用できるはずです。

(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
綺麗な記事をありがとうございました!
user855 2010

3
どういたしまして。Clojureであなたの道を進んでくれることを願っています。ハッピーハッキング!:-)
のMichałMarczyk

2
ł:とても素敵な記事です。ありがとう。
ラルフ

それは確かに非常に素晴らしいチュートリアルです。あまり気に入らなくても、Emacsが最良の選択肢であることがわかりました。IDEA、Eclipse、およびNetBeansは、単純に全体像に適合しません。
Adam Arold 2011


8

Emacsのスターターキットには、Clojureのを使い始めるための素晴らしいレビューを得ています。

あなたの質問のしゃれた部分だけに答えるには:

Leiningenは、正しいクラスパスを使用してswankを設定し、Emacsに接続するための非常に簡単な方法です。

すばらしいビデオはここにあります:http//vimeo.com/channels/fulldisclojure#8934942これ はproject.cljファイルの例です。

(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)

次に実行します:

lein swank

およびEmacsから:

 alt-x slime-connect


1

ここでは、CIDER(Clojure Interactive Development Environment)について言及する必要があります。

それはあなたが探しているもののほとんどをカバーします。含まれるもの:

  • インタラクティブREPL
  • デバッグ
  • テスト実行
  • コードナビゲーション
  • ドキュメントの検索
  • さらに多く

CIDERに加えて、clojure開発に不可欠で便利なアドオンがいくつかあります。これらはそれぞれ(そして主観的に)グループ化しようとします。

必需品

素敵さ

General Essentials(任意の言語用)

  • magit –Emacs内のgit磁器

  • 発射体–ファイルの検索、検索などのためのプロジェクト管理

  • ヘルム–インクリメンタルな完了と選択の絞り込みフレームワーク(または スワイパー

その他のリソース

この作業のほとんど/すべてをすでに実行しているセットアップを探している場合、いくつかのオプションがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.