使用 leiningen REPL 时,有没有办法让文件或 ns 在文件保存时自动重新加载 repl。目前我通过在 repl - 中键入以下内容来重新加载 ns (use 'sample.ns :reload-all)
。
但是我可以让它在文件保存时自动重新加载吗?
您可以轻松地重用管道框架中的代码。
您将只需要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}]))
Clojure-Watch库可以满足您的需求。它观察一个文件并执行一些操作。在您的情况下,一个操作是从该文件重新加载命名空间。此外,它需要编写一些初始代码来启动观察者。
这种方式对我来说似乎有点复杂。直接从 Lein 推出的普通 REPL 并不是有效的开发方式。你最好使用一些对 Clojure 友好的编辑器,比如 Emacs 或 Lightable。
大多数主要编辑器都支持自定义热键绑定,并且有一个 Clojure 插件,允许您通过网络(通过“nREPL”)连接到活动的 REPL。就个人而言,我使用 vim,因此为此目的使用vim-fireplace 。
这意味着您可以使用自定义热键在编辑时重新加载您正在编辑的任何文件。从那里开始,添加一个自定义的 on-save 钩子来重新加载通常是微不足道的。