莊周夢(mèng)蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Clojure世界:使用rlwrap增強(qiáng)REPL

          Posted on 2012-02-14 19:05 dennis 閱讀(3735) 評(píng)論(1)  編輯  收藏 所屬分類: Clojure
              Clojure的REPL非常方便,可以隨時(shí)隨地試驗(yàn)?zāi)愕南敕ǎ琑EPL是read-eval-print-loop的簡(jiǎn)稱。默認(rèn)clojure.contrib有帶一個(gè)shell腳本來啟動(dòng)REPL,具體看這里。你也可以用JLine來增強(qiáng)REPL:
          java -cp "%CLOJURE_DIR%\jline-VERSION.jar;%CLOJURE_JAR%" jline.ConsoleRunner clojure.main

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

              具體操作步驟如下:

          1.首先,你需要在你的機(jī)器上安裝rlwrap,你可以通過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)庫里拷貝了clojure 1.3的jar包過去,重命名為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 --"$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文件中,并限制數(shù)目為1000。

          4.clj腳本中通過-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.一切搞定,接下來你可以敲入命令clj來使用rlwrap啟動(dòng)clojure REPL了,可以用tab做代碼提示了,可以用Ctrl + r來搜索歷史命令,運(yùn)行截圖:


          參考:http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started#Enhancing_Clojure_REPL_with_rlwrap
          轉(zhuǎn)載請(qǐng)注明出處:http://www.aygfsteel.com/killme2008/archive/2012/02/14/369976.html

          評(píng)論

          # re: Clojure世界:使用rlwrap增強(qiáng)REPL  回復(fù)  更多評(píng)論   

          2012-02-16 09:35 by dennis
          @number23_cn
          嗯,是多了,感謝糾正
          主站蜘蛛池模板: 固始县| 财经| 周宁县| 仁怀市| 马边| 四川省| 依安县| 甘谷县| 灌云县| 焉耆| 临桂县| 尚义县| 武乡县| 上林县| 应城市| 北海市| 绵阳市| 澜沧| 基隆市| 玛纳斯县| 邢台县| 西乌| 盐边县| 布拖县| 丽水市| 扎兰屯市| 天水市| 临沧市| 屯昌县| 扶余县| 澄城县| 崇左市| 额济纳旗| 宁蒗| 阿尔山市| 麻城市| 剑阁县| 金阳县| 左贡县| 宝坻区| 蚌埠市|