clj-refactor.el 4.0
摘要
clj-refactor.el 4.0,近五年来首个主要版本,引入了热依赖加载、异步重构、差异预览、瞬态菜单以及众多针对Emacs中Clojure开发的改进。
查看缓存全文
缓存时间: 2026/07/16 17:58
clj-refactor.el 4.0
来源:https://metaredux.com/posts/2026/07/16/clj-refactor-4-0.html 紧随CIDER 2.0 (https://metaredux.com/posts/2026/07/15/cider-2-0.html) 发布之后,clj-refactor.el 4.0 (https://github.com/clojure-emacs/clj-refactor.el/releases/tag/v4.0.0) 也来了!这是该项目近五年来的首个主要版本,这次的版本号提升绝非仅仅仪式性的——4.0 是 clj-refactor 多年来面向用户改进的最大一波更新,同时还有大量早该进行的春季大扫除。
未竟之事
当我在 2021 年宣布 clj-refactor.el 3.0 (https://metaredux.com/posts/2021/10/26/clj-refactor-3-0.html) 时,我一开始就坦白了一件事——我们未能实现该版本的主要目标,即恢复因 JDK 9 模块系统而失效的依赖热加载功能。好吧,迟到总比不到好:cljr-hotload-dependency 在 4.0 中回归了,它基于 clojure.tools.deps 重新实现,并且除了经典的 Leiningen 向量外,现在还支持 deps.edn 风格的坐标映射。¹ (https://metaredux.com/posts/2026/07/16/clj-refactor-4-0.html#fn:1)
我也要坦诚地说一下更大的背景,就像当时那样:clj-refactor 在过去的几年大部分时间都处于维护模式,而 clojure-lsp 已成为社区许多人的默认重构引擎。不过,这并没有让我气馁——反而明确了 clj-refactor 应该成为什么样子。该项目现在有了一个合适的路线图 (https://github.com/clojure-emacs/clj-refactor.el/blob/master/ROADMAP.md),清楚地说明了未来的方向(剧透:一个静态分析索引以及与 CIDER 更紧密的联系),而 4.0 正是朝着这个方向迈出的第一步。
亮点
4.0 的更新日志 (https://github.com/clojure-emacs/clj-refactor.el/blob/master/CHANGELOG.md) 有超过 40 条记录,但以下是我最兴奋的:
- 新增了
clj-refactor-menu——一个包含所有命令的transient菜单,按类别分组(绑定在你的前缀键下的hh,例如C-c C-m hh)。它镜像了经典的双字母助记符,因此也可作为学习这些助记符的方法。它取代了旧版的 hydra 驱动菜单,这让我们可以去掉hydra依赖。 - 项目级别的重构不再是盲目的尝试。
cljr-rename-symbol、cljr-change-function-signature和cljr-inline-symbol现在会以 diff 的形式显示其更改,并且在确认之前不会进行任何修改;新的cljr-undo-last-refactoring(ur)可以一步撤销上一次应用的重构(涉及所有受影响的文件)。 - 重量级命令已经异步化。重命名、更改签名和重命名文件以前会在 refactor-nrepl 分析项目时冻结 Emacs——现在它们会立即返回,在模式行中显示一个旋转指示器,并在分析完成时结束。对于大型项目,冷缓存运行体验大大改善。
cljr-change-function-signature功能增强:现在可以添加和删除参数(不仅仅是重新排序和重命名),支持多参数函数,并且修复了一个长期存在的解析错误——该错误导致它无法与最新的 CIDER 版本配合使用。cljr-slash(神奇的 require 功能)学会了一个巧妙的技巧:cljr-magic-require-namespaces中的条目可以携带一个:artifact坐标,当命名空间不在你的类路径中时,输入json/会主动提供将库添加到项目并立即热加载的选项。- 一系列命令现在无需运行 REPL 即可工作。
cljr-slash和cljr-add-missing-libspec会回退到静态别名表,cljr-clean-ns会回退到对 ns 表单进行排序,而cljr-remove-let以及#(...) -> (fn ...)的转换则在 Emacs 侧纯手动处理。在 REPL 启动之前重构你的 require 不再是一件令人烦恼的事。 - 一切反应更快。工件列表和 libspec 建议在客户端缓存(后者很重要,因为每次按
/键都会触发cljr-slash),并且启动缓存预热现在实际上会填充交互式命令读取的缓存。 - clj-refactor 现在使用命名空间操作名(
refactor/clean-ns等)与 refactor-nrepl 通信,并为旧版中间件提供了优雅的回退。配套的 refactor-nrepl (https://github.com/clojure-emacs/refactor-nrepl/releases/tag/v3.14.0) 3.14.0 版本还加强了 AST 分析,并显著加快了对包含许多宏的项目的查找引用速度。 - 依赖节食继续进行:去掉了
multiple-cursors、hydra和inflections,以及一大堆自 2.3.0 起就已弃用的别名。clj-refactor 现在比过去更加精简。 - 以及一长串生活质量修复——
cljr-describe-refactoring现在会在浏览器中打开维基页面,而不是抓取 HTML;依赖命令会给出清晰的错误信息,而不是原始的搜索失败结果;clojure-ts-mode用户现在可以使用离线 ns 排序和正确的设置文档。
升级
4.0 是一个主要版本,确实带来了一些破坏性变更:最低要求变为 Emacs 28.1 和 CIDER 2.0;长期以来弃用的 2.3.0 时代命令别名已移除(请使用现在位于 clojure-mode 中的 clojure-* 等价别名);cljr-slash 中遗留的 namespace-aliases 代码路径及其三个配置选项已被移除。在中间件方面,如果你使用 cider-jack-in,则无需执行任何操作——refactor-nrepl 3.14.0 会自动注入,而旧版本由于操作名回退机制仍可正常工作。大多数配置应该无需改动即可升级,但如果你有高度自定义的配置,建议快速浏览一下更新日志 (https://github.com/clojure-emacs/clj-refactor.el/blob/master/CHANGELOG.md)。
五年之后
再次阅读 3.0 版本的公告,我当时写道,我们想展示“我们尚未达到纯(或者说大部分?)REPL 驱动重构方法的极限”。我仍然相信这一点,而 4.0 希望就是一些证据。路线图 (https://github.com/clojure-emacs/clj-refactor.el/blob/master/ROADMAP.md) 包含了其余计划——包括使分析足够快速和健壮,以消除人们转而使用其他工具的理由——而且随着 CIDER 2.0 的发布,我终于有了一些时间可以投入到这方面。
衷心感谢多年来为 clj-refactor 和 refactor-nrepl 做出贡献的每一个人,感谢 Clojurists Together (https://www.clojuriststogether.org/) 对更广泛的 CIDER 生态系统的支持,也感谢所有在沉寂的几年里不断提交问题的人——这些问题塑造了本版本中发布的大部分内容。
信赖 REPL!
相似文章
AgRefactor:面向HLS兼容性与性能的自演进智能工作流
AgRefactor是一个基于LLM的多智能体工作流,用于将软件重构为HLS兼容程序,具备自演进记忆系统和自动化重构工具,在真实世界基准测试中实现了显著加速。
@dbreunig:大版本发布:RLM 优化、优化链串联、LiteLLM 解耦启动,并有 24 位首次贡献者…
重磅开源版本:RLM 优化、优化链串联、LiteLLM 解耦启动,迎来 24 位新贡献者。
Emacs 31 即将到来:我日常使用的变化
Emacs 31 即将到来,带来了更简单的 tree-sitter 配置和内置的 markdown-ts-mode 等改进。本文详细介绍了作者在开发分支中使用的一些特性,强调了配置工作量的减少。
带有状态REPL的代码模式
作者介绍了 ptc_runner_mcp,这是一个 MCP 服务器,它提供了一个有状态的、沙盒化的 REPL,使用类似 Clojure 的语言,允许 AI 代理进行探索性计算,而不会使上下文窗口过载。
Magit 4.6 发布
Magit 4.6,Emacs 上流行的 Git 界面,已发布,改进了浏览 blob 的缓冲区,并在差异中增加了实验性的语法高亮。