Clojure世界:使用rlwrap增强REPL
2023-03-14 22:30:21 时间
Clojure的REPL非常方便,可以随时随地试验你的想法,REPL是read-eval-print-loop的简称。默认clojure.contrib有带一个shell脚本来启动REPL,具体看这里。你也可以用JLine来增强REPL:
不过,其实你还可以用rlwrap这个GNU库来增强clojure REPL。使用它有如下好处:
1.Tab completion,使用tab做代码提示。
2.括号匹配
3.历史记录,哪怕你重启REPL
4.通过.inputrc来绑定vi或者emacs
具体操作步骤如下:
1.首先,你需要在你的机器上安装rlwrap,你可以通过apt或者port,homebrew等工具安装或者自己下载安装:
2.在你的home目录下创建一个clojure目录作为clojure home,并拷贝clojure.jar进去:
3.创建一个shell脚本名为clj,并放入你的path变量,脚本内容:
4.clj脚本中通过-f选项指定了completions文件为~/.clj_completions,执行下列clojure程序生成此文件:
5.最后,配置下~/.inputrc文件:
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.jarcp .m2/repository/org/clojure/clojure/1.3.0/clojure-1.3.0.jar ~/clojure/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。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
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都加入进去,注释掉第一行,使用第二行程序。;(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))))
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
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
相关文章
- Golang实现算法-约瑟夫环
- FPGA:逻辑功能的仿真与验证
- Verilog HDL仿真常用命令
- 【Docker 系列】docker 学习六,探究一下数据卷容器
- 【Docker 系列】docker 学习六,DockerFile
- 【Docker 系列】docker 学习八,Docker 网络
- 【Docker 系列】docker 学习九,Compose 内容编排官网初步体验
- 【Docker 系列】docker 学习十,Compose 编写规则及wp 实战
- 【Docker 系列】docker 学习十一,docker 总结和面试题整理
- 【K8S 系列】k8s 学习一,Kubernetes 基本介绍及核心组件
- Verilog HDL基本语法规则
- 【K8S 系列】k8s 学习二,kubernetes 核心概念及初步了解安装部署方式
- Verilog HDL门级建模
- Verilog HDL数据流建模与运算符
- Verilog HDL行为级建模
- 什么是禅道?禅道可以做什么?如何自动推送禅道消息?
- composer self-update 更新版本
- CGO学习二,基本数据类型转换2 和 函数调用
- SSH连接服务器后执行多条命令
- Go test 单元测试用起来