TheFuck 使用 shell 别名作为其主要的集成机制,允许用户通过一个简单的别名如 fuck 来调用命令更正。本页面解释了 shell 别名在不同 shell 环境中的实现方式、如何配置它们以及它们与核心更正系统的交互方式。
有关整体 shell 集成架构的信息,请参阅 Shell 集成。
TheFuck 中的 Shell 别名使用户能够通过一个简单的命令(通常是 fuck)来调用更正系统。当执行此别名时,它会捕获上一个失败的命令,通过 TheFuck 的规则系统进行处理,并建议或自动应用更正。
来源: thefuck/shells/generic.py38-40 thefuck/shells/bash.py14-35 thefuck/shells/zsh.py15-38 thefuck/shells/fish.py51-66
TheFuck 实现了 Shell 不敏感的方法,并带有特定于 Shell 的实现。别名系统结构如下:
来源: thefuck/shells/generic.py16-155 thefuck/shells/bash.py11-92 thefuck/shells/zsh.py12-96 thefuck/shells/fish.py40-129 thefuck/shells/tcsh.py8-44
每个受支持的 Shell 都有定制的别名函数实现,以匹配其语法和功能。
Bash 实现创建了一个函数,该函数
function alias_name() {
TF_PYTHONIOENCODING=$PYTHONIOENCODING;
export TF_SHELL=bash;
export TF_ALIAS=alias_name;
export TF_SHELL_ALIASES=$(alias);
export TF_HISTORY=$(fc -ln -10);
export PYTHONIOENCODING=utf-8;
TF_CMD=$(thefuck ARGUMENT_PLACEHOLDER "$@") && eval "$TF_CMD";
unset TF_HISTORY;
export PYTHONIOENCODING=$TF_PYTHONIOENCODING;
history -s $TF_CMD; # Only if alter_history is enabled
}
来源: thefuck/shells/bash.py14-35
Zsh 实现与 Bash 类似,但使用了 Zsh 特定的语法。
alias_name () {
TF_PYTHONIOENCODING=$PYTHONIOENCODING;
export TF_SHELL=zsh;
export TF_ALIAS=alias_name;
TF_SHELL_ALIASES=$(alias);
export TF_SHELL_ALIASES;
TF_HISTORY="$(fc -ln -10)";
export TF_HISTORY;
export PYTHONIOENCODING=utf-8;
TF_CMD=$(thefuck ARGUMENT_PLACEHOLDER $@) && eval $TF_CMD;
unset TF_HISTORY;
export PYTHONIOENCODING=$TF_PYTHONIOENCODING;
test -n "$TF_CMD" && print -s $TF_CMD # Only if alter_history is enabled
}
来源: thefuck/shells/zsh.py15-38
Fish 使用独特的函数定义语法。
function alias_name -d "Correct your previous console command"
set -l fucked_up_command $history[1]
env TF_SHELL=fish TF_ALIAS=alias_name PYTHONIOENCODING=utf-8 thefuck $fucked_up_command ARGUMENT_PLACEHOLDER $argv | read -l unfucked_command
if [ "$unfucked_command" != "" ]
eval $unfucked_command
# Only if alter_history is enabled:
builtin history delete --exact --case-sensitive -- $fucked_up_command
builtin history merge
end
end
来源: thefuck/shells/fish.py51-66
Tcsh 实现更简单。
alias alias_name 'setenv TF_SHELL tcsh && setenv TF_ALIAS alias_name && set fucked_cmd=`history -h 2 | head -n 1` && eval `thefuck ${fucked_cmd}`'
来源: thefuck/shells/tcsh.py11-14
别名实现设置了几个环境变量,为 TheFuck 提供上下文。
| 可变 | 目的 | 设置者 |
|---|---|---|
TF_SHELL | 标识当前 Shell | 所有 Shell |
TF_ALIAS | 别名的名称 | 所有 Shell |
TF_SHELL_ALIASES | 当前 Shell 别名 | Bash, Zsh |
TF_HISTORY | 最近的命令历史 | Bash, Zsh |
PYTHONIOENCODING | 确保正确的 Unicode 处理 | 所有 Shell |
来源: thefuck/shells/bash.py14-35 thefuck/shells/zsh.py15-38 thefuck/shells/fish.py51-66 thefuck/shells/tcsh.py11-14
当用户安装 TheFuck 并配置其 Shell 时,会发生以下顺序:
来源: README.md157-161 thefuck/shells/bash.py75-86 thefuck/shells/zsh.py86-90 thefuck/shells/fish.py103-107 thefuck/shells/tcsh.py35-39
默认安装方法是在 Shell 的配置文件中添加一个 eval 行。
这将创建一个名为 fuck 的别名。要使用不同的别名名称,
来源: README.md157-161
每个 Shell 使用特定的配置文件。
| Shell | 配置文件 | 重载命令 |
|---|---|---|
| Bash | ~/.bashrc 或 ~/.bash_profile | source ~/.bashrc |
| Zsh | ~/.zshrc | source ~/.zshrc |
| Fish | ~/.config/fish/config.fish | fish (重启) |
| Tcsh | ~/.tcshrc | tcsh (重启) |
来源: thefuck/shells/bash.py75-86 thefuck/shells/zsh.py86-90 thefuck/shells/fish.py103-107 thefuck/shells/tcsh.py35-39
TheFuck 中的 shell 别名执行几项关键功能:
来源: thefuck/shells/bash.py14-35 thefuck/shells/zsh.py15-38 thefuck/shells/fish.py51-66
如果启用了 alter_history 设置,别名还将更新 shell 的命令历史记录,以包含已更正的命令。这在不同 shell 中有所不同。
history -s $TF_CMDprint -s $TF_CMDbuiltin history delete 和 builtin history merge来源: thefuck/shells/bash.py34-35 thefuck/shells/zsh.py37-38 thefuck/shells/fish.py53-55
TheFuck 包含一种实验性的“即时模式”,通过以不同的方式记录输出来提高性能。
要启用即时模式,请在别名配置中添加 --enable-experimental-instant-mode
来源: thefuck/shells/bash.py37-54 thefuck/shells/zsh.py40-59 README.md526-542
TheFuck 在生成别名时会检测当前的 shell。每个 shell 实现还公开了以下方法:
get_aliases() 获取现有别名_expand_aliases() 扩展别名how_to_configure() 配置 shell这些机制允许 TheFuck 与不同的 shell 环境无缝集成,并正确处理特定于 shell 的行为。
来源: thefuck/shells/generic.py19-155 tests/shells/test_bash.py44-48 tests/shells/test_zsh.py43-48 tests/shells/test_fish.py63-77
Shell 别名构成了用户与 TheFuck 的纠正系统之间的核心接口。通过提供特定于 shell 的实现,TheFuck 确保了跨不同环境的兼容性,同时保持一致的用户体验。别名机制有效地捕获失败的命令,通过纠正系统进行处理,并以最少的用户努力应用修复。