読者です 読者をやめる 読者になる 読者になる

Keep on moving

あんまりまとまってないことを書きますよ

割と最近のswank-clojure+slime環境の構築

Clojure Lisp Emacs

Emacsで割と最近のclojure-mode+swank-clojure+slimeで環境を作りました。
かなりはまってしまったので作業内容をまとめておきます。
今回はMac OS X 10.6での環境作りを行いましたが、多分*nix系でも同じはずです。

ClojureWithEmacsSlimeSwankOnUbuntu
を参考にインストールしましたが、私の環境ではうまくいきませんでした。
【この情報は2010/3/26時点でのものです。clojure-mode,swank-clojureは変更が多いので環境構築時にはその時点での変更が必要になる場合があります】

Windows Userへ

迷わずClojure boxを入れましょう。

作業内容をまずは手短に

  • clojure-modeをダウンロード
  • clojure-modeに手を入れ、.emacsの編集
  • emacs で M-x clojure-install する
  • clojure-install でダウンロードしたslimeを削除、新しくダウンロードする
  • swank-clojureに手を入れる
  • emacs で M-x slimeする
clojure-modeをダウンロード
~$ git clone git://github.com/technomancy/clojure-mode.git 

.emacsに設定します。

;; clojure-mode
(add-to-list 'load-path "~/.emacs.d/site-lisp/clojure-mode") ;;clojure-modeのpath
(require 'clojure-mode)
(setq clojure-src-root (expand-file-name "~/share/clojure")) ;;clojure-installしたときのダウンロードフォルダ
clojure-modeに手を入れ、.emacsの編集

このまま、M-x clojure-installするとclojure-contribをビルドしようとしてエラーになります。
前はantでビルドしていたようですが、近頃mavenを使うように変更されたようです。
また、github側でのtag名が変更になったようで、ここも変更する必要があります。

diff --git a/clojure-mode.el b/clojure-mode.el
index 9cb6761..c42d85c 100644
--- a/clojure-mode.el
+++ b/clojure-mode.el
@@ -748,13 +749,13 @@ See http://technomancy.us/swank-clojure for details. Abort? ")
         (error "Clojure installation step failed: %s" cmd)))
 
     (cd (format "%s/clojure" src-root))
-    (shell-command "git checkout 1.0")
+    (shell-command "git checkout 1.1.0")
     (unless (= 0 (shell-command "ant"))
       (error "Couldn't compile Clojure."))
 
     (cd (format "%s/clojure-contrib" src-root))
-    (shell-command "git checkout clojure-1.0-compatible")
-    (unless (= 0 (shell-command "ant -Dclojure.jar=../clojure/clojure.jar"))
+    (shell-command "git checkout 1.1.0")
+    (unless (= 0 (shell-command "mvn package -Dclojure.jar=../clojure/clojure.jar"))
       (error "Couldn't compile Contrib."))
 
     (with-output-to-temp-buffer "clojure-install-note"
emacs で M-x clojure-install する

変更後、EmacsでM-x clojure-installします。

終了後、slime関係の設定を.emacsに追加します。

(clojure-slime-config "~/share/clojure/") ;;slimeのある場所を設定

;; slime
(eval-after-load "slime"
  '(progn (slime-setup '(slime-repl slime-fuzzy slime-c-p-c))))
(require 'slime)
(slime-setup)
(setq slime-net-coding-system 'utf-8-unix)
clojure-install でダウンロードしたslimeを削除、新しくダウンロードする

この時点で EmacsでM-x slimeするとエラーになります。swank-clojure側の近頃の変更が原因のようです。
clojure-installしてダウンロードしたslimeを削除し、新たに取得します。

~$ git clone git://github.com/nablaone/slime.git
clojure-mode,swank-clojureに手を入れる

しかし、このままでは動きませんのでclojure-mode,swank-clojureに手を入れます。
<<参考>>

diff --git a/clojure-mode.el b/clojure-mode.el
index 9cb6761..c42d85c 100644
--- a/clojure-mode.el
+++ b/clojure-mode.el
@@ -700,14 +700,15 @@ is bundled up as a function so that you can call it after you've set
     (add-to-list 'load-path (concat clojure-src-root "/swank-clojure"))
 
     (require 'slime-autoloads)
-    (require 'swank-clojure-autoload)
+    ;; (require 'swank-clojure-autoload)
 
     (slime-setup '(slime-fancy))
 
     (setq swank-clojure-classpath
           (list
            (concat clojure-src-root "/clojure/clojure.jar")
-           (concat clojure-src-root "/clojure-contrib/clojure-contrib.jar")))
+           (concat clojure-src-root "/clojure-contrib/clojure-contrib.jar")
+	   (concat clojure-src-root "/swank-clojure/src")))
     (eval-after-load 'slime
       '(progn (require 'swank-clojure)
               (setq slime-lisp-implementations
diff --git a/src/swank/core/protocol.clj b/src/swank/core/protocol.clj
index 89f0890..67641f1 100644
--- a/src/swank/core/protocol.clj
+++ b/src/swank/core/protocol.clj
@@ -4,6 +4,26 @@
 
 ;; Read forms
 (def #^{:private true}
+     *fix-message-re* #"::%(.*?)%")
+
+(defn- fix-message [text]
+  (.replaceAll (re-matcher *fix-message-re* text) "/?$1?"))
+
+(def #^{:private true}
+     *percent-re* #"%")
+
+(defn- fix-percent
+  "Replace double colons with a /."
+  ([text] (.replaceAll (re-matcher *percent-re* text) "?")))
+
+(def #^{:private true}
+     *double-colon-re* #"::")
+
+(defn- fix-double-colon
+  "Replace double colons with a /."
+  ([text] (.replaceAll (re-matcher *double-colon-re* text) "/")))
+
+(def #^{:private true}
      *namespace-re* #"(^\(:emacs-rex \([a-zA-Z][a-zA-Z0-9]+):")
 
 (defn- fix-namespace
@@ -50,7 +70,7 @@
   ([#^java.io.Reader reader]
      (let [len  (Integer/parseInt (read-chars reader 6 read-fail-exception) 16)
            msg  (read-chars reader len read-fail-exception)
-           form (read-string (fix-namespace msg))]
+	   form (read-string (fix-namespace (fix-message msg)))]
        (if (seq? form)
          (deep-replace {'t true} form)
          form))))

これで、Emacsで M-x slime するとslimeが立ち上がり、clojureの実行が出来るようになります。お疲れ様でした。

まとめ

clojureまわりは近頃かなり変更が多いです。
とくに、clojure-mode,swank-clojureは変更が多いので自分で情報を集めて手を入れる必要がありそうです。
個人的には依存関係がほとんどない、Eclipse pluginのcounterclockwiseを入れて見るのがかなりいいんじゃないかなと思います。
先人の方々に感謝。