如何在Leiningen REPL中热重新加载文件命名空间

时间:2012-09-09 16:46:32

标签: clojure leiningen

使用leiningen REPL时,有没有办法让文件或ns在repl on file保存中自动重新加载。目前,我通过在repl - (use 'sample.ns :reload-all)中键入以下内容来重新加载ns。

但是,我可以在文件保存时自动重新加载吗?

3 个答案:

答案 0 :(得分:0)

Clojure-Watch库可以满足您的需求。它会观察文件并执行某些操作。在您的情况下,操作将是从该文件重新加载命名空间。此外,它需要编写一些初始代码来启动观察者。

这种方式对我来说似乎有点复杂。直接从Lein发起的普通REPL并不是一种有效的开发方式。你最好使用一些Clojure友好的编辑器,如Emacs或Lightable。

答案 1 :(得分:0)

大多数主要编辑器都支持自定义热键绑定,并有一个Clojure插件,允许您通过网络连接到活动的REPL(通过“nREPL”)。就个人而言,我使用vim,因此使用vim-fireplace来实现此目的。

这意味着您可以使用自定义热键在编辑时重新加载正在编辑的文件。从那里,添加一个自定义的on-save钩子来重新加载通常是微不足道的。

答案 2 :(得分:0)

您可以轻松地重用duct框架中的代码。

您仅需要hawk个文件查看器。

这是它的样子:

(defn- clojure-file? [_ {:keys [file]}]
  (re-matches #"[^.].*(\.clj|\.edn)$" (.getName file)))

(defn- auto-reset-handler [ctx event]
  (binding [*ns* *ns*]
    (clojure.tools.namespace.repl/refresh)
    ctx))

(defn auto-reset
  "Automatically reset the system when a Clojure or edn file is changed in
  `src` or `resources`."
  []
  (hawk.core/watch! [{:paths ["src/" "resources/" "dev/src/" "dev/resources/"]
                 :filter clojure-file?
                 :handler auto-reset-handler}]))