【问题标题】:How can I get readline/rlwrap-like functionality when using clojure.main/repl?使用 clojure.main/repl 时如何获得类似 readline/rlwrap 的功能?
【发布时间】:2018-06-24 16:13:09
【问题描述】:

当我使用repl function from clojure.main 时,如何从我的 REPL 中获得类似 readline(或类似 rlwrap)的功能?

背景是我正在使用和自定义 Clojure 第一版中的 break function。我在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 卡住了,我必须终止终端或进程才能退出。如果我可以让 readline 在这个二级 REPL 中工作,或者至少防止这个常见问题破坏我的调试会话,我非常希望。

【问题讨论】:

  • rlwrap 不是在这里帮忙吗?
  • rlwrap 在普通的lein repl REPL 中工作,但在 REPL 内的 REPL 中不起作用。
  • lein repl 带来了自己的 readline 内容。所以rlwrap 是我与非 lein-repl 一起使用的。所以我假设单独的rlwrap(no-lein-outer-repl,inner-repl)不会关心(除非repl-in-a-repl与std(out | in)混淆。但是我不知道如何禁用 lein 中的 jreadline2 (?) 支持。

标签: clojure readline leiningen read-eval-print-loop rlwrap


【解决方案1】:

你应该使用 rebel readline,一个由 bhauman 开发的新的 clojure repl,带来的是 figwheel。

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

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

【讨论】:

  • rebel-readline 看起来很棒!你能告诉我们更多关于它的信息,比如如何使 The Joy of Clojure 中的 break 函数支持 readline?
【解决方案2】:

尝试使用 Cider 作为您的回复的 Emacs。当您(break) 时,您将被从 Cider repl 中撞出并进入 Emacs Minibuffer,您的标准 emacs 编辑快捷方式(在此基础上建模 readline)继续适用。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-10
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 2023-03-30
      • 2010-10-23
      • 2017-08-27
      相关资源
      最近更新 更多