簡體   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