Ctrl+Enter不响应是因为未连接nREPL服务;必须先在项目根目录运行clojure -M:nrepl(确保deps.edn含:nrepl别名),再通过Conjure: Connect或ClojureSublimed: Start nREPL建立连接,插件仅是客户端,无法替代服务端。

Sublime Text 里 Clojure REPL 不响应 ctrl+enter 怎么办
默认快捷键在 Sublime Text 中不触发求值,根本原因是没有正确安装或配置 SublimeREPL 或 Conjure 类插件,且 Clojure 环境未就绪。单纯装了 Leiningen 或 clojure-cli 并不等于 REPL 已接入编辑器。
实操建议:
- 优先用
Conjure(比 SublimeREPL 更现代、Clojure 原生支持更好),通过Package Control安装后,必须运行Conjure: Connect(ctrl+alt+c→c),而不是直接敲代码按ctrl+enter - 确认终端能跑通
clj:在命令行执行clj -Sdeps '{:deps {org.clojure/clojure {:mvn/version "1.12.0"}}}' -e "(+ 1 2)",输出3才说明基础环境 OK - 若用
Leiningen,确保项目根目录有project.clj,且已执行过lein repl成功启动过一次——Conjure的连接依赖本地已存在的 nREPL 服务或自动拉起
求值时提示 java.lang.ClassNotFoundException: clojure.main
这是 classpath 缺失 Clojure 运行时导致的典型错误,常见于手动配置 SublimeREPL 的 Clojure.sublime-settings 时路径写错,或未指定 lein / clj 入口。
实操建议:
-
Conjure用户无需手动配 classpath,但需检查conjure.json是否存在且内容合理,例如:{"clj": {"cmd": ["clj", "-Sdeps", "{:deps {org.clojure/clojure {:mvn/version \"1.12.0\"}}}"]}} - 避免在设置中硬编码
java -cp ... clojure.main——这种写法极易因版本/路径变动失效,应交由clj或lein自动管理依赖 - Windows 用户注意路径分隔符和空格:如果
clj.bat在含空格路径(如Program Files)下,Conjure可能启动失败,建议用符号链接或重装到无空格路径
光标在 (defn foo [] (println "hi")) 里按 ctrl+enter 却只求值了 (println "hi")
这是 Conjure 默认“智能求值”行为:它基于光标位置向上查找最靠近的 S-expression,而非整段函数定义。对函数定义本身求值,需要光标落在 defn 开头或选中整个 form。
实操建议:
- 把光标放在
defn关键字上再按ctrl+enter,或用ctrl+shift+p→Conjure: Eval current top-level form(快捷键可自定义为ctrl+alt+enter) - 想让每次求值都作用于当前顶层 form(即整个
defn/def),修改conjure.json加入:"clj": {"eval": {"top-level": true}} - 注意副作用:重复求值
defn会覆盖函数绑定,但不会清除之前创建的闭包或全局状态,调试时容易误判逻辑是否刷新
连接成功但 (require 'clojure.set) 报 FileNotFoundException
不是 REPL 没连上,而是当前 project 的 deps.edn 或 project.clj 没声明 org.clojure/clojure 依赖,或版本太老(clojure.set 在 1.9+ 才稳定内置)。clj 启动时若未显式加载 core 库,某些命名空间无法解析。
实操建议:
- 检查
deps.edn是否包含{:deps {org.clojure/clojure {:mvn/version "1.12.0"}}};若用project.clj,确认:dependencies里有对应项 - 不要依赖隐式加载,首次连接后手动执行:
(require '[clojure.set :as set]),之后才能用set/union等 - 若用的是 bare
clj -Srepro启动,会跳过用户配置的deps.edn,导致标准库不可用——Conjure默认不加-Srepro,但手动调试时容易误用
def 和 defn 的绑定作用域、ns 切换对后续 require 的影响、以及不同启动方式(clj vs lein repl)带来的 classpath 差异——这些细节不报错,但会让求值结果和预期不一致。


















