[英]How can I get readline/rlwrap-like functionality when using clojure.main/repl?
當我使用clojure.main
的repl
函數時,如何從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.