calva快捷键严格依s-表达式结构设计:alt+enter评估光标最近的完整表单,ctrl+enter评估行首顶层表单,cmd/ctrl+alt+b发送选中代码块;光标位置、括号匹配与repl连接状态直接影响执行效果。

Calva 的快捷键不是“记住就能用”,而是得贴着 Clojure 的 S-表达式结构来设计——括号层级、光标位置、表单边界,直接决定 Alt+Enter 送的是哪一层代码。
Calva 默认快捷键和光标位置强相关
Calva 不是简单地“执行当前行”,它按 S-表达式(即括号包裹的完整表单)识别作用域。光标在哪,就评估离它最近的、语法完整的表单。
-
Alt+Enter:评估“光标所在位置的最内层表单”。比如光标停在(defn foo [] (+ 1 2))中间任意处,整个函数定义会被发送到 REPL;若停在(+ 1 2)内部,则只送这个加法表达式 -
Ctrl+Enter:评估“当前光标所在行的顶层表单”——前提是该行以左括号开头且构成完整表单,否则可能报错或无响应 -
Cmd+Alt+B(macOS)/Ctrl+Alt+B(Windows/Linux):把当前选中的代码块(哪怕跨多行)作为整体发送,不依赖括号匹配,适合临时拼凑测试逻辑
常见错误现象:Alt+Enter 没反应,往往是因为光标落在注释里、字符串中间,或括号不闭合导致 Calva 无法解析出合法表单。
REPL 连接失败时先查 deps.edn 和 CLI 状态
Calva 启动 REPL 本质是调用本地 clojure 命令,不是自己模拟。如果 Calva: Start a Project REPL and Connect 卡住或报错,别急着重装扩展。
- 确认项目根目录有
deps.edn,且内容至少包含{:deps {org.clojure/clojure {:mvn/version "1.12.0"}}}这类基础依赖声明 - 终端执行
clojure -Sversion,输出应为类似1.12.0的版本号;若提示 command not found,说明 Clojure CLI 未正确安装或未加入$PATH - 运行
clojure -T:deps list,能列出坐标说明 deps 解析正常;若报Could not resolve deps,大概率是网络问题或镜像源配置缺失
注意:lein repl 或 shadow-cljs watch 启动的 REPL,Calva 无法自动识别——必须用 Calva 自带命令启动,或手动连接已运行的 nREPL 端口。
结构化编辑(Paredit)开启后,删括号不再危险
默认启用的 Paredit 模式会拦截直接删除 ) 或 ] 的操作,这是保护机制,不是 bug。
- 想删掉一个表单?把光标移到其开头(
(左侧),按Ctrl+Shift+K(删整行)或Backspace(删整个 S-表达式) - 想拆分嵌套表单?光标停在逗号或空格处,用
Ctrl+Shift+P→ “Calva: Split S-expression” - 想合并相邻表单?选中两个并列的
(...),再执行 “Calva: Join S-expressions”
关闭 Paredit 虽然能自由删括号,但立刻失去 Ctrl+Shift+Right(扩选外层)、Ctrl+Shift+Left(缩选内层)这类高效导航能力——对 Clojure 来说,这不是便利性取舍,而是编辑精度门槛。
REPL 输出里 *1、*e 这些变量怎么用
它们不是 Calva 特有,而是 Clojure REPL 内置的特殊变量,保存最近执行结果和错误,随时可在后续表达式中引用。
-
*1是上一次成功求值的结果,*2是倒数第二次,*3是倒数第三次 -
*e是最后一次抛出的异常对象,可接ex-message或ex-cause查细节,比如(println (ex-message *e)) - 这些变量只在当前 REPL 会话有效,重启 REPL 就清空;不要在正式代码里依赖它们,仅用于交互探索
容易被忽略的一点:当你用 Alt+Enter 发送多个表达式(比如连续两行 (def x 1) 和 (inc x)),*1 只存最后一个结果(2),前面的 x 定义虽生效,但不会留在 *1 里——它已写入命名空间,不是“上一次求值”。











