サーバ (lein repl on VM)
まずVagrantfile
で立ち上げるVMのprivate ipを固定する.
Vagrant.configure("2") do |config|
config.vm.define :debian do |debian|
debian.vm.box = "debian7.2"
debian.vm.network :private_network, ip: "192.168.99.99"
end
end
$ vagrant up debian
$ vagrant ssh debian
vm上でClojureプロジェクトを作成し, lein repl
を実行する.
$ lein new hoge && cd hoge
$ edit project.clj
ちなみにここでデフォルトのままlein repl
を起動すると127.0.0.1
のみ受け付ける設定になっているので, project.clj
に:repl-options {:host "0.0.0.0"}
の設定を加えてどこからでも接続できるようにする.
(defproject hoge "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]]
:repl-options {:host "0.0.0.0"})
起動.
$ lein repl
nREPL server started on port 41080 on host 0.0.0.0
REPL-y 0.3.0
Clojure 1.5.1
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
Results: Stored in vars *1, *2, *3, an exception in *e
user=>
host 0.0.0.0
となっていればok.
portは毎回変わるが, ./target/repl-port
にポート番号が吐き出されていて, ciderが接続時にこれを見てくれるので気にしなくていい.
クライアント (Emacs)
slime
+ swank-clojure
とかnrepl.el
とかあるけど, ナウいのは clojure-emacs/cider らしい.
M-x package-install <RET> cider <RET>
ssh経由でvm上のファイルを開く. vagrant ssh-config
を使って~/.ssh/config
を設定しておくと繋ぎやすい.
$ vagrant ssh-config debian >> ~/.ssh/config
C-x C-f
でFind fileを開き, /ssh:...
でリモートのファイルを開くことが出来る.
Find file: /ssh:vagrant@debian:/path/to/clojure/hoge/src/hoge/core.clj
無事開けたら, ciderで起動中のnREPLサーバに繋ぐ.
M-x cider <RET>
Host: 192.168.99.99 <RET> (Vagrantfileで定義したip)
Port: 41080 <RET> (最初から入ってるはず)
別ウィンドウで*cider-nrepl*
バッファが開けば成功. in-ns
でプロジェクトのnamespaceに移って作業を始められる.
; CIDER 0.5.0alpha (package: 20140111.332) (Clojure 1.5.1, nREPL 0.2.3)
user> (in-ns 'hoge.core)
hoge.core>