find in files 搜不到结构重复,因其仅执行字符串/正则匹配,无法识别变量名差异、缩进变化、注释位置变动、模板字符串换行等语义等价但文本不同的逻辑重复,更不能判断for循环等结构的语义一致性。

CodeMirror Duplicate Finder 是目前最贴近“结构重复”检测需求的轻量方案,但它只做行级相似度比对,不理解语法树或语义。
为什么 Find in Files 搜不到结构重复?
Ctrl+Shift+F 本质是字符串匹配:变量名一换(data vs payload)、缩进多一个空格、注释位置挪动、模板字符串换行,就全失效。它甚至分不清 for (let i = 0; i 和 <code>for (const item of arr) 是同一类遍历逻辑——这不是 bug,是设计使然。
常见漏查场景包括:
- 重复逻辑藏在 JSX 或带换行的
`template ${x}\n${y}`里,默认被跳过 - 两个函数仅差一行日志、一个空校验
if (!x) return;,或参数解构方式不同 - .gitignore 排除了
src/utils/**,但你想查的重复恰在那儿
CodeMirror Duplicate Finder 怎么调才管用?
它默认按「连续 8 行 + 相似度 ≥ 85%」触发,对小钩子、短逻辑块太苛刻。必须手动改两个配置项:
- 把
duplicate-finder.minLines改成5(尤其适合 React hooks、小型工具函数) - 把
duplicate-finder.similarityThreshold调到75,否则变量名/注释微调就归零 - 若重复在模板字符串或 JSX 中,必须开启
duplicate-finder.includeStrings: true
启用后右键 → Find Duplicates in Workspace,结果按组显示在侧边栏,点任意一处直接跳转所有匹配位置。
结构重复真查不出来时,人工怎么补?
插件对“变体重复”基本无解:比如一个用箭头函数 + 解构,另一个用普通函数 + arguments;或者同一段逻辑被拆进两个 if 分支,结构错位。这时候更高效的是组合技:
- 用 Ctrl+Shift+F 搜共性关键词,比如
axios.post、localStorage.setItem、catch (err),把返回的几处代码块复制进 diffchecker.com 快速比对 - 需要跨文件宽容比对,可临时跑 Simian:
simian -includes=**/*.ts,**/*.js -threshold=80(它对空格/缩进更宽松) - 对疑似块用 Partial Diff 插件直接在 VSCode 内比对:Cmd/Ctrl 选两段 → 右键 →
Partial Diff: Compare with Selection
真正难判断的从来不是“像不像”,而是“该不该合并”——比如两个超时时间从 5000 改成 10000,结构高度相似,但业务含义已分化。这种边界,工具标不出,得你对着接口文档和调用链路拍板。











