➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
➜ fuck
sudo apt-get install vim [enter/↑/↓/ctrl+c]
[sudo] password for nvbn:
Reading package lists... Done
...
➜ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
➜ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...
➜ puthon
No command 'puthon' found, did you mean:
Command 'python' from package 'python-minimal' (main)
Command 'python' from package 'python3' (main)
zsh: command not found: puthon
➜ fuck
python [enter/↑/↓/ctrl+c]
Python 3.4.2 (default, Oct 8 2014, 13:08:17)
...
➜ git brnch
git: 'brnch' is not a git command. See 'git --help'.
Did you mean this?
branch
➜ fuck
git branch [enter/↑/↓/ctrl+c]
* master
➜ lein rpl
'rpl' is not a task. See 'lein help'.
Did you mean this?
repl
➜ fuck
lein repl [enter/↑/↓/ctrl+c]
nREPL server started on port 54848 on host 127.0.0.1 - nrepl://127.0.0.1:54848
REPL-y 0.3.1
...
如果您不害怕盲目地运行已更正的命令, 则可以禁用require_confirmation
设置选项,让fuck自动帮您运行更正的命令:
➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
➜ fuck
sudo apt-get install vim
[sudo] password for nvbn:
Reading package lists... Done
...
环境要求
- python (3.4+)
- pip
- python-dev
安装
在OS X上,您可以通过Homebrew(或在Linux上通过Linuxbrew)安装The Fuck:
在Ubuntu / Mint上,使用以下命令安装The Fuck:
在FreeBSD上,使用以下命令安装The Fuck:
在Chrome操作系统上,使用chromebrew通过以下命令安装The Fuck:
在其他系统上, 使用来安装The Fuck
或者,您可以使用OS软件包管理器(OS X,Ubuntu,Arch)。
其中 chcp.com 65001 只有在windows环境下才需要运行。
Zsh:
其他的可见:
https://github.com/nvbn/thefuck/wiki/Shell-aliases
要在不进行确认的情况下运行固定命令,请使用
要递归修复命令直到成功,请使用以下
注意:别名功能在The Fuck的v1.34中已更改
下面是简单的 sudo 规则示例:
如果命令运行结果出现 permission denied 或者 EACCES,则执行 sudo xxx.
此外,还可以配置side_effect,如果你配置了enabled_by_default = True,side_effect函数内的操作将会被执行。
或通过环境变量:
目前,即时模式仅支持bash或zsh的Python 3。还必须禁用zsh的自动更正功能,以使其正常工作。
要启用即时模式,添加
brew install thefuck
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
sudo pip3 install thefuck
pkg install thefuck
crew install thefuck
pip
:
pip install thefuck
配置
接下来需要把这个命令写入到.bash_profile
, .bashrc
,.zshrc
等启动脚本中。
根据你的终端类型,运行相应的命令即可:
Bash
chcp.com 65001 eval "$(thefuck --alias)"
eval "$(thefuck --alias)"
--yeah
选项(或者-y
简称,或者--hard
如果您特别沮丧):
fuck --yeah
-r
选项:
fuck -r
更新中
pip3 install thefuck --upgrade
这个怎么运作
Fuck尝试将前一个命令与规则匹配。如果找到匹配项,则使用匹配的规则创建一个新命令并执行。默认情况下启用以下规则:adb_unknown_command
–修复类似拼写错误的命令adb logcta
;ag_literal
-增加了-Q
对ag
建议的时候;aws_cli
–修复类似拼写错误的命令aws dynamdb scan
;az_cli
–修复类似拼写错误的命令az providers
;cargo
–运行cargo build
代替cargo
;cargo_no_command
–修复错误命令,例如cargo buid
;cat_dir
-替换cat
用ls
当您尝试cat
目录;cd_correction
–拼写检查和纠正失败的cd命令;cd_mkdir
–在进入目录之前创建目录;cd_parent
–更改cd..
为cd ..
;chmod_x
–增加执行位;choco_install
–附加巧克力包装的通用后缀;composer_not_command
–修正了作曲家的命令名称;cp_create_destination
-创建一个新的目录当您尝试cp
或mv
到一个不存在的一个cp_omitting_directory
–-a
在cp
目录中添加;cpp11
–-std=c++11
向g++
或添加缺失clang++
;dirty_untar
–修复tar x
了当前目录中未解压缩的命令;dirty_unzip
–修复unzip
了在当前目录中解压缩的命令;django_south_ghost
–--delete-ghost-migrations
因鬼魂django向南迁移而增加失败;django_south_merge
–增加--merge
了不一致的django南迁徙;docker_login
–执行docker login
并重复上一个命令;docker_not_command
–修复了错误的docker命令,如docker tags
;docker_image_being_used_by_container
‐在移除图像之前先移除使用图像的容器;dry
–修复类似的重复git git push
;fab_command_not_found
–修复拼写错误的结构命令;fix_alt_space
–用空格字符代替Alt + Space;fix_file
–打开您的错误文件$EDITOR
;gem_unknown_command
–修正错误的gem
命令;git_add
–修复了“ pathspec’foo’与git已知的任何文件都不匹配。” ;git_add_force
-添加--force
到git add <pathspec>...
当路径.gitignore’d;git_bisect_usage
-修复git bisect strt
,git bisect goood
,git bisect rset
,平分时等;git_branch_delete
–更改git branch -d
为git branch -D
;git_branch_delete_checked_out
-变化git branch -d
给git checkout master && git branch -D
试图删除已签出分支的时候;git_branch_exists
– offergit branch -d foo
,git branch -D foo
或git checkout foo
在创建已经存在的分支时;git_branch_list
–git branch list
代替git branch
并删除创建的分支;git_checkout
–修改分支名称或创建新分支;git_clone_git_clone
–替换git clone git clone ...
为git clone ...
git_commit_amend
–git commit --amend
先前提交后的报价;git_commit_reset
–git reset HEAD~
先前提交后的报价;git_diff_no_index
–添加--no-index
到以前git diff
的未跟踪文件上;git_diff_staged
–添加--staged
到前一个git diff
具有意外输出;git_fix_stash
–修复git stash
命令(拼写错误的子命令和missingsave
);git_flag_after_filename
–修复fatal: bad flag '...' after filename
git_help_aliased
–修复git help <alias>
用别名命令替换的命令;git_hook_bypass
-增加--no-verify
标志之前的git am
,git commit
或git push
命令;git_lfs_mistype
–修正输入错误的git lfs <command>
命令;git_merge
–将远程名称添加到分支名称;git_merge_unrelated
–--allow-unrelated-histories
必要时添加git_not_command
–修复错误的git命令,如git brnch
;git_pull
–在执行上一个之前设置上游git pull
;git_pull_clone
–在仓库不存在时克隆而不是拉取;git_pull_uncommitted_changes
–在拉动之前隐藏更改,然后将其弹出;git_push
–添加--set-upstream origin $branch
到以前的失败git push
;git_push_different_branch_names
–修复本地分支名称与远程分支名称不匹配时的推送;git_push_pull
–git pull
在push
被拒绝时运行;git_push_without_commits
–在创建git add .
新项目时,如果您忘记并且仅创建一个初始提交;git_rebase_no_changes
–运行git rebase --skip
而不是git rebase --continue
没有更改时;git_remote_delete
–替换git remote delete remote_name
为git remote remove remote_name
;git_rm_local_modifications
–添加-f
或--cached
尝试添加到rm
本地修改的文件;git_rm_recursive
–-r
尝试访问rm
目录时添加;git_rm_staged
–添加-f
或--cached
当您尝试对rm
文件进行分阶段更改时git_rebase_merge_dir
–在进行重新设置基准时提供git rebase (--continue | --abort | --skip)
或删除.git/rebase-merge
目录;git_remote_seturl_add
-运行git remote add
时git remote set_url
不存在的遥控器上;git_stash
–在重新建立基础或转移分支之前存储本地修改;git_stash_pop
–在弹出存储区之前添加您的本地修改,然后重置;git_tag_force
-增加了--force
对git tag <tagname>
当标签已经存在;git_two_dashes
–给诸如git commit -amend
或的命令添加破折号git rebase -continue
。go_run
–.go
在编译/运行Go程序时附加扩展名;go_unknown_command
–修复错误的go
命令,例如go bulid
;gradle_no_task
–修复未找到的gradle
任务或模棱两可的任务;gradle_wrapper
–替换gradle
为./gradlew
;grep_arguments_order
–修复grep
类似情况的参数顺序grep -lir . test
;grep_recursive
–-r
尝试grep
目录时添加;grunt_task_not_found
–修复拼写错误的grunt
命令;gulp_not_task
–修复拼写错误的gulp
任务;has_exists_script
–./
在脚本/二进制文件存在时开始;heroku_multiple_apps
–添加--app <app>
到heroku
类似命令heroku pg
;heroku_not_command
–修复错误的heroku
命令,例如heroku log
;history
–尝试用历史记录中最相似的命令替换命令;hostscli
–试图解决hostscli
用法问题;ifconfig_device_not_found
-修正错误的设备名称,如wlan0
到wlp2s0
;java
–.java
在运行Java程序时删除扩展名;javac
–.java
编译Java文件时追加缺少的内容;lein_not_task
–修复错误的lein
任务,例如lein rpl
;long_form_help
-改变-h
到--help
时不支持缩写形式ln_no_hard_link
–在目录上捕获硬链接创建,建议符号链接;ln_s_order
–确定ln -s
参数顺序;ls_all
-添加-A
到ls
时输出是空的;ls_lah
–添加-lah
到ls
;man
–更改手册部分;man_no_space
–例如mandiff
,修复无空格的man命令;mercurial
–修正错误的hg
命令;missing_space_before_subcommand
–修复缺少空格的命令,如npminstall
;mkdir_p
–-p
当您尝试创建没有父目录的目录时添加;mvn_no_command
–添加clean package
到mvn
;mvn_unknown_lifecycle_phase
–修复拼写错误的生命周期阶段mvn
;npm_missing_script
–修复npm
自定义脚本名称npm run-script <script>
;npm_run_script
–增加run-script
自定义npm
脚本的缺失;npm_wrong_command
–修复错误的npm命令,如npm urgrade
;no_command
–修复错误的控制台命令,例如vom/vim
;no_such_file
–使用mv
和cp
命令创建丢失的目录;open
–要么在http://
传递给的地址之前添加地址,open
要么创建一个新的文件或目录,然后将其传递给open
;pip_install
–通过在必要时pip install
添加--user
或添加前缀来解决命令的权限问题sudo
;pip_unknown_command
–修复错误的pip
命令,例如pip instatl/pip install
;php_s
–尝试运行本地php服务器时替换-s
为-S
;port_already_in_use
–杀死绑定端口的进程;prove_recursively
–-r
用目录调用时添加;pyenv_no_such_command
–修复错误的pyenv命令,例如pyenv isntall
或pyenv list
;python_command
–python
当您尝试运行不可执行/没有./
python脚本时准备;python_execute
–.py
执行Python文件时追加缺少的内容;quotation_marks
-修正的不均用法'
和"
含有当ARGS’;path_from_history
–用与历史记录相似的绝对路径替换未找到的路径;react_native_command_unrecognized
–修复无法识别的react-native
命令;remove_shell_prompt_literal
–删除$
从文档复制命令时常见的前导外壳提示符号;remove_trailing_cedilla
–删除尾随的小提琴ç
,这是欧洲键盘布局的常见错字;rm_dir
–-rf
当您尝试删除目录时添加;scm_correction
-修正错误的SCM喜欢hg log
到git log
;sed_unterminated_s
–在sed
的s
命令中添加缺少的“ /” ;sl_ls
–更改sl
为ls
;ssh_known_hosts
–从known_hosts
警告中删除主机;sudo
–sudo
如果由于权限失败而在前一个命令之前添加;sudo_command_from_user_path
-运行来自用户的命令$PATH
以sudo
;switch_lang
–将命令从您的本地布局切换到en;systemctl
–正确订购混乱的参数systemctl
;terraform_init.py
–terraform init
在计划或应用之前运行;test.py
–运行py.test
代替test.py
;touch
–在“接触”之前创建丢失的目录;tsuru_login
–tsuru login
如果未通过身份验证或会话过期,则运行;tsuru_not_command
–修复错误的tsuru
命令,例如tsuru shell
;tmux
–修复tmux
命令;unknown_command
–修复了hadoop hdfs样式的“未知命令”,例如在上的命令中添加了丢失的“-”hdfs dfs ls
;unsudo
–sudo
如果进程拒绝以超级用户特权运行,则从上一个命令中删除。vagrant_up
–启动无业游民的实例;whois
–修复whois
命令;workon_doesnt_exists
–修复了virtualenvwrapper
os建议创建新的env名称的问题。yarn_alias
–修复yarn
类似别名的命令yarn ls
;yarn_command_not_found
–修复拼写错误的yarn
命令;yarn_command_replaced
–修复了替换的yarn
命令;yarn_help
–使打开yarn
文件更加容易;
apt_get
–如果未安装,则从apt安装应用(需要python-commandnotfound
/python3-commandnotfound
);apt_get_search
–更改尝试使用搜索进行apt-get
搜索apt-cache
;apt_invalid_operation
–修复无效apt
和apt-get
呼叫,例如apt-get isntall vim
;apt_list_upgradable
–帮助您apt list --upgradable
追赶apt update
;apt_upgrade
–帮助您apt upgrade
追赶apt list --upgradable
;brew_cask_dependency
–安装桶依赖关系;brew_install
–固定公式名称brew install
;brew_reinstall
-转brew install <formula>
成brew reinstall <formula>
;brew_link
–--overwrite --dry-run
链接失败时添加;brew_uninstall
-增加了--force
对brew uninstall
是否已安装了多个版本;brew_unknown_command
–修复错误的冲煮命令,例如brew docto/brew doctor
;brew_update_formula
-转brew update <formula>
成brew upgrade <formula>
;dnf_no_such_command
–修正了错误键入的DNF命令;nixos_cmd_not_found
–在NixOS上安装应用;pacman
–与pacman
未安装的应用一起安装(使用yay
或yaourt
可用);pacman_invalid_option
–pacman
用大写字母替换小写字母选项。pacman_not_found
-与修复包的名称pacman
,yay
或yaourt
。yum_invalid_operation
–修复无效的yum
呼叫,例如yum isntall vim
;
git_push_force
–增加--force-with-lease
了git push
(可能与冲突git_push_pull
);rm_root
–添加--no-preserve-root
到rm -rf /
命令。
创建自己的规则
要添加自己的规则,在~/.config/thefuck/rules
创建一个文件名为your-rule-name.py
的规则文件,必须包含两个函数:
match(command: Command) -> bool get_new_command(command: Command) -> str | list[str]
def match(command): return ('permission denied' in command.output.lower() or 'EACCES' in command.output) def get_new_command(command): return 'sudo {}'.format(command.script) # Optional: enabled_by_default = True def side_effect(command, fixed_command): subprocess.call('chmod 777 .', shell=True) priority = 1000 # Lower first, default is 1000 requires_output = True
设定值
可以在文件中更改几个Fuck参数$XDG_CONFIG_HOME/thefuck/settings.py
($XDG_CONFIG_HOME
默认为~/.config
):
rules
–默认情况下已启用规则的列表thefuck.const.DEFAULT_RULES
;exclude_rules
–默认情况下禁用的规则列表[]
;require_confirmation
–默认情况下True
,在运行新命令之前需要确认;wait_command
–获取先前命令输出的最长时间(以秒为单位);no_colors
–禁用彩色输出;priority
–具有规则优先级的字典,具有较低优先级的规则priority
将首先匹配;debug
–默认情况下启用调试输出False
;history_limit
–将扫描多少个历史命令的数值,例如2000
;alter_history
–默认情况下True
,将固定命令推送到历史记录;wait_slow_command
–如果先前的命令输出在slow_commands
列表中,则以秒为单位的最长时间;slow_commands
–慢速命令列表;num_close_matches
–默认情况下建议的最大匹配数3
。
settings.py
:
rules = ['sudo', 'no_command']
exclude_rules = ['git_push']
require_confirmation = True
wait_command = 10
no_colors = False
priority = {'sudo': 100, 'no_command': 9999}
debug = False
history_limit = 9999
wait_slow_command = 20
slow_commands = ['react-native', 'gradle']
num_close_matches = 5
THEFUCK_RULES
–启用的规则列表,例如DEFAULT_RULES:rm_root
或sudo:no_command
;THEFUCK_EXCLUDE_RULES
–禁用规则列表,例如git_pull:git_push
;THEFUCK_REQUIRE_CONFIRMATION
–在运行新命令之前需要确认true/false
;THEFUCK_WAIT_COMMAND
–获取先前命令输出的最长时间(以秒为单位);THEFUCK_NO_COLORS
–禁用彩色输出true/false
;THEFUCK_PRIORITY
–规则的优先级,例如no_command=9999:apt_get=100
,优先级较低的规则priority
将首先匹配;THEFUCK_DEBUG
–启用调试输出true/false
;THEFUCK_HISTORY_LIMIT
–将扫描多少个历史命令,例如2000
;THEFUCK_ALTER_HISTORY
–将固定命令推向历史true/false
;THEFUCK_WAIT_SLOW_COMMAND
–如果先前的命令输出在slow_commands
列表中,则以秒为单位的最长时间;THEFUCK_SLOW_COMMANDS
–慢速命令列表,例如lein:gradle
;THEFUCK_NUM_CLOSE_MATCHES
–建议的接近匹配的最大数量,例如5
。
export THEFUCK_RULES='sudo:no_command'
export THEFUCK_EXCLUDE_RULES='git_pull:git_push'
export THEFUCK_REQUIRE_CONFIRMATION='true'
export THEFUCK_WAIT_COMMAND=10
export THEFUCK_NO_COLORS='false'
export THEFUCK_PRIORITY='no_command=9999:apt_get=100'
export THEFUCK_HISTORY_LIMIT='2000'
export THEFUCK_NUM_CLOSE_MATCHES='5'
具有规则的第三方软件包
如果您想制定一组特定的非公共规则,但仍想与其他人共享,请创建一个thefuck_contrib_*
具有以下结构的包:
thefuck_contrib_foo
thefuck_contrib_foo
rules
__init__.py
*third-party rules*
__init__.py
*third-party-utils*
setup.py
Fuck将找到位于rules
模块中的规则。
实验即时模式
The Fuck的默认行为需要时间来重新运行以前的命令。在即时模式下,The Fuck通过使用script记录输出,然后读取日志来节省时间。--enable-experimental-instant-mode
到别名初始化.bashrc
,.bash_profile
或.zshrc
。
例如:
eval $(thefuck --alias --enable-experimental-instant-mode)