Clojure的REPL非常方便,可以隨時(shí)隨地試驗(yàn)?zāi)愕南敕ǎ琑EPL是read-eval-print-loop的簡(jiǎn)稱。默認(rèn)clojure.contrib有帶一個(gè)shell腳本來(lái)啟動(dòng)REPL,具體看
這里。你也可以用JLine來(lái)增強(qiáng)REPL:
java -cp "%CLOJURE_DIR%\jline-VERSION.jar;%CLOJURE_JAR%" jline.ConsoleRunner clojure.main
不過(guò),其實(shí)你還可以用
rlwrap這個(gè)GNU庫(kù)來(lái)增強(qiáng)clojure REPL。使用它有如下好處:
1.Tab completion,使用tab做代碼提示。
2.括號(hào)匹配
3.歷史記錄,哪怕你重啟REPL
4.通過(guò)
.inputrc來(lái)綁定vi或者emacs
具體操作步驟如下:
1.首先,你需要在你的機(jī)器上安裝rlwrap,你可以通過(guò)apt或者port,homebrew等工具安裝或者自己下載安裝:
sudo port install rlwrap
2.在你的home目錄下創(chuàng)建一個(gè)clojure目錄作為clojure home,并拷貝clojure.jar進(jìn)去:
mkdir ~/clojure
cp .m2/repository/org/clojure/clojure/1.3.0/clojure-1.3.0.jar ~/clojure/clojure.jar
我是從maven的本地倉(cāng)庫(kù)里拷貝了clojure 1.3的jar包過(guò)去,重命名為clojure.jar
3.創(chuàng)建一個(gè)shell腳本名為clj,并放入你的path變量,腳本內(nèi)容:
#!/bin/sh
breakchars="(){}[],^%$#@\"\";:''|\\"
CLOJURE_DIR=~/clojure
CLOJURE_JAR="$CLOJURE_DIR"/clojure.jar
JAVA_OPTS="-Xmx512m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled"
if [ $# -eq 0 ]; then
exec rlwrap --remember -c -b "$breakchars" \
-f "$HOME"/.clj_completions \
-t "Clojure REPL" \
-p red \
-H "$CLOJURE_DIR"/.repl_history -s 1000\
java "$JAVA_OPTS" -cp "$CLOJURE_JAR" clojure.main
else
exec java -cp "$CLOJURE_JAR" clojure.main $1 "$@"
fi
我們將命令歷史輸出到~/clojure/.repl_history文件中,并限制數(shù)目為1000。
4.clj腳本中通過(guò)-f選項(xiàng)指定了completions文件為~/.clj_completions,執(zhí)行下列clojure程序生成此文件:
(def completions (keys (ns-publics (find-ns 'clojure.core))))
;(def completions (mapcat (comp keys ns-publics) (all-ns)))
(with-open [f (java.io.BufferedWriter. (java.io.FileWriter. (str (System/getenv "HOME") "/.clj_completions")))]
(.write f (apply str (interpose \newline completions))))
這個(gè)程序只生成clojure.core的completions文件,如果你想將所有ns都加入進(jìn)去,注釋掉第一行,使用第二行程序。
5.最后,配置下~/.inputrc文件:
set editing-mode emacs
tab: complete
set completion-query-items 150
set completion-ignore-case on
set blink-matching-paren on
set bell-style visible
我綁定為emacs,你可以選擇vi。
6.一切搞定,接下來(lái)你可以敲入命令clj來(lái)使用rlwrap啟動(dòng)clojure REPL了,可以用tab做代碼提示了,可以用Ctrl + r來(lái)搜索歷史命令,運(yùn)行截圖:
參考:
http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started#Enhancing_Clojure_REPL_with_rlwrap轉(zhuǎn)載請(qǐng)注明出處:
http://www.tkk7.com/killme2008/archive/2012/02/14/369976.html