簡體   English   中英

如何在蘋果酒模式下清除REPL?

[英]How to clear the REPL in cider-mode?

我不是要清理REPL的文本輸出; 我的意思是清理REPL中的所有評估結果。 在開發過程中,反復的Cc CqCc Mj效率低。


UPDATE

我的調試行為可能有些不好。 我不確定其他人如何用CIDER開發prog,但我真的需要上面提到的功能。 我猜其他開發人員也會遇到與我相同的問題。

例如,在clojure prog單元的頂部,我使用declare來聲明一個函數foo ,它被另一個函數bar ,而foo是在bar之后實現的。 然后,我Cc Ck等,編程進展順利。 后來,我偶爾刪除了foo的前向聲明。 怎么了? 編程仍然順利。 真的嗎? 然后,我完成整個工作並愉快地終止CIDER REPL會話。

早上的災難:沒有找到符號foo

那是我的故事。 那么,沒有人遇到類似的問題?

嘗試clojure.tools.namespace.repl命名空間中的(refresh)函數:

刷新函數將掃描類路徑上Clojure源文件的所有目錄,讀取其ns聲明,構建其依賴關系圖,並按依賴順序加載它們。

https://github.com/clojure/tools.namespace#reloading-code-usage

它似乎沒有刪除在user命名空間中聲明的變量,我已經在REPL中輸入,但它確實:

...卸載(刪除)更改的名稱空間以清除任何舊定義。

我們通常會在user命名空間中添加一些其他有用的東西,因此它會在啟動時加載到REPL中:

(ns user
  (:require [clojure.tools.namespace.repl :refer [refresh]]
            [clojure.repl :refer [doc source]]
            [clojure.pprint :refer [pprint pp]]
            [midje.repl :as midje]
            [clojure.stacktrace :as st]))

要將該代碼與main和test源分開,請將其放在<project root>/dev/user.clj的文件中,然后將以下內容添加到lein project.clj文件中:

:profiles {:dev {:source-paths ["dev"]}}

(ps雖然這不是你想要回答的問題,對於那些看到這個答案並希望清除Cider REPL中文本的人來說,它是Cc Mohttps://github.com/clojure-emacs/cider

像其他人已經指出的那樣,“正確”的解決方案是使用Stuart Sierra的組件庫。

但是,由於您在CIDER中運行,您可以使用Cc Cx來運行cider-refresh ,這將重新加載您的項目,從而重新創建您的初始狀態。

在EMACS中,當我在蘋果酒模式下使用Clojure時,我使用:

在repl緩沖區中的Cc Mo.

它與cider-repl-clear-buffer綁定

如果您正在處理大量具有您想要清除的狀態以具有干凈的開發環境的事物,您可以考慮執行以下操作之一:

1.)重新評估您的設計,看看實際需要多少狀態。 在許多情況下,您可能會不必要地使用原子,引用或其他有狀態項目,如果采用更具功能性的方法,您將不會發現自己需要經常清理開發環境。

假定使用州的合法理由:

2.)您可以使用clojure函數remove-ns來清除命名空間及其所有內容:例如,對於名為user.fancy-namespace您可以通過運行(remove-ns 'user.fancy-namespace') NS (remove-ns 'user.fancy-namespace')然后只需重新評估命名空間。 這適用於清理單個命名空間,但如果需要清理的有狀態項位於其他命名空間中,則對於涉及的每個命名空間執行此操作會非常繁瑣。

3.)Stuart Sierra的組件庫旨在管理涉及國家的組件。 對於管理數據庫連接,內存緩存客戶端等非常有用,但需要對項目進行重新架構才能充分利用它。

正如其他人所提到的,只有在你擁有保存狀態信息的變量時才需要清除repl。 對於非狀態承載組件,只需重新加載源緩沖區(重新評估它)就足夠了。

管理具有跟蹤狀態的組件的工作流的一種非常有趣的方式是Stuart Seirra的組件框架。 http://youtu.be/13cmHf_kt-Q

另一種方法是使用defonce而不是def來編寫代碼,這將允許您重新加載源代碼而無需重新定義狀態變量。

如果另一方面,你想這樣做來清理defn或defmacro定義,你不需要從你的repl中清除'polution',那么說實話,我不會打擾。 如果沒有什么東西可以調用defn或macro,那真的沒關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM