菜单

内置规则

相关源文件

本页面介绍了 TheFuck 随附的标准规则。这些规则构成了应用程序的核心智能,能够在广泛的场景中自动纠正命令。有关创建自定义规则的信息,请参阅 自定义规则

什么是规则?

TheFuck 中的规则是 Python 模块,用于定义如何检测命令错误并生成更正。每个规则实现两个主要函数:

  1. match(command) - 确定规则是否适用于给定的失败命令
  2. get_new_command(command) - 生成更正后的命令建议

规则还可以定义可选属性:

  • priority - 控制规则应用的顺序(值越高,越先检查)
  • enabled_by_default - 布尔值,指示规则是否默认启用

来源: thefuck/rules/no_command.py6-41 thefuck/rules/history.py5-15

规则系统架构

规则系统是 TheFuck 命令纠正流程中的关键组成部分。当命令失败时,TheFuck 会按顺序应用适用的规则来生成更正建议。

规则选择和执行流程

来源: thefuck/rules/no_command.py6-38 thefuck/rules/sudo.py31-47

规则组件和关系

来源: thefuck/rules/sudo.py1-47 thefuck/rules/cd_mkdir.py1-21 thefuck/rules/hostscli.py1-27

内置规则类别

TheFuck 包含各种内置规则,用于处理各种命令行错误。这些可以分为几类:

1. 命令未找到规则

这些规则处理输入的命令不存在或拼写错误的情况。

  • no_command - 当找不到命令时,建议类似的可用命令
  • history - 从您的命令历史记录中建议类似的命令

来源: thefuck/rules/no_command.py6-41 thefuck/rules/history.py5-15

2. 权限规则

处理与权限相关的错误的规则。

  • sudo - 对因权限问题而失败的命令前置 sudo

来源: thefuck/rules/sudo.py1-47

3. Git 相关规则

用于更正常见 Git 错误的规则。

  • git_push - 修复需要配置上游分支的 Git push 命令

来源: thefuck/rules/git_push.py1-44

4. 文件系统规则

用于处理文件系统相关错误的规则。

  • cd_mkdir - 在尝试 cd 到不存在的路径时创建目录
  • cd_correction - 在使用 cd 时尝试更正目录名称中的拼写错误

来源: thefuck/rules/cd_mkdir.py1-21 thefuck/rules/cd_correction.py1-61

5. 特定应用程序规则

针对特定命令行应用程序定制的规则。

  • hostscli - 处理 hostscli 应用程序的错误

来源: thefuck/rules/hostscli.py1-27

关键规则的详细探讨

sudo 规则

sudo 是最常用的规则之一,它能检测权限错误并为命令前置 sudo

匹配模式

该规则能识别不同系统中的各种权限错误消息。

命令生成逻辑

该规则处理三种情况:

  1. 简单命令(仅前置 sudo
  2. 带重定向的命令(包装在 sudo sh -c "..." 中)
  3. && 的命令(包装在 sudo sh -c "..." 中)

来源: thefuck/rules/sudo.py1-47

no_command 规则

此规则通过建议类似的可用命令来帮助处理命令未找到的情况。

匹配逻辑

命令生成

该规则会在命令历史记录和可用可执行文件中查找相似的匹配项。

来源: thefuck/rules/no_command.py6-41

history 规则

history 规则具有最高优先级(9999),它会从历史记录中建议与用户输入的错误命令相似的命令。

来源: thefuck/rules/history.py5-15

git_push 规则

这是一条针对 Git 用户的专业规则,有助于解决推送分支而未配置上游的常见问题。

匹配逻辑

命令生成

该规则解析 Git 错误消息以提取建议的命令并应用它。

来源: thefuck/rules/git_push.py1-44

规则装饰器和实用程序

TheFuck 提供了一些装饰器来增强规则的功能:

1. @sudo_support

此装饰器允许规则在命令前是否加 sudo 前缀的情况下都能正常工作。

使用示例

来源: thefuck/rules/sudo.py31-41 thefuck/rules/no_command.py6-12

2. @for_app

将规则限制为特定的应用程序,通过避免不必要的规则检查来提高性能。

使用示例

来源: thefuck/rules/cd_mkdir.py7-15 thefuck/rules/hostscli.py9-16

3. @git_support

Git 相关规则的专用装饰器。

使用示例

来源: thefuck/rules/git_push.py6-9

规则优先级系统

规则具有可选的 priority 属性,用于确定它们被评估的顺序。值越高表示优先级越高。

来自 history.py 的示例

没有显式优先级的规则使用默认值。这确保了更专业的规则(如优先级为 9999 的 history)在更通用的规则(如优先级为 3000 的 no_command)之前被检查。

来源: thefuck/rules/history.py15 thefuck/rules/no_command.py41

规则测试

每个规则都有相关的测试来验证其功能。这些测试使用 pytest fixtures 来模拟系统组件并确保测试环境的一致性。

sudo 规则的示例测试

来源: tests/rules/test_sudo.py6-20 tests/rules/test_no_command.py19-40

结论

内置规则是 TheFuck 功能的核心,它能在各种场景下提供智能的命令纠正。每个规则都为特定类型的命令行错误实现了有针对性的解决方案,从而创建一个能够自动处理大多数常见错误的全面系统。

有关创建自定义规则以扩展此功能的更多信息,请参阅 自定义规则