閱讀590 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Clojure世界:使用rlwrap增強REPL

   Clojure的REPL非常方便,可以隨時隨地試驗你的想法,REPL是read-eval-print-loop的簡稱。默認clojure.contrib有帶一個shell腳本來啟動REPL,具體看這裏。你也可以用JLine來增強REPL:
java -cp "%CLOJURE_DIR%\jline-VERSION.jar;%CLOJURE_JAR%" jline.ConsoleRunner clojure.main

    不過,其實你還可以用rlwrap這個GNU庫來增強clojure REPL。使用它有如下好處:
1.Tab completion,使用tab做代碼提示。
2.括號匹配
3.曆史記錄,哪怕你重啟REPL
4.通過.inputrc來綁定vi或者emacs

    具體操作步驟如下:

1.首先,你需要在你的機器上安裝rlwrap,你可以通過apt或者port,homebrew等工具安裝或者自己下載安裝:
sudo port install rlwrap

2.在你的home目錄下創建一個clojure目錄作為clojure home,並拷貝clojure.jar進去:
mkdir ~/clojure
cp .m2
/repository/org/clojure/clojure/1.3.0/clojure-1.3.0.jar ~/clojure/clojure.jar
我是從maven的本地倉庫裏拷貝了clojure 1.3的jar包過去,重命名為clojure.jar

3.創建一個shell腳本名為clj,並放入你的path變量,腳本內容:
#!/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 --"$breakchars" \
   
-"$HOME"/.clj_completions \
   
-"Clojure REPL" \
   
-p red \
   
-"$CLOJURE_DIR"/.repl_history -1000\
   java 
"$JAVA_OPTS"  -cp "$CLOJURE_JAR" clojure.main
else
         exec java 
-cp "$CLOJURE_JAR" clojure.main $1 "$@"
fi
我們將命令曆史輸出到~/clojure/.repl_history文件中,並限製數目為1000。

4.clj腳本中通過-f選項指定了completions文件為~/.clj_completions,執行下列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))))
這個程序隻生成clojure.core的completions文件,如果你想將所有ns都加入進去,注釋掉第一行,使用第二行程序。

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.一切搞定,接下來你可以敲入命令clj來使用rlwrap啟動clojure REPL了,可以用tab做代碼提示了,可以用Ctrl + r來搜索曆史命令,運行截圖:



文章轉自莊周夢蝶  ,原文發布時間2012-02-14


最後更新:2017-05-18 20:36:10

  上一篇:go  Clojure世界:單元測試
  下一篇:go  Clojure世界:Http Client