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

13

当我使用来自clojure.mainrepl函数时,如何从我的REPL中获得类似于readline(或rlwrap)的功能?

背景是我正在使用《Clojure之乐》第一版中的break函数进行使用和定制。我正在lein repl REPL中使用它。当我的"断点"触发时,Leiningen REPL的readline-like功能消失了,这有点不方便。我的肌肉记忆让我先按,然后快速按Enter。在我能停止自己之前,我已经在终端中输入了这个:

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

现在我的REPL卡住了,我不得不杀掉终端或进程才能退出。我希望如果可能的话,在这个第二级REPL中让readline工作,或者至少防止这个常见问题干扰我的调试会话。


这里 rlwrap 不是有帮助吗? - cfrick
rlwrap在普通的lein repl REPL中可以使用,但在REPL内部的REPL中无法使用。 - user457586
lein repl 带有自己的 readline 工具。因此,对于非 lein-repl,我使用 rlwrap。所以我认为单独使用 rlwrap(没有外部的 lein-repl,只有内部的repl)不会有影响(除非 repl-in-a-repl 影响std(out|in))。但是我不知道如何禁用 lein 中的 jreadline2 (?) 支持。 - cfrick
3个回答

3
你应该使用Rebel Readline,这是由Bhauman开发的Clojure新REPL工具,他也是Figwheel的开发者。
它具有rlwrap功能,语法高亮和终端内的多行代码编辑。 https://github.com/bhauman/rebel-readline

rebel-readline 看起来很不错!你能告诉我们更多关于它的信息吗?比如如何使《Clojure之乐》中的 break 函数支持 readline? - Ben Kovitz

1
我不确定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

1

使用Cider作为您的repl尝试Emacs。当你(break)时,你将被推出Cider repl并进入Emacs Minibuffer,在那里您的标准emacs编辑快捷键(基于readline)继续适用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接