Sublime Text 的默认构建系统用 clj -i 执行 Clojure 文件,不支持命名空间和 require;需改用 nREPL 加载或手动 load-file,并确保 clj 路径正确、缩进统一为 4 空格。

Sublime Text 本身不运行 Clojure,所谓“脚本环境”只是用 clj -i 执行单文件——它不加载命名空间、不解析 ns、不 require 依赖,只适合无结构的练习代码。
Ctrl+B 运行 .clj 文件却报 Unable to resolve symbol
这不是插件或路径问题,是构建方式和代码结构不匹配。Sublime 默认的 Build System(比如 clojure-sublimetext 插件自带的)调用的是 clj -i $file,即“读取并立即执行”,它不启动 REPL 上下文,也不加载项目配置。
- 适用场景:纯表达式脚本,如
(println (+ 1 2))、(def x 42)、(map inc [1 2 3]) - 不适用场景:含
(ns my.app)、(require '[clojure.string :as str])或宏定义的文件——这些需要命名空间上下文,-i模式下直接失效 - 验证方法:终端进项目根目录,手动运行
clj -i your-script.clj,如果也报同样错,说明不是 Sublime 的锅,而是该用-r+load-file
想让 ns 和 require 生效,得换方式
Build System 不是为交互开发设计的,它每次新开 JVM,冷启慢、无状态、不复用依赖。真要跑带命名空间的代码,必须进 REPL 环境手动加载。
- 先确保已启动 nREPL(终端运行
clojure -M:nrepl,且deps.edn中定义了:nrepl别名) - 在 Sublime 中打开
.clj文件,光标停在要加载的命名空间声明处(如(ns my.core)),按Ctrl+Enter(需 Conjure/ClojureSublimed 已连上 nREPL) - 或手动在 REPL 里执行:
(load-file "src/my/core.clj")—— 注意路径是相对于项目根目录,不是文件所在目录 - 别指望 Build System 自动做这事;硬改构建命令为
["clj", "-r", "-e", "(load-file \"$file\")"]可能失败,因$file是绝对路径,而load-file需相对路径
Windows 下 clj 找不到?别信 PATH,填死路径
Sublime 在 Windows 上常因环境变量继承不全或路径含空格/中文,导致 command not found: clj。即使 cmd 能跑,Sublime 子进程也可能失败。
- 把
clj.bat安装到纯英文无空格路径,例如C:/tools/clojure/clj.bat - 在插件设置中(如 Conjure 或 ClojureSublimed)显式指定:
"clojure_cmd": ["C:/tools/clojure/clj.bat", "-M"] - 构建系统里也一样:
["C:/tools/clojure/clj.bat", "-i", "$file"],避免任何 PATH 依赖 - 斜杠用正斜杠
/(Windows 也认),别用反斜杠——否则 JSON 解析可能出错
缩进错一位,load-file 就静默失败
Clojure 缩进不是风格,是语法。Sublime 默认的 detect_indentation 会扫描文件开头几个缩进猜规则,极易误判老文件里的 tab 或混合空格,导致 defn 参数对齐错误、let 绑定失效,最终 load-file 报 RuntimeException 却不提示具体哪行错。
- 必须关掉自动检测:
"detect_indentation": false(加在 Preferences → Settings – Syntax Specific,且当前语法为 Clojure) - 强制设为 4 空格:
"tab_size": 4和"translate_tabs_to_spaces": true - 已有文件混 tab?全选 →
Ctrl+Shift+P→Convert Indentation to Spaces,再开Show All Characters手动删残留→
真正卡住人的,从来不是装哪个插件,而是 clj 命令能否被 Sublime 的子进程干净调起、nREPL 是否真在监听、以及缩进是否字节级一致——这三件事没对齐,所有快捷键和补全都只是幻觉。


















