WindowsでClojure 1.3 + Emacs + SLIME

Posted by YpsilonTAKAI On 2011年12月20日火曜日 0 コメント
この記事は、Clojure Advent Calendar 2011の20日目の記事です。



[[2012/1/6 23:00 再修正]]
最新のswank-clojure (1,3.4)では、windowsのパス名の扱いの問題が解決していました。1.3.4以降のものを使えば、特に何もしないで使えます。



[[2011/12/26 23:00 修正]]

最初の投稿では、結局うまくいかなかったのですが、いろいろ調べたり方法を変えたりしてうまく行きました


これまで、Project EulerとかCode Jamとかやるときには、ClojureBoxを使ってました。ClojureBoxは、立ちあげるとすぐにREPLが使えて便利なのですが、だいぶ前にメンテナンスが終了していて、1.3になる可能性がありません。
自分で1.3に入れ替えるのもそれほど難しくなさそうですけど、1.2ベースで作っちゃったものもあるし、ソースの管理という意味でも、leiningenを使った環境にするのがいいかなと思ったので、やってみました。







【環境】
Windows2000
 職場のPCなので。WindowsでClojureやってる人はあまり多くなさそうですけどね。

Windows7
 自宅のノートPCでも同じことをやってみました。 ちゃんと動きます。


【作業】
1) emacsをインストールする。
ソフトの開発は仕事でも趣味でもLinux/UNIXだったので、開発にはemacsを使ってます。手に馴染んでいるのでこれ以外の選択肢はxyzzyしかありません。

clojure始めた当初はxyzzyを使っていたのですが、replとの相性があまりよくなくて、Win32 emacsに切り替えることにしました。昔にくらべてインストールも楽で最新版を使えるのでかなり気に入ってます。

ここに24があったので、使います。

- zipファイルを展開する。
インストールはzipファイルを展開するだけです。でも、パスに日本語や空白の入っていない場所に展開しましょう。動くことは動くのですが、ちょこっとした問題が出る場合があって、しかもその理由がわかりにくいのでやめましょう。「program files」もだめですよ。

- 展開すると、中にREADME.W32というのがあると思いますので、これを見て設定します。

- binディレクトリにある、addpm.exeを実行する。(オプション)
実行すると、Programメニューにemacsのアイコンを追加してくれます。
なんらかの原因で、アイコンが登録されなかった場合は、binのrunemacs.exeのショートカットを手で登録します。

- ホームディレクトリ
emacsはUNIX発祥ですので、設定などはHOMEディレクトリに置くことになっています。Windowsにはあまりその概念が無いので、ちょっとすりあわせが必要です。
Win32 emacsでは以下の順でチェックしてHOMEとして使うようです。
 - 環境変数HOME
 - レジストリ(HKCU\SOFTWARE\GNU\Emacs\HOME)
 - レジストリ(HKLM\SOFTWARE\GNU\Emacs\HOME) (※非推奨 全ユーザー共通になってしまう。)
 - c:\.emacsがあれば c:\
 - プロファイルのあるディレクトリの「Application Data」ディレクトリ

僕は環境変数HOMEに自分のプロファイルの場所を設定して使ってます。環境変数は、「マイコンピューター」を右クリックしてプロパティー - 詳細設定 - 環境変数です。

レジストリのエントリは、先のaddpm.exeでやってくれるみたいですが、使ってないので不明です。

- emacs起動してみる。
起動は、bin/runemacs.exe を使います。emacs.exeではありません。
addpm.exeを使っているなら、スタートメニューのアイコンからでもOKです。

2) shell環境
clojureを使い始めてからshellとしてPowerShellを使っていたのですが、emacsにはeshellといういいものがあって、なんとWindowsでも使えたので、わざわざPowerShellを使う必要はありませんでした。

M-x eshell

で、起動します。
以下の作業でコマンドを投入するものは、このeshellから実行します。

3) Leiningenのインストール
すでにインストール済みなので、今回はインストールしてません。
ですが、ここ(https://github.com/technomancy/leiningen)の「Installation」のところの2段落目に書いてあるとおり、
 -まずは、「the batch file」(lein.bat)を取って来て、PATHの通ったところに置きます。
  僕はleiningenのフォルダを作ってそこにPATHを通して、lein.batを置きました。
 - wgetがインストールしてあってパスに入っていれば、lein self-installを実行すれば自動的にインストールしてくれます。入っていなければ、「the downloads page」から自分でjarを取ってきます。

これでLeiningenのインストールは終り。

4) swank-clojuerを入れる。
swank-clojuerは、emacsとclojureのreplを接続するためのいろいろが入っているLeiningenのプラグインです。shellから

lein plugin install swank-clojure 1.3.4

とするだけです。1.3.3は2012/1/6現在の最新バージョンです。それ以前のバージョンでは、Windowsのファイルパスの扱いに問題があり、パッチを充てないと動きません。


以下古いバージョン(1.3.3以前)の場合。パッチの内容も修正しました。
4-1) Windowsで使うためにパッチをあてる。


emacsからclojureのreplを起動するのには、clojure-jack-inコマンドが便利なのですが、エラーが出て動作しません。問題のあるところを1.3.4のコードを参考にして修正します。

