Sublime Text的Ctrl+Shift+F仅支持全文本搜索,无法自动检测重复代码;需人工结合Where过滤、Whole Word、正则等技巧定位疑似重复逻辑,语义重复须依赖ESLint或jscpd等专用工具。

全局搜索本身不检测重复代码,只能辅助人工比对
Sublime Text 的 Ctrl+Shift+F(Mac 为 Cmd+Shift+F)是全文本扫描工具,不是重复检测器——它不会自动标记“这行在 fileA.py 和 fileB.js 里都出现过”。所谓“检查重复代码”,实际是靠人借助搜索结果反向推断:比如搜 fetch('/api/users'),发现它在 5 个文件里都存在,且上下文高度相似,这才怀疑是硬编码重复。真正的重复逻辑(如函数体雷同、结构相似)它完全无法识别。
用 Ctrl+Shift+F 配合 Where 精准定位疑似重复点
盲目搜一个变量名或字符串,结果常被噪声淹没。关键在缩小范围:
- 在
Where框填./src/**/*.js,只查 JS 源码,避开node_modules和构建产物 - 加前缀限定上下文:搜
function validateUser而非validateUser,避免匹配到调用处或注释 - 启用
Whole Word(Alt+W)和Case Sensitive(Alt+C),防止user_id匹配到user_id_v2 - 若怀疑某段逻辑被复制粘贴,把整块代码(含缩进)粘进
Find框,勾选Regex并用\s+替换多余空格,再搜
正则搜“模式化重复”比搜字面量更有效
硬编码的 URL、魔法数字、固定错误消息容易重复;但真正该删的是重复的逻辑模式。这时得用正则抓共性:
- 搜所有未加前缀的 API 调用:
fetch\(['"](/[^'"]+)['"]\)→ 查看匹配路径是否集中在少数几个,暴露冗余封装 - 搜重复的状态初始化:
state = \{.*?loading: false, error: null→ 若多处手动写这套初始值,说明缺统一工厂函数 - 搜裸
console.log:\bconsole\.log\([^)]*\)→ 大量存在往往意味着调试残留或日志规范缺失
注意:Regex 模式下,. 默认不匹配换行,跨行内容需手动点右下角 .* 开启 . matches newline。
大项目中单靠搜索会漏掉“语义重复”
两个函数名字不同、参数不同,但核心逻辑都是“取数组最大值并加 1”,Ctrl+Shift+F 根本搜不到这种重复。此时必须结合其他手段:
- 先用搜索确认高频关键词(如
max,Math.max,reduce),再人工打开匹配文件横向比对实现 - 对疑似重复的函数,复制其主体到新标签页,用
Ctrl+H启用正则,搜\b[a-zA-Z_][a-zA-Z0-9_]*\b提取所有变量名,看命名是否趋同(如都用arr,res) - 真正要自动化查语义重复,得用 ESLint 插件(如
eslint-plugin-duplicate)或专用工具(jscpd),Sublime 只负责把它们报出的问题快速跳转到源码
最容易被忽略的是:搜索结果里同一行多次命中(比如一个 for 循环里有 3 个 item.id),不代表代码重复——那是正常访问。重点永远在“不同位置、相似结构、相同意图”的跨文件片段。

















