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 -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文件中,并限制数目为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


时间: 2024-11-08 17:07:58

Clojure世界:使用rlwrap增强REPL的相关文章

Clojure世界:静态代码分析

    Java世界里有findbugs这样的神器,可以让你避免很多"简单愚蠢"的bug.同样,Clojure世界里也有相应的替代品,这就是今天要介绍的kibit.不过kibit现在还比较年轻,判断的规则较少,但是已经可以使用起来做clojure代码的静态检查. 项目主页:https://github.com/jonase/kibit 使用: 1.安装lein插件: lein plugin install jonase/kibit 0.0.2 2.在项目的根目录运行 lein kibi

Clojure世界:如何做性能测试

  我们经常需要在程序中测量某段代码的性能,或者某个函数的性能,在Java中,我们可能简单地循环调用某个方法多少次,然后利用System.currentTimeMillis()方法测量下时间.在Ruby中,一般都是用Benchmark module做测试,提供了更详细的报告信息.     同样,在Clojure里你可以做这些事情,你仍然可以使用System.currentTimeMillis()来测量运行时间,例如: user=> (defn sum1 [& args] (reduce + 

Clojure世界:API文档生成

    继续Clojure世界之旅,介绍下我今天的探索成果,使用clojure生成clojure项目的API文档.在java里,我们是利用javadoc生成API文档,各种build工具都提供了集成,例如maven和ant都提供了javadoc插件或者task.在Clojure世界里,同样有一系列工具帮助你从源码中自动化生成API文档.今天主要介绍三个工具.不过我不会介绍怎么在clojure里写doc,具体怎么做请看一些开源项目,或者直接看clojure.core的源码.     首先是codo

Clojure世界:文件IO

   文件读写是日常编程中最经常使用的操作之一.这篇blog将大概介绍下Clojure里对文件操作的常用类库.     首先介绍标准库clojure.java.io,这是最经常用的IO库,定义了常见的IO操作.     首先,直接看一个例子,可以熟悉下大多数常用的函数: (ns io   (:use [clojure.java.io])) ;;file函数,获取一个java.io.File对象 (def f (file "a.txt")) ;;拷贝文件使用copy (copy f (f

Clojure世界:利用HouseMD诊断clojure

  HouseMD是淘宝的聚石写的一个非常优秀的Java进程运行时诊断和调试工具,如果你接触过btrace,那么HouseMD也许你应该尝试下,它比btrace更易用,不需要写脚本,类似strace的方式attach到jvm进程做跟踪调试.     基本的安装和使用请看这篇文档<UserGuide>,恕不重复.以下内容都假设你正确安装了housemd.     本文主要介绍下怎么用housemd诊断跟踪clojure进程.Clojure的java实现也是跑在JVM里,当然也可以用housemd

Clojure世界:单元测试

    单元测试也是一个开发中最常见的需求,在Java里我们用JUnit或者TestNG,在clojure里也内置了单元测试的库.标准库的clojure.test,以及第三方框架midje.这里我将主要介绍clojure.test这个标准库,midje是个更加强大的测试框架,广告下,midje的介绍在第二次cn-clojure聚会上将有个Topic,我就不画蛇添足了.通常来说,clojure.test足够让你对付日常的测试.     首先看一个最简单的例子,定义一个函数square来计算平方,然

Clojure世界: STM的统计

   年前一篇blog提过,写了一个stm-profiler用于统计clojure STM的运行状况,放在了github上:https://github.com/killme2008/stm-profiler    STM的事务在遇到写冲突(多个事务写同一个ref的时候)就会回滚事务并重试,通过stm-profiler你可以查看事务的重试次数,重试原因,以及每个reference的使用情况.使用很简单,在lein的project.clj引用stm-profiler: [stm-profiler 

Clojure世界:日志管理——clojure.tools.logging

   处理日志是任何一个产品级的程序都需要仔细处理的模块.在Java中,我们经常使用的是log4j就是一个日志框架.在clojure里,同样有一套日志框架--clojure.tools.logging,它不仅提供了常用的日志输出功能,还屏蔽了Java各种日志框架之间的差异,如slf4j,commons-logging,log4j,java.util.logging等,让你可以透明地使用这些框架来处理日志. 名称:clojure.tools.logging 主页:https://github.co

Clojure世界:Http Client

    使用http client提交表单或者下载网页也是非常常见的任务,比如使用Java的时候可以用标准库的HttpURLConnection,也可以选择Apache Http Client.在clojure里也有这样的类库,这里我将介绍三个各有特色的http client实现.     首先,我最先推荐使用clj-http这个类库,它是Apache HttpClient的clojure wrapper,是一个提供同步API的简单易用的Http Client. 名称: clj-http 主页: