菜单

命令更正流程

相关源文件

命令修正管道是 TheFuck 的核心系统,它将用户失败的命令转换为建议的修正命令。本页介绍了命令在应用流程中是如何处理、与规则匹配以及被修正的。有关具体规则的信息,请参阅 规则系统

概述

命令修正管道通过以下方式提供 TheFuck 的核心功能:

  1. 处理失败的命令
  2. 识别适用的修正规则
  3. 生成修正后的命令建议
  4. 优先排序和组织这些建议
  5. 将它们呈现给用户选择

命令更正流程

来源: thefuck/corrector.py81-92 thefuck/types.py247-262

核心组件

该管道由三个主要类和一个协调流程的修正器模块组成

来源: thefuck/types.py12-262 thefuck/corrector.py1-92

Command 类

Command 类表示要修正的命令

  • 包含原始命令文本(script)和命令输出(output
  • 提供 `script_parts` 属性,将命令拆分为部分以便于分析
  • 有一个名为 `from_raw_script` 的静态方法,用于从原始输入创建 Command 对象

来源: thefuck/types.py12-82

Rule 类

Rule 类定义了如何匹配和修正特定的命令错误

  • 每个规则都有一个 `match` 函数,用于确定它是否适用于某个命令
  • 如果匹配,则 `get_new_command` 函数生成修正后的命令
  • 规则具有优先级值,决定建议命令的顺序
  • 规则在选择修正时可以指定要运行的副作用

来源: thefuck/types.py85-198

CorrectedCommand 类

CorrectedCommand 类代表一个命令建议

  • 包含修正后的命令文本(script
  • 具有用于排序建议的优先级值
  • 包含选中时执行的可选副作用
  • 具有 `run` 方法来执行修正后的命令

来源: thefuck/types.py201-262

流水线阶段

1. 命令创建

当用户输入错误命令并调用 TheFuck 时,会创建一个 `Command` 对象来表示失败的命令

来源: thefuck/types.py67-82 thefuck/utils.py335-347

2. 规则加载

规则从多个来源加载

来源: thefuck/corrector.py8-49

规则加载过程

  1. 获取所有规则来源(捆绑的、用户定义的、第三方)的路径
  2. 查找这些路径下的所有 `.py` 文件
  3. 将每个文件加载为一个规则模块
  4. 为每个有效的模块创建一个 `Rule` 对象
  5. 根据设置过滤掉禁用的规则
  6. 按优先级对规则进行排序

3. 命令匹配

调用每个规则的 `is_match` 方法来确定它是否适用于该命令

来源: thefuck/types.py168-184

4. 命令生成

对于每个匹配的规则,调用 `get_corrected_commands` 来生成命令建议

来源: thefuck/types.py185-198

5. 命令组织

生成的命令会经过组织(去重和排序)

来源: thefuck/corrector.py52-78

组织过程

  1. 第一个匹配的命令立即返回
  2. 剩余命令中重复的命令被移除
  3. 剩余命令按优先级排序
  4. 每个排序后的命令按顺序返回

命令修正序列

命令修正的完整序列

来源: thefuck/types.py12-262 thefuck/corrector.py1-92

集成点

规则可扩展性

该管道设计为可通过自定义规则进行扩展

  • 规则是简单的 Python 模块,包含 `match` 和 `get_new_command` 函数
  • 无需修改核心代码,即可将新规则添加到用户的规则目录中
  • 第三方包可以提供额外的规则

来源: thefuck/corrector.py22-37

输出处理

该管道与输出处理系统集成,以确定命令出了什么问题

  • 命令捕获 shell 输出供规则分析
  • 规则可以检查命令和输出以确定匹配项
  • 有关输出处理的更多详细信息,请参阅 输出处理

来源: thefuck/types.py67-82

关键实现细节

规则优先级

规则具有优先级值,用于确定哪个修正命令先出现

优先级来源描述
默认优先级基础优先级值 (1000)
规则定义在规则模块中设置的优先级
设置用户在设置中定义的优先级
位置对于来自同一规则的多个修正

修正的最终优先级为: `(position + 1) * rule_priority`

来源: thefuck/types.py147-153 thefuck/types.py195-198

缓存和性能

为提高性能,TheFuck 实现了多种缓存机制

  • `@memoize` 装饰器在内存中缓存函数结果
  • `@cache` 装饰器在运行之间持久化缓存
  • 规则加载每会话只发生一次

来源: thefuck/utils.py25-45 thefuck/utils.py271-294

结论

命令修正管道是 TheFuck 功能的核心。它接收一个失败的命令,将其与适用的规则进行匹配,生成修正后的命令,按优先级排序,然后呈现给用户。这种管道设计通过自定义规则实现了高度的可扩展性,同时保持了一致的用户体验。