calva是vscode中唯一能稳定打通clojure运行时的扩展,依赖系统已安装且可用的clojure cli命令启动repl,不强制要求leiningen或shadow-cljs。

直接运行 Clojure 代码,必须走 REPL 路线 —— 没有“一键编译运行”这种事。Calva 是目前唯一能稳定打通 VSCode 与 Clojure 运行时的扩展,它不依赖 Leiningen 或 shadow-cljs 就能启动基础 REPL,但前提是系统里得有 clojure CLI 命令可用。
确认 clojure CLI 是否就绪
VSCode 本身不运行 Clojure,Calva 只是管道;真正干活的是你终端里那个 clojure 命令。如果它不存在或版本太旧(
- 打开 VSCode 内置终端(
Ctrl+`),执行clojure -Sversion,看到类似1.12.0才算过关 - 若报
command not found:macOS 用brew install clojure/tools/clojure;Windows 用户需手动下载官方安装脚本并确保加入 PATH - 别跳过 JDK 验证:
java -version必须输出 JDK 11+(不是 JRE),否则clojure启动失败且错误信息极不明确
Calva Jack-in 失败的典型表现和修复
按下 Cmd+Alt+C J(macOS)或 Ctrl+Alt+C Ctrl+Alt+J(Windows/Linux)后,底部状态栏没出现 Connected to nREPL,或者输出窗口卡在 Starting nREPL server...,大概率是以下三者之一:
-
deps.edn文件不在项目根目录:Calva 只认当前打开文件夹下的deps.edn,不会向上递归查找。用clojure -Tnew app :name myproj初始化的项目才自带该文件 - 项目根目录下有
project.clj(Leiningen)和deps.edn并存:Calva 会优先选 Leiningen,但如果你没装lein,就会静默失败。删掉project.clj或重命名避让 - VSCode 没读到 shell 的 PATH:比如你用 zsh 安装了
clojure,但 VSCode 启动自 Finder,它只继承 bash 的 PATH。临时解法是在 VSCode 内置终端里先运行source ~/.zshrc,长期解法是修改 VSCode 的启动方式或在settings.json中显式配置"calva.replConnectSequences"
写完代码后怎么“运行”它
Clojure 没有主函数入口,所谓“运行”就是把表达式送进已连接的 REPL 求值。Calva 提供多个粒度的求值方式,别全靠 Alt+Enter:
- 光标在括号内任意位置 →
Alt+Enter:求值最内层 S-表达式(如(println "hi")) - 选中一段代码 →
Ctrl+Enter:求值选中内容(适合粘贴调试片段) - 光标在
.clj文件中 →Ctrl+Alt+C L:加载整个文件到 REPL(等价于(load-file "src/foo.clj")) - 光标在测试函数上 →
Ctrl+Alt+C T:运行单个deftest(需项目含clojure.test依赖)
注意:所有这些操作都要求底部状态栏显示 user=> 或 myproj.core=> —— 这才是 REPL 真正活的状态。如果只看到 Connecting... 或空白,说明连接断了,得重新 Jack-in。
Common Lisp 和 CLISP 用户请绕开 Calva 的 Clojure 默认路径
如果你实际想跑的是 Common Lisp(比如用 clisp 或 sbcl),别被 Calva 的 Clojure 标签误导。它虽支持 Common Lisp,但默认行为仍按 Clojure 项目找 deps.edn。你得手动切换:
- 确保
clisp或sbcl已安装且可执行(clisp -v或ros run -- -q) - 不要新建
deps.edn,改用.env或quicklisp加载库 - 打开命令面板(
Cmd+Shift+P),输入Calva: Connect to a Running REPL,再选Start a new SBCL REPL或Start a new CLISP REPL - 此时 Calva 不再检查
deps.edn,而是直接调起对应解释器进程
真正的坑在于:同一个 Calva 扩展,Clojure 和 Common Lisp 模式共享一套快捷键,但底层协议、加载逻辑、甚至括号配对规则都不同。切模式前务必关掉所有 .clj/.lisp 文件,否则语法高亮和求值行为会错乱。











