clj-refactor.el 4.0

Lobsters Hottest 工具

摘要

clj-refactor.el 4.0,近五年来首个主要版本,引入了热依赖加载、异步重构、差异预览、瞬态菜单以及众多针对Emacs中Clojure开发的改进。

<p><a href="https://lobste.rs/s/sg1uyo/clj_refactor_el_4_0">评论</a></p>
查看原文
查看缓存全文

缓存时间: 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-symbolcljr-change-function-signaturecljr-inline-symbol 现在会以 diff 的形式显示其更改,并且在确认之前不会进行任何修改;新的 cljr-undo-last-refactoringur)可以一步撤销上一次应用的重构(涉及所有受影响的文件)。
  • 重量级命令已经异步化。重命名、更改签名和重命名文件以前会在 refactor-nrepl 分析项目时冻结 Emacs——现在它们会立即返回,在模式行中显示一个旋转指示器,并在分析完成时结束。对于大型项目,冷缓存运行体验大大改善。
  • cljr-change-function-signature 功能增强:现在可以添加和删除参数(不仅仅是重新排序和重命名),支持多参数函数,并且修复了一个长期存在的解析错误——该错误导致它无法与最新的 CIDER 版本配合使用。
  • cljr-slash(神奇的 require 功能)学会了一个巧妙的技巧:cljr-magic-require-namespaces 中的条目可以携带一个 :artifact 坐标,当命名空间不在你的类路径中时,输入 json/ 会主动提供将库添加到项目并立即热加载的选项。
  • 一系列命令现在无需运行 REPL 即可工作。cljr-slashcljr-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-cursorshydrainflections,以及一大堆自 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!

相似文章

Emacs 31 即将到来:我日常使用的变化

Hacker News Top

Emacs 31 即将到来,带来了更简单的 tree-sitter 配置和内置的 markdown-ts-mode 等改进。本文详细介绍了作者在开发分支中使用的一些特性,强调了配置工作量的减少。

带有状态REPL的代码模式

Reddit r/AI_Agents

作者介绍了 ptc_runner_mcp,这是一个 MCP 服务器,它提供了一个有状态的、沙盒化的 REPL,使用类似 Clojure 的语言,允许 AI 代理进行探索性计算,而不会使上下文窗口过载。

Magit 4.6 发布

Lobsters Hottest

Magit 4.6,Emacs 上流行的 Git 界面,已发布,改进了浏览 blob 的缓冲区,并在差异中增加了实验性的语法高亮。