【问题标题】:How to hot reload a namespace on file save in Leiningen REPL如何在 Leiningen REPL 中热重载文件保存的命名空间
【发布时间】:2012-09-09 16:46:31
【问题描述】:

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

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

【问题讨论】:

标签: clojure leiningen


【解决方案1】:

您可以轻松地重用来自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}]))

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      这意味着您可以使用自定义热键在编辑时重新加载您正在编辑的任何文件。从那里开始,添加一个用于重新加载的自定义 on-save 挂钩通常很简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        • 2016-06-04
        • 2014-04-16
        • 2016-08-15
        相关资源
        最近更新 更多