【问题标题】:How to make cljs files works with figwheel repl via fireplace.vim?如何通过firewall.vim使cljs文件与figwheel repl一起工作?
【发布时间】:2023-12-27 03:16:01
【问题描述】:

我有一个关于 ClojureScript 的项目,我正在使用 vim 进行代码编辑,所以我想在编辑器中访问 repl,可以使用 fire.vim 访问什么。 如果你有一个全新的平面项目,它会很好 - 你只需打开目录,启动 clojure repl,在同一目录中打开 vim,创建一个表达式并使用 cpp 对其进行评估。

https://youtu.be/vHDLDNoAdLE

但是当我使用 figwheel 项目时,我想连接到 figwheel repl 以便从 cljs 文件中计算一些东西,所以我启动了一个 figwheel,最终在端口 7888 上启动 repl 并使用 :Connect 命令连接到带有壁炉的 repl它仅适用于 clj 文件,不适用于 cljs。

https://youtu.be/ue42Yh0v6UQ

当我试图评估 .cljs 文件中的表达式时,壁炉抛出此错误:

处理函数时检测到错误 37_printop1..37_opfunc[35]..fireplace#client:第 10 行: E605:未捕获异常:壁炉:类 java.lang.ClassNotFoundException

有谁知道如何让它工作(壁炉 + .cjls 文件)?

【问题讨论】:

  • 不是您问题的答案,但我建议您使用Clojure layer 查看Spacemacs。您拥有出色的 Vim 绑定,并且 Clojure 集成开箱即用。
  • 感谢您的推荐。我尝试过使用 Spacemacs,但我真的坚持使用 vim。如果我不处理 cljs 文件的问题,也许这将是最后的手段。

标签: vim clojurescript read-eval-print-loop


【解决方案1】:

您是否“Piggiebacked”(“允许在 nREPL 会话之上使用 ClojureScript REPL”)将 Fireplace 连接到 Figwheel REPL?

:Piggieback (figwheel-sidecar.repl-api/repl-env)

https://github.com/bhauman/lein-figwheel/wiki/Using-the-Figwheel-REPL-with-Vim#still-in-vim-piggieback-on-clojurescript

ClassNotFound Exception cemmerick.piggieback相关:

您必须在您的project.cljprofiles.clj 中包含cemerick.piggieback。见https://github.com/nrepl/piggieback

:profiles {:dev {:dependencies [[com.cemerick/piggieback "0.2.1"]
                                [figwheel-sidecar "0.5.18"]]
                 :repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}}}

【讨论】:

  • 感谢您的回答!稍后我会深入探讨,希望能做出成功的报告。
  • 命令后:Piggieback (figwheel-sidecar.repl-api/repl-env) 我收到下一个错误 - ClassNotFound Exception cemmerick.piggieback。可能是什么原因?
  • 谢谢,但它对我不起作用。我仍然在使用 cemmerick.piggieback 时遇到该错误,并且不知道该往哪里走……
  • 我想知道为什么它在我有 cider.piggieback 的情况下与 cemerick.piggieback 相提并论?
  • 也许使用 cemerick.piggieback。见github.com/bhauman/lein-figwheel/wiki/…[com.cemerick/piggieback "0.2.1"][cemerick.piggieback/wrap-cljs-repl]。我更新了答案。
【解决方案2】:

问题出在firewall.vim插件中

在firewall.vim的第323行

let response = connection.eval("((or (resolve 'cider.piggieback/cljs-repl)"

必须是行:

let response = connection.eval("((or (resolve 'cider.piggieback/wrap-cljs-repl)"

因为 cider.piggieback 在第 299 行定义了 wrap-cljs-repl 函数:

(defn wrap-cljs-repl [handler]

【讨论】:

    【解决方案3】:

    这是我使用 vim 壁炉制作工作 figwheel REPL 的一系列步骤:

    1. 将这些依赖添加到/home/{username}/.clojure/deps.edn:
    ...
      :aliases {:nrepl
                {:extra-deps
                 {nrepl/nrepl {:mvn/version "0.6.0"}
                  cider/cider-nrepl {:mvn/version "0.23.0"}
                  cider/piggieback {:mvn/version "0.4.2"}}}}
    ...
    
    1. 将这些添加到项目中:
    ...
     :deps  {com.bhauman/figwheel-main {:mvn/version "0.2.3"}
             figwheel-sidecar          {:mvn/version "0.5.19"}}
    ...
    
    1. 使用以下命令从终端运行项目:
    clj -R:nrepl -m nrepl.cmdline --middleware "[cider.nrepl/cider-middleware cider.piggieback/wrap-cljs-repl]"
    
    
    1. 使用以下命令从 vim 连接到 nREPL:
    :Connect nrepl://localhost:{port}
    
    1. 启动 figwheel REPL 并连接到它:
    :CljEval (do (require 'figwheel.main.api) (figwheel.main.api/start "dev"))
    :CljEval (do (use 'figwheel.main.api) (figwheel.main.api/cljs-repl "dev")) 
    

    【讨论】:

      最近更新 更多