CodeMirror Duplicate Finder 默认配置无效,需调低minLines至5、similarityThreshold至75,并启用includeStrings;它仅做字符串匹配,不理解语义,易漏报/误报,合并前须格式化且人工验证上下文。

CodeMirror Duplicate Finder 配置不对就等于没装
它默认只扫连续 8 行以上、相似度 ≥ 85% 的块,但真实项目里大量钩子逻辑、错误处理、API 封装都不到 8 行,变量名一换相似度就掉到 70 以下。不调配置,等于把插件当摆设。
- 把
duplicate-finder.minLines改成5(小函数/副作用逻辑常就 4–6 行) - 把
duplicate-finder.similarityThreshold调到75(否则payload和data就算不上重复) - 若重复藏在模板字符串或 JSX 里,必须开
duplicate-finder.includeStrings: true - 检查
.gitignore或files.exclude是否排除了目标目录(比如"src/hooks/**"被挡住了)
Ctrl+Shift+F 搜不到“逻辑重复”不是你搜得不对
它只做字符串匹配,完全不理解代码结构。两个 axios.post 调用,一个用 payload、一个用 body,它就当两段无关代码;for (let i = 0; i 和 for (const item of arr) 更是天各一方。
- 它会漏掉:变量名不同、缩进不一致、注释位置变化、模板字符串包裹的逻辑
- 它会误报:字符串里拼出的
localStorage.setItem、注释里写的// TODO: refactor axios.post - 真要定位逻辑重复,先用 Ctrl+Shift+F 搜共性关键词(如
catch (err)、localStorage.getItem),再人工比对上下文结构
跳转到重复行后别急着合并,先看这三处
插件高亮的是“文本块相似”,不是“语义等价”。同一段逻辑被拆进两个 if 分支、一个加了空校验 if (!x) return;、另一个没加——它们会被分组显示,但直接合并可能引入 bug。
- 检查每处的前置条件是否一致(比如一个在 try 内、一个在 try 外)
- 确认返回值处理是否相同(一个
return res.data,另一个throw new Error()) - 留意副作用是否被复制(比如两处都调了
trackEvent('submit'),合并后就变成双上报)
Ctrl+J 合并多行前必须手动清理格式
Ctrl+J 不是智能合并,只是删换行符 + 插空格。它保留原行尾空格、Tab、缩进,极易破坏结构和语义。
- 模板字符串中
`hello\nworld`经Ctrl+J变成`hello world`,换行语义丢失 - 对象字面量
{\n a: 1,\n b: 2\n}合并后变成{ a: 1, b: 2 },可读性归零 - 合并前务必先执行
editor.action.trimTrailingWhitespace(Ctrl+K Ctrl+X),再用 Shift+Alt+F 格式化 - 需要逗号/分号连接时,用正则替换更可控,例如查找
\n\s*(?=[^{\n])替换为,
真正难处理的重复,永远不在插件的检测范围内——比如参数名不同但逻辑完全一致、箭头函数 vs 普通函数、同一段校验逻辑被分别塞进两个组件的 useEffect 里。这些没法靠配置调出来,得靠你盯着 diff 结果,结合业务上下文判断:这里该抽成 hook,还是该统一走 service 层。











