繁体   English   中英

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

[英]How can I get readline/rlwrap-like functionality when using clojure.main/repl?

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

这背景是我正在使用和定制The Joy of Clojure,First Edition中的break函数 我在lein repl REPL中使用它。 当我的“断点”开始时,Leiningen的REPL的类似readline的功能消失了,这有点不方便。 我的肌肉记忆让我点击紧跟着Enter 在我能够阻止自己之前,我已经在我的终端中找到了这个:

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

现在我的REPL卡住了,我必须杀死终端或进程才能离开。 如果我能在这个二级REPL中使用readline,或者至少可以防止这个常见问题导致我的调试会话脱轨,我非常喜欢。

你应该使用反叛的readline,一个由bhauman开发的clojure的新replure,同一个人带来的是figwheel。

https://github.com/bhauman/rebel-readline

它在终端中具有rlwrap功能,语法高亮和多行代码编辑功能。

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

尝试使用Cider作为您的repl的Emacs。 当您(break)您将被淘汰出Cider repl并进入Emacs Minibuffer,您的标准emacs编辑快捷方式(在其上建模readline)继续适用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM