◆

WebStorm 搜索替换排除 .git 等指定文件夹

2023-05-16 02:450

场景

webstorm 在执行搜索与替换时,经常会出现 .git 文件夹中的内容

解决方法

对所需要忽略的文件夹右键后按如图操作即可

webstorm搜索排除指定文件夹

也就是右键目录 → Mark Directory as → Excluded。标记之后目录变成橙色,WebStorm 不再对它建索引,全局搜索(Cmd + Shift + F)也就不会命中它里面的内容。

.git 为什么会出现在搜索结果里

.git 默认是在 Settings → Editor → File Types → Ignored Files and Folders 列表里的,正常情况下搜不到。会搜到通常是两种情况:

一是你之前为了看 .git 目录,把它从那个 Ignored 列表里删掉了。删掉之后它就变成一个普通目录,跟着一起被索引和搜索。

二是搜索时的 Scope 选错了。搜索面板右侧有个作用域下拉,选项的含义差别很大:

  • In Project — 默认值,只搜项目里的源码,跳过 Excluded 目录和 Library。
  • Module — 只搜当前模块。
  • Directory — 只搜指定目录,可以配合下面的 Recursively 勾选。
  • Scope — 用自定义作用域,下面单独说。
  • All Places — 搜一切,包括 node_modules、Excluded 目录、外部库的源码。这个选项就是「明明标记了 Excluded 还是搜得到」的原因。

发现搜索结果里混进了不该有的东西,第一件事是看这个下拉是不是被切成了 All Places。它会被记住,一次切换之后后面所有搜索都受影响。

自定义 Scope:比 Excluded 更精细

Excluded 是一刀切的——标记之后 IDE 完全不索引,代价是那个目录里的代码彻底失去补全和跳转。但有些目录并不适合这么处理,比如:

  • public/ 下的静态资源,偶尔要搜里面的配置
  • 老代码目录,平时不想搜到但需要跳转
  • 测试目录,做重构时需要搜、日常开发不想被干扰

这时候用自定义 Scope 更合适:定义一个「只搜业务代码」的作用域,日常用它,需要全搜的时候切回 In Project。

配置路径:Settings → Appearance & Behavior → Scopes,点 + 新建一个 Local(只自己用)或 Shared(存进 .idea/scopes/,可以提交给团队)。

界面上可以在目录树里逐个点 Include / Exclude,但更快的方式是直接写 Pattern 表达式:

file[项目名]:src/*//*

排除某些目录的写法是用 &&!:

file:*//*&&!file:node_modules//*&&!file:dist//*&&!file:*.min.js

语法要点:

  • //* 表示递归包含所有子目录,只写 /* 只匹配当前一层
  • && 是与,|| 是或,! 是非
  • 可以直接写文件名通配,比如 !file:*.map 排掉 sourcemap

Shared 的 Scope 存成 .idea/scopes/<名字>.xml,把这个文件提交进 git,团队里所有人都能在搜索面板的 Scope 下拉里看到它。这比让每个人自己配一遍靠谱。

搜索面板里的其它过滤手段

除了 Scope,Find in Files 面板上还有几个常被忽略的按钮,实际比换 Scope 更快:

File mask — 右侧那个输入框,填文件名通配就只搜匹配的文件。支持多个模式用逗号分隔,也支持取反:

*.ts,*.tsx          只搜 TS 文件
!*.spec.ts          排掉测试文件
*.vue               只搜 Vue 组件

这个是我用得最多的,比配 Scope 轻量得多。搜一个组件名的时候填 *.vue,噪音立刻少一半。

Cc(Match case) — 区分大小写。搜 Id 不想匹配到 id 时必开。

W(Words) — 全词匹配。搜 get 不想匹配 getUser、target 时用它。

.*(Regex) — 正则模式。开了之后可以用捕获组,而且替换时能用 $1、$2 引用捕获组,这是批量重构最有用的功能。比如把所有 console.log('xxx') 改成带前缀的:

查找:console\.log\((['"])(.+?)\1\)
替换:console.log($1[debug] $2$1)

正则模式下还支持 \n 匹配换行,可以做跨行的查找替换。

相关快捷键

搜索这一块的快捷键值得全记住,因为用得太频繁(macOS / Windows):

  • Cmd + F / Ctrl + F — 当前文件内查找
  • Cmd + R / Ctrl + R — 当前文件内替换
  • Cmd + Shift + F / Ctrl + Shift + F — 全局查找
  • Cmd + Shift + R / Ctrl + Shift + R — 全局替换
  • Shift + Shift — Search Everywhere,搜文件名/符号/设置项,什么都能搜
  • Cmd + Shift + O / Ctrl + Shift + N — 按文件名找文件
  • Cmd + Option + O / Ctrl + Alt + Shift + N — 按符号名(函数、变量、类)找
  • Option + F7 / Alt + F7 — 查找当前符号的所有用法(Find Usages)

最后这个 Find Usages 特别值得强调:它是基于索引和语义的,不是文本匹配。搜一个函数名,它只会列出真正调用这个函数的地方,不会把注释里、字符串里、以及同名但不同作用域的变量算进去。想改一个函数的签名、想确认某个变量还有没有人用,永远优先用 Find Usages 而不是文本搜索。这也是 Excluded 目录的一个隐性代价——被排除的目录不建索引,Find Usages 就查不到它里面的引用,重命名重构时会漏改。所以标记 Excluded 之前,先想清楚那个目录里会不会有活代码引用你的符号。

全局替换前的自保动作

全局替换是少数几个能一次性搞坏整个项目的操作,做之前建议固定两步:

1. 确保工作区干净。git status 看一眼没有未提交的改动,出问题直接 git checkout . 全部回滚。

2. 先 Find 再 Replace。WebStorm 的替换面板有个 Preview 区域会列出所有匹配项,逐条看一遍再点 Replace All。数量对不上就说明模式写得太宽了。

替换完之后如果发现错了,除了 git,还有一条退路:Edit → Undo(Cmd + Z)在全局替换后按一次能整体撤销,IDE 把它当成单个原子操作。但这只在你还没做其它编辑操作时有效,所以发现问题要立刻撤,别先去改别的文件。

另外 Local History 也能救:右键项目根目录 → Local History → Show History,WebStorm 自己维护了一份独立于 git 的本地变更历史,能按时间点回滚。这个功能在还没 git init 的项目里尤其有用。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEWebStorm 搜索替换排除 .git 等指定文件夹加载中