Skip to main content

search_files

search_files工具可在项目工作区内跨多个文件执行正则表达式搜索。出于安全考虑,它无法搜索当前工作区目录之外的内容。该工具帮助Roo在整个代码库中定位特定的代码模式、文本或其他内容,并提供上下文结果。


参数

工具接受以下参数:

  • path (必填): 要搜索的目录路径,相对于当前工作区目录。搜索范围仅限于工作区内。
  • regex (必填): 要搜索的正则表达式模式(使用Rust正则表达式语法)
  • file_pattern (可选): 用于过滤文件的glob模式(例如'*.ts'表示仅搜索TypeScript文件)

功能说明

该工具使用正则表达式在指定目录中跨文件搜索,显示每个匹配项及其上下文内容。相当于一个强大的"在文件中查找"功能,可在整个项目结构中工作。


使用场景

  • 当Roo需要查找特定函数或变量的使用位置时
  • 当Roo协助重构并需要了解使用模式时
  • 当Roo需要定位特定代码模式的所有实例时
  • 当Roo需要在多个文件中搜索文本并具有过滤能力时

主要特性

  • 使用高性能Ripgrep在单次操作中跨多个文件搜索
  • 显示每个匹配项的上下文(默认前后各1行)
  • 使用glob模式按文件类型过滤(例如仅TypeScript文件)
  • 提供行号便于参考
  • 使用强大的正则表达式模式进行精确搜索
  • 自动限制输出为300个结果并给出通知
  • 对超过500字符的行进行截断并标记为"[truncated...]"
  • 智能地将相邻匹配合并为单个块以提高可读性

限制

  • 最适合基于文本的文件(对图像等二进制文件无效)
  • 在极大代码库中性能可能下降
  • 使用Rust正则表达式语法,可能与其他实现略有不同
  • 无法搜索压缩文件或存档
  • 默认上下文大小固定(前后各1行)
  • 当匹配项接近时,由于结果分组,显示的上下文大小可能不同
  • 出于安全考虑,搜索严格限制在当前工作区内,无法访问父目录或其他文件系统位置

工作原理

当调用search_files工具时,它遵循以下流程:

  1. 参数验证:验证必需的pathregex参数
  2. 路径解析:将相对路径解析为绝对路径
  3. 搜索执行
    • 使用Ripgrep(rg)进行高性能文本搜索
    • 应用文件模式过滤(如指定)
    • 收集匹配项及其上下文
  4. 结果格式化
    • 使用文件路径、行号和上下文格式化结果
    • 默认显示匹配项前后各1行上下文
    • 结构化输出以提高可读性
    • 限制最多显示300个匹配结果并给出通知
    • 截断超过500字符的行
    • 将相邻匹配合并为连续块

搜索结果格式

搜索结果包括:

  • 每个匹配文件的相对路径(以#开头)
  • 每个匹配项前后的上下文行(默认1行)
  • 3位行号填充后跟|和行内容
  • 每个匹配组后的分隔线(----)

示例输出格式:

# rel/path/to/app.ts
11 | // 一些处理逻辑
12 | // TODO: 实现错误处理
13 | return processedData;
----

# 显示300+结果中的前300个。如需更精确结果请使用更具体的搜索条件。

当匹配项彼此接近时,它们会被合并为单个块而非单独显示:

# rel/path/to/auth.ts
13 | // 一些代码
14 | // TODO: 添加适当的验证
15 | function validateUser(credentials) {
16 | // TODO: 实现速率限制
17 | return checkDatabase(credentials);
----

使用示例

  • 当要求重构函数时,Roo首先搜索该函数的所有使用位置以确保全面更改
  • 当调查错误时,Roo搜索相似模式以识别代码库中的相关问题
  • 当处理技术债务时,Roo定位项目中的所有TODO注释
  • 当分析依赖关系时,Roo查找特定模块的所有导入

用法示例

在所有JavaScript文件中搜索TODO注释:

<search_files>
<path>src</path>
<regex>TODO|FIXME</regex>
<file_pattern>*.js</file_pattern>
</search_files>

查找特定函数的所有使用:

<search_files>
<path>.</path>
<regex>function\s+calculateTotal</regex>
<file_pattern>*.{js,ts}</file_pattern>
</search_files>

在整个项目中搜索特定的导入模式:

<search_files>
<path>.</path>
<regex>import\s+.*\s+from\s+['"]@components/</regex>
</search_files>