leiningenのプラグインのインストール先を開きます。 僕の場合はHOME/.leinです。
ここにpluginsというフォルダがあって、中に、今インストールしたもの(swank-clojure-1.3.3.jar)が入っているはずです。これの中身を修正します。僕は7zipを使って直接修正しました。
解凍して編集してjar化してもいいと思います。

修正するファイル
 swank-clojure-1.3.3.jar/leiningen/jack_in.clj

修正内容
 23行目から始まる、loader 関数内

(defn loader [resource]
  (let [feature (second (re-find #".*/(.*?).el$" resource))
        checksum (subs (hex-digest resource) 0 8)

        filename (format "%s-%s" feature checksum)
        basename (-> (System/getProperty "user.home")
                     (io/file ".emacs.d" "swank" filename)
                     (.getAbsolutePath)
                     (.replaceAll "\\\\" "/"))
;;        basename (format "%s/.emacs.d/swank/%s-%s"                ;; ★もとの内容
;;                         (System/getProperty "user.home")
;;                         feature checksum)

(やってること)
basenameの定義を変更してます。
ここで、user.home(ホームディレクトリ)を取ってきて、.emacs.dディレクトリのフルパスをbasenameに設定しようとしているのだけれど、user.homeのパスの区切りが「/」ではなく「\\」になってしまうことが問題だった。
名前の生成もformatでなく、構築していく感じにして、最後に「\\」を「/」にしています。

情報元

問題へのpullリクエスト

https://github.com/technomancy/swank-clojure/commit/2b9f9ecaaf84c314169ddab26d250b0297eeb45f

リリースされた1.3.4では長い行が畳まれてきれいになってます。

https://github.com/technomancy/swank-clojure/blob/master/src/leiningen/jack_in.clj





5)package.elを入れる。
この後、emacsにいろいろ入れるのですが、その作業を楽にするためのパッケージ管理システムを入れます。emacs24以降のどこかから正式に入っているようですが、上記のemacsの最新版(2011/12/23版)にも入っていませんでした。
また、古いpackage.elは、複数のパッケージアーカイブに対応していないらしいので、入っていたとしても、入れ替えた方がいいかもしれません。

パッケージアーカイブの一つのMarmalade(http://marmalade-repo.org/)のところにあるものを入れます。
僕はemacsのsite-lispに入れました。

バージョンはー0.9でした
;; Author: Tom Tromey
;; Created: 10 Mar 2007
;; Version: 0.9
;; Keywords: tools


パッケージアーカイブの設定をします。

.emacsに下記のエントリを追加します。
package-archivesの値は、add-to-listでmarmaladeを追加している説明をしているところもありますが、とりあえず全部リストしました。

(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/")
                         ("gnu" . "http://elpa.gnu.org/packages/")))
                         ("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

書いたら、M-x eval-bufferするか、emacsを再起動します。


パッケージアーカイブのリストを取得するために、

M-x package-refresh-contents

をしておきます。


6) SLIMEとclojure-modeをインストールする。
packageツールを使って、ツールをインストールします。

M-x package-list-package

を実行すると、設定したアーカイブにあるモジュールの一覧が表示されます。

下記のものをインストールします。
・SLIME関連
  slime             20100404.1  installed  Superior Lisp Interaction Mode for Emacs
  slime-repl        20100404    installed  Read-Eval-Print Loop written in Emacs Lisp

・clojure-mode
  clojure-mode      1.11.5      installed  Major mode for Clojure code

インストールする前は、3カラム目がavailableになっています。カーソルを合せてiを押すとインストール用にマークされ、先頭にIが付きます。(消すにはuを押す) 全部洗濯したら、xを押すと自動的にインストールが始まります。


7) .emacsの編集

.emacsにslimeとかclojure-modeの設定を書かなくちゃならないんじゃないかと思っていたんですけど、無くても動く。packageのおかげ?
ということでとくにここではいじってません。


これで環境設定は終了です。



8) clojure 1.3のProject Euler作業環境

設定できたので、ちょっとやってみます。

8-1) Project Eulerプロジェクトの作成
まとめて何かするわけではないのですが、replを使うためだけに、適当なところにProject Euler用のclojureプロジェクトを作ります。

~/workspace/clojure $ lein new pe13
Created new project in: d:\Profiles\q3197c\workspace\clojure\pe13
Look over project.clj and start coding in pe13/core.clj

8-2) project.cljの編集
できた、pe13フォルダに移動して、project.cljを編集します。

(defproject pe13 "1.0.0"
  :description "Project Euler workspace"           ;; 適当
  :dependencies [[org.clojure/clojure "1.3.0"]])   ;; 1.3.0になっていることを確認する。

8-3) 依存関係の設定
project.cljの内容にそって必要なライブラリを取得します。
pe13フォルダで

~/workspace/clojure/pe13 $ lein deps
Copying 1 file to d:\Profiles\q3197c\workspace\clojure\pe13\lib


8-4) repl起動
emacsからreplを起動します。

M-x clojure-jack-in

ちょっと待つと、*slime-repl nil* っていうバッファができてプロンプトが表示されます。

; SLIME 20100404
user>
user> (clojure-version)
"1.3.0"

このとおり、1.3でございます。



おまけ)
まえに出ていたprint-docの件は、swank-clojure 1.3.3で解決しているらしい。leiningenで複数バージョンインストールしていたのが悪かったらしく、古いのを削除したら動くようになった。

0 コメント:

コメントを投稿