web-dev-qa-db-ja.com

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

Clojure /LISPで作業するためにEmacsに移行しています。 Emacsで以下を実行するために設定する必要がある情報は何ですか?

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

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

87
user855

[非著者による編集:これは2010年のもので、2011年5月以降、プロセスは大幅に簡素化されました。2012年2月現在のセットアップノートと共にこの回答に投稿を追加します。]

Emacs、SLIME(Clojureと完全に連携します-swank-clojureを参照)、swank-clojure(SLIMEのサーバーカウンターパートのClojure実装)、clojure-mode、Paredit、およびもちろん、Clojure jarを開始してから、多分Leiningenが最も注目に値するいくつかのエキストラです。 すべてを設定すると、Emacs内で、質問で言及したすべてのワークフロー/編集機能を使用できます。

基本設定:

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

  1. clojureの作者に関する取引のトリックが見つかりました Phil Hagelbergのブログに投稿。 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と互換性がありません-この問題はフォローしても発生しませんELPAバージョンを使用する(説明については前述のブログ投稿を参照)か、単にautodocを無効にする(これがデフォルトの状態です)Phil Hagelbergの推奨事項。後者のオプションには、Common LISPで最新のSLIMEを引き続き使用できるという点で、さらに魅力があります。

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

    更新:見つけたばかり このクールな一連のメモ フィル・ハーゲルバーグによるPareditで...これはへのリンクですテキストファイルの場合、この情報が記載された素敵な一連のスライドをどこかで見たことがありますが、今は見つけることができません。とにかく、それはそれがどのように機能するかのニースの要約です。間違いなくそれを見てみましょう、私は今Pareditなしで生きることはできませんし、このファイルはそれを使い始めるのを非常に簡単にするはずです、私は信じています。 :-)

  3. 実際、 C-h m 組み合わせは、クロージュアモードで、SLIME REPLでアクティブなすべてのキーバインディングについて教えてくれます(覚えておくとよいでしょう C-c C-k コンパイルのために現在のバッファーを送信するために)、そして実際に任意のEmacsバッファーで。

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

最終ノート:

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

最後に、ここには他の場所にはない.emacsにあるコードが少しあります(Phil Hagelbergによるクールな機能に基づいていますが)。 lein swank(Leingingenの優れた機能の1つ)を使用してswankインスタンスを起動することと、Emacs内からすべてを開始するために以下に示すclojure-project関数を使用することを交互に行います。後者が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))
89
Michał Marczyk

もう1つの優れたチュートリアルがあります。

30〜45分で、すべてをゼロからセットアップできます。

このチュートリアルは、Emacsの事前知識を前提とはしていません(Clojureも-以前の投稿ではClojureのニースの紹介があります)。

10

Emacs Starter キットは、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
8
Arthur Ulfeldt
2
aholub7x