关于 clj-replace
面向 Clojure 开发的结构化代码替换 skill,通过比较 S 表达式而非逐字匹配来查找代码。它忽略空白和换行差异,并在替换时保留文件原有格式。
主要功能
- 01按 S 表达式结构匹配
- 02忽略空格与换行差异
- 03保留文件格式与风格
- 04报告匹配位置及歧义
适用场景
- 01文本替换因缩进差异失败时修改代码
- 02替换跨多行书写的 Clojure 表达式
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ humorless/ clj-native-agent --skill clj-replace安装后在 Claude Code 中输入/clj-replace确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
CHANGELOG.mdREADME.mddocs/QUICK-START.mdVERIFICATION.mdevals/evals.jsonREADME.mdscripts/clj-replace.bb详细介绍
clj-replace:结构化 Clojure 代码替换
一款支持 Clojure 的代码替换工具。它通过比较代码结构(S 表达式)而非字面文本,改进了 Claude Code 内置的 str_replace。
适用场景
以下情况请使用 /clj-replace:
- Claude Code 的
str_replace失败,因为old_string与目标代码的格式(空白、缩进、换行)不同 - 你需要替换代码,但空白或格式与源代码不完全一致
- 你希望替换后的代码保留原文件的格式和风格
示例: 如果 str_replace 提示“old_string not found”,但代码结构看起来相同,请改用 clj-replace。
工作原理
clj-replace 不会逐字符比较文本,而是进行结构化比较:
- 将
old-string和文件内容解析为 S 表达式树(zipper) - 遍历文件,将每个节点的结构与目标进行比较(对 sexpr 使用
=) - 比较时会忽略格式差异(空格、缩进、换行)
- 找到匹配项后,替换该节点,同时保留原文件的格式
这意味着以下内容都等价:
(foo bar) ≡ (foo bar) ≡ (foo
bar)
参数
位置参数:
filename— 要修改的 Clojure 源文件路径old-string— 要查找的代码片段(字符串)new-string— 用于替换的代码片段(字符串)
用法
/clj-replace path/to/file.clj "old code here" "new code here"
示例
示例 1:空白差异
文件内容:
(defn update-user
[db id attrs]
(merge-user db id attrs))
命令:
/clj-replace src/app.clj "(merge-user db id attrs)" "(update-user-in-db db id attrs)"
即使文件的缩进不同也能正常工作。它会替换匹配的完整形式,同时保留文件风格。
示例 2:多行形式
文件内容:
(some-function
arg1
arg2
arg3)
命令:
/clj-replace src/app.clj "(some-function arg1 arg2 arg3)" "(other-function arg1 arg2 arg3)"
无论原始内容如何跨行格式化,都能匹配。
退出代码
0— 成功:替换了一个或多个节点1— 错误:文件不存在,或old-string/new-string不是有效的 Clojure2— 错误:在文件中找不到匹配的 S 表达式3— 错误:找到多个匹配的 S 表达式(存在歧义);用户必须提供更具体的old-string
输出
成功时:
✓ Replaced 1 node(s) in path/to/file.clj
Location: line 42, column 5
Old: (merge-user db id attrs)
New: (update-user-in-db db id attrs)
存在多个匹配项时:
✗ Found 3 matching S-expressions in path/to/file.clj (ambiguous)
1. line 42, column 5: (foo bar)
2. line 85, column 10: (foo bar)
3. line 120, column 1: (foo bar)
Please provide a more specific old-string (e.g., include surrounding context)
实现细节
使用 rewrite-clj 库实现:
- 保留格式的解析和修改
- S 表达式的结构化比较
- 安全地替换节点,同时保留空白和风格
该工具遵循 Clojure 的语义:如果两个表达式解析后具有相同结构,则它们等价,无论表面格式如何。
评论
支持 Markdown