在使用clojure.main/repl时,如何获得类似readline/rlwrap的功能?

在使用clojure.main/repl时,如何获得类似readline/rlwrap的功能?,clojure,readline,leiningen,read-eval-print-loop,rlwrap,Clojure,Readline,Leiningen,Read Eval Print Loop,Rlwrap,当我使用时,如何从REPL中获得类似readline(或rlwrap)的功能 其背景是我正在利用和定制《Clojure的欢乐》第一版中的。我从lein replrepl内部使用它。当我的“断点”启动时,Leiningen的REPL类似于readline的功能就消失了,这有点不方便。我的肌肉记忆让我打了一拳↑ 接着是回车。在我停下来之前,我的终端里有这个: debug=> ^[[A CompilerException java.lang.RuntimeException: Unable to

当我使用时,如何从REPL中获得类似readline(或rlwrap)的功能

其背景是我正在利用和定制《Clojure的欢乐》第一版中的。我从
lein repl
repl内部使用它。当我的“断点”启动时,Leiningen的REPL类似于readline的功能就消失了,这有点不方便。我的肌肉记忆让我打了一拳↑ 接着是回车。在我停下来之前,我的终端里有这个:

debug=> ^[[A
CompilerException java.lang.RuntimeException: Unable to resolve symbol: in this context, compiling:(/tmp/form-init13211381000659590518.clj:1:1) 

现在我的REPL被卡住了,我必须关闭终端或进程才能离开。我非常希望我能在这个第二级REPL中运行readline,或者至少防止这个常见问题破坏我的调试会话。

我不确定
rlwrap
实用程序是否有帮助,因为内部REPL由外部REPL持有。因此,输入由Java代码控制,而不是
rlwrap
工具

由于输入了错误的值,导致了异常。我记得,
clojure.main/repl
函数可能需要额外的参数来处理异常。也许,您可以以某种方式处理它,只需打印一个字符串“错误的输入值”。请看REPL

此外,您还可以实现自己的REPL进行调试。很久以前,我曾经写过一些这样的东西,这里是我得到的:

(defn repl []
  (let [input (read)]
    (if (= input 'q)
      nil
      (do
        (try
          (let [result (eval input)]
            (println result))
          (catch Exception e
            (println e)))
        (recur)))))
该函数只是在无止境循环中提示正确的Clojure表达式,对其求值并打印结果。如果输入错误,它将打印错误并继续。要离开REPL,请输入
q

例如:

(repl)
(+ 1 2) ;; 2
fsdf8 9_fsd ;; prints a stack trace
q ;; returns nil and exit

尝试使用Emacs作为您的回复。当您
(中断)
时,您将被从苹果酒repl中撞到Emacs Minibuffer中,在那里您的标准Emacs编辑快捷方式(readline以其为模型)将继续应用。

您应该使用rebel readline,这是Bhuman为clojure开发的一种新的repl,他带来的就是figwheel


它具有rlwrap功能、语法突出显示和多行代码编辑功能,所有这些功能都在终端中实现

rlwrap
在这里有帮助吗?rlwrap在正常的
lein repl
repl中工作,但在repl内的repl中不工作。
lein repl
带来了自己的readline内容。因此,
rlwrap
是我对non-lein repl使用的。因此,我假设仅rlwrap(无lein外部repl,内部repl)不会在意(除非repl-in-a-repl与std(out | in)发生冲突)。然而,我不知道如何禁用lein.rebel-readline中的jreadline2(?)支持。rebel-readline看起来很棒!你能告诉我们更多关于它的信息吗,比如如何利用Clojure支持readline的乐趣来实现
break
功能?