The Fuck

The Fuck是一款很棒的应用程序,灵感来自@liamosaur推文,它可以纠正之前控制台命令中的错误
更多示例:
➜ 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
...
如果您不怕盲目运行更正后的命令,可以禁用REQUIRED_CONFIRMATION设置选项:
➜ 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
在MacOS上,您可以通过Homebrew(或Linux上的Linuxbrew)安装Fuck:
brew install thefuck
在Ubuntu/Mint上,使用以下命令安装Fuck:
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
sudo pip3 install thefuck
在FreeBSD上,使用以下命令安装Fuck:
pkg install thefuck
在ChromeOS上,使用以下命令使用chromebrew安装Fuck:
crew install thefuck
在其他系统上,使用pip安装Fuck:
pip install thefuck
或者,您也可以使用操作系统包管理器(OS X、Ubuntu、Arch)
#建议您将此命令放在.bash_profile、.bashrc、.zshc或其他启动脚本中:
eval $(thefuck --alias)
# You can use whatever you want as an alias, like for Mondays:
eval $(thefuck --alias FUCK)
或者在您的shell配置中(bash、zsh、Fish、powershell、tcsh)
更改仅在新的shell会话中可用。要使更改立即可用,请运行source~/.bashrc(或您的shell配置文件,如.zshc)
要在没有确认的情况下运行已修复的命令,请使用–yes选项(或者简称为-y,如果您特别沮丧,则使用–hard):
fuck --yeah
要递归修复命令直到成功,请使用-r选项:
fuck -r
Back to Contents
卸载
pip3 install thefuck --upgrade
注意:别名功能在Fuck的1.34版中已更改
它是如何工作的
要删除,请颠倒安装过程:-从您的Bash、zsh、Fish、powershell、tcsh中删除或注释别名行。shell配置-使用软件包管理器(BREW、PIP3、pkg、Crew、pip)卸载二进制文件
创建您自己的规则
The Fuck 试图将前一条命令与规则相匹配。如果找到匹配项,则使用匹配的规则创建新命令并执行。默认情况下启用以下规则:
adb_unknown_command– fixes misspelled commands likeadb logcta;ag_literal– adds-Qtoagwhen suggested;aws_cli– fixes misspelled commands likeaws dynamdb scan;az_cli– fixes misspelled commands likeaz providers;cargo– runscargo buildinstead ofcargo;cargo_no_command– fixes wrongs commands likecargo buid;cat_dir– replacescatwithlswhen you try tocata directory;cd_correction– spellchecks and correct failed cd commands;cd_cs– changescstocd;cd_mkdir– creates directories before cd’ing into them;cd_parent– changescd..tocd ..;chmod_x– add execution bit;choco_install– append common suffixes for chocolatey packages;composer_not_command– fixes composer command name;conda_mistype– fixes conda commands;cp_create_destination– creates a new directory when you attempt tocpormvto a non existent onecp_omitting_directory– adds-awhen youcpdirectory;cpp11– adds missing-std=c++11tog++orclang++;dirty_untar– fixestar xcommand that untarred in the current directory;dirty_unzip– fixesunzipcommand that unzipped in the current directory;django_south_ghost– adds--delete-ghost-migrationsto failed because ghosts django south migration;django_south_merge– adds--mergeto inconsistent django south migration;docker_login– executes adocker loginand repeats the previous command;docker_not_command– fixes wrong docker commands likedocker tags;docker_image_being_used_by_container&dash removes the container that is using the image before removing the image;dry– fixes repetitions likegit git push;fab_command_not_found– fix misspelled fabric commands;fix_alt_space– replaces Alt+Space with Space character;fix_file– opens a file with an error in your$EDITOR;gem_unknown_command– fixes wronggemcommands;git_add– fixes “pathspec ‘foo’ did not match any file(s) known to git.”;git_add_force– adds--forcetogit add <pathspec>...when paths are .gitignore’d;git_bisect_usage– fixesgit bisect strt,git bisect goood,git bisect rset, etc. when bisecting;git_branch_delete– changesgit branch -dtogit branch -D;git_branch_delete_checked_out– changesgit branch -dtogit checkout master && git branch -Dwhen trying to delete a checked out branch;git_branch_exists– offersgit branch -d foo,git branch -D fooorgit checkout foowhen creating a branch that already exists;git_branch_list– catchesgit branch listin place ofgit branchand removes created branch;git_branch_flag_0_to_flag_dash_v– undoesgit branch 0vand runsgit branch -vin its place;git_checkout– fixes branch name or creates new branch;git_clone_git_clone– replacesgit clone git clone ...withgit clone ...git_commit_amend– offersgit commit --amendafter previous commit;git_commit_reset– offersgit reset HEAD~after previous commit;git_diff_no_index– adds--no-indexto previousgit diffon untracked files;git_diff_staged– adds--stagedto previousgit diffwith unexpected output;git_fix_stash– fixesgit stashcommands (misspelled subcommand and missingsave);git_flag_after_filename– fixesfatal: bad flag '...' after filenamegit_help_aliased– fixesgit help <alias>commands replacing with the aliased command;git_hook_bypass– adds--no-verifyflag previous togit am,git commit, orgit pushcommand;git_lfs_mistype– fixes mistypedgit lfs <command>commands;git_merge– adds remote to branch names;git_merge_unrelated– adds--allow-unrelated-historieswhen requiredgit_not_command– fixes wrong git commands likegit brnch;git_pull– sets upstream before executing previousgit pull;git_pull_clone– clones instead of pulling when the repo does not exist;git_pull_uncommitted_changes– stashes changes before pulling and pops them afterwards;git_push– adds--set-upstream origin $branchto previous failedgit push;git_push_different_branch_names– fixes pushes when local branch name does not match remote branch name;git_push_pull– runsgit pullwhenpushwas rejected;git_push_without_commits– Creates an initial commit if you forget and onlygit add ., when setting up a new project;git_rebase_no_changes– runsgit rebase --skipinstead ofgit rebase --continuewhen there are no changes;git_remote_delete– replacesgit remote delete remote_namewithgit remote remove remote_name;git_rm_local_modifications– adds-for--cachedwhen you try torma locally modified file;git_rm_recursive– adds-rwhen you try torma directory;git_rm_staged– adds-for--cachedwhen you try torma file with staged changesgit_rebase_merge_dir– offersgit rebase (--continue | --abort | --skip)or removing the.git/rebase-mergedir when a rebase is in progress;git_remote_seturl_add– runsgit remote addwhengit remote set_urlon nonexistent remote;git_stash– stashes your local modifications before rebasing or switching branch;git_stash_pop– adds your local modifications before popping stash, then resets;git_tag_force– adds--forcetogit tag <tagname>when the tag already exists;git_two_dashes– adds a missing dash to commands likegit commit -amendorgit rebase -continue;go_run– appends.goextension when compiling/running Go programs;go_unknown_command– fixes wronggocommands, for examplego bulid;gradle_no_task– fixes not found or ambiguousgradletask;gradle_wrapper– replacesgradlewith./gradlew;grep_arguments_order– fixesgreparguments order for situations likegrep -lir . test;grep_recursive– adds-rwhen you try togrepdirectory;grunt_task_not_found– fixes misspelledgruntcommands;gulp_not_task– fixes misspelledgulptasks;has_exists_script– prepends./when script/binary exists;heroku_multiple_apps– add--app <app>toherokucommands likeheroku pg;heroku_not_command– fixes wrongherokucommands likeheroku log;history– tries to replace command with the most similar command from history;hostscli– tries to fixhostscliusage;ifconfig_device_not_found– fixes wrong device names likewlan0towlp2s0;java– removes.javaextension when running Java programs;javac– appends missing.javawhen compiling Java files;lein_not_task– fixes wrongleintasks likelein rpl;long_form_help– changes-hto--helpwhen the short form version is not supportedln_no_hard_link– catches hard link creation on directories, suggest symbolic link;ln_s_order– fixesln -sarguments order;ls_all– adds-Atolswhen output is empty;ls_lah– adds-lahtols;man– changes manual section;man_no_space– fixes man commands without spaces, for examplemandiff;mercurial– fixes wronghgcommands;missing_space_before_subcommand– fixes command with missing space likenpminstall;mkdir_p– adds-pwhen you try to create a directory without a parent;mvn_no_command– addsclean packagetomvn;mvn_unknown_lifecycle_phase– fixes misspelled life cycle phases withmvn;npm_missing_script– fixesnpmcustom script name innpm run-script <script>;npm_run_script– adds missingrun-scriptfor customnpmscripts;npm_wrong_command– fixes wrong npm commands likenpm urgrade;no_command– fixes wrong console commands, for examplevom/vim;no_such_file– creates missing directories withmvandcpcommands;omnienv_no_such_command– fixes wrong commands forgoenv,nodenv,pyenvandrbenv(eg.:pyenv isntallorgoenv list);open– either prependshttp://to address passed toopenor create a new file or directory and passes it toopen;pip_install– fixes permission issues withpip installcommands by adding--useror prependingsudoif necessary;pip_unknown_command– fixes wrongpipcommands, for examplepip instatl/pip install;php_s– replaces-sby-Swhen trying to run a local php server;port_already_in_use– kills process that bound port;prove_recursively– adds-rwhen called with directory;python_command– prependspythonwhen you try to run non-executable/without./python script;python_execute– appends missing.pywhen executing Python files;python_module_error– fixes ModuleNotFoundError by trying topip installthat module;quotation_marks– fixes uneven usage of'and"when containing args’;path_from_history– replaces not found path with a similar absolute path from history;rails_migrations_pending– runs pending migrations;react_native_command_unrecognized– fixes unrecognizedreact-nativecommands;remove_shell_prompt_literal– remove leading shell prompt symbol$, common when copying commands from documentations;remove_trailing_cedilla– remove trailing cedillasç, a common typo for European keyboard layouts;rm_dir– adds-rfwhen you try to remove a directory;scm_correction– corrects wrong scm likehg logtogit log;sed_unterminated_s– adds missing ‘/’ tosed‘sscommands;sl_ls– changessltols;ssh_known_hosts– removes host fromknown_hostson warning;sudo– prependssudoto the previous command if it failed because of permissions;sudo_command_from_user_path– runs commands from users$PATHwithsudo;switch_lang– switches command from your local layout to en;systemctl– correctly orders parameters of confusingsystemctl;terraform_init.py– runterraform initbefore plan or apply;test.py– runspy.testinstead oftest.py;touch– creates missing directories before “touching”;tsuru_login– runstsuru loginif not authenticated or session expired;tsuru_not_command– fixes wrongtsurucommands liketsuru shell;tmux– fixestmuxcommands;unknown_command– fixes hadoop hdfs-style “unknown command”, for example adds missing ‘-‘ to the command onhdfs dfs ls;unsudo– removessudofrom previous command if a process refuses to run on superuser privilege.vagrant_up– starts up the vagrant instance;whois– fixeswhoiscommand;workon_doesnt_exists– fixesvirtualenvwrapperenv name os suggests to create new.yarn_alias– fixes aliasedyarncommands likeyarn ls;yarn_command_not_found– fixes misspelledyarncommands;yarn_command_replaced– fixes replacedyarncommands;yarn_help– makes it easier to openyarndocumentation;
Back to Contents
默认情况下,仅在特定平台上启用以下规则:
apt_get– installs app from apt if it not installed (requirespython-commandnotfound/python3-commandnotfound);apt_get_search– changes trying to search usingapt-getwith searching usingapt-cache;apt_invalid_operation– fixes invalidaptandapt-getcalls, likeapt-get isntall vim;apt_list_upgradable– helps you runapt list --upgradableafterapt update;apt_upgrade– helps you runapt upgradeafterapt list --upgradable;brew_cask_dependency– installs cask dependencies;brew_install– fixes formula name forbrew install;brew_reinstall– turnsbrew install <formula>intobrew reinstall <formula>;brew_link– adds--overwrite --dry-runif linking fails;brew_uninstall– adds--forcetobrew uninstallif multiple versions were installed;brew_unknown_command– fixes wrong brew commands, for examplebrew docto/brew doctor;brew_update_formula– turnsbrew update <formula>intobrew upgrade <formula>;dnf_no_such_command– fixes mistyped DNF commands;nixos_cmd_not_found– installs apps on NixOS;pacman– installs app withpacmanif it is not installed (usesyayoryaourtif available);pacman_invalid_option– replaces lowercasepacmanoptions with uppercase.pacman_not_found– fixes package name withpacman,yayoryaourt.yum_invalid_operation– fixes invalidyumcalls, likeyum isntall vim;
以下命令与Fuck捆绑在一起,但默认情况下不启用:
git_push_force– adds--force-with-leaseto agit push(may conflict withgit_push_pull);rm_root– adds--no-preserve-roottorm -rf /command.
设置
要添加您自己的规则,请在~/.config/TheMASH/Rules中创建一个名为your-Rule-name.py的文件。规则文件必须包含两个函数:
match(command: Command) -> bool
get_new_command(command: Command) -> str | list[str]
此外,规则可以包含可选函数:
side_effect(old_command: Command, fixed_command: str) -> None
规则还可以包含可选变量Enabled_by_Default、Requires_Output和Priority
命令有三个属性:script、output和script_part。您的规则不应更改命令
规则API在3.0中发生了更改:要访问规则的设置,请使用Fuck.conf导入设置将其导入
Settings是一个特殊的对象,它由~/.config/the妈的/settings.py和env中的值组合而成(参见下面的更多内容)
使用sudo运行脚本的一个简单示例规则:
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
更多规则示例、用于规则的实用程序函数、特定于应用程序/操作系统的帮助器
带规则的第三方包
可以在文件$XDG_CONFIG_HOME/the他妈的/settings.py($XDG_CONFIG_HOME默认为~/.config)中更改几个Fuck参数:
rules– list of enabled rules, by defaultthefuck.const.DEFAULT_RULES;exclude_rules– list of disabled rules, by default[];require_confirmation– requires confirmation before running new command, by defaultTrue;wait_command– the max amount of time in seconds for getting previous command output;no_colors– disable colored output;priority– dict with rules priorities, rule with lowerprioritywill be matched first;debug– enables debug output, by defaultFalse;history_limit– the numeric value of how many history commands will be scanned, like2000;alter_history– push fixed command to history, by defaultTrue;wait_slow_command– max amount of time in seconds for getting previous command output if it inslow_commandslist;slow_commands– list of slow commands;num_close_matches– the maximum number of close matches to suggest, by default3.excluded_search_path_prefixes– path prefixes to ignore when searching for commands, by default[].
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– list of enabled rules, likeDEFAULT_RULES:rm_rootorsudo:no_command;THEFUCK_EXCLUDE_RULES– list of disabled rules, likegit_pull:git_push;THEFUCK_REQUIRE_CONFIRMATION– require confirmation before running new command,true/false;THEFUCK_WAIT_COMMAND– the max amount of time in seconds for getting previous command output;THEFUCK_NO_COLORS– disable colored output,true/false;THEFUCK_PRIORITY– priority of the rules, likeno_command=9999:apt_get=100,
rule with lowerprioritywill be matched first;THEFUCK_DEBUG– enables debug output,true/false;THEFUCK_HISTORY_LIMIT– how many history commands will be scanned, like2000;THEFUCK_ALTER_HISTORY– push fixed command to historytrue/false;THEFUCK_WAIT_SLOW_COMMAND– the max amount of time in seconds for getting previous command output if it inslow_commandslist;THEFUCK_SLOW_COMMANDS– list of slow commands, likelein:gradle;THEFUCK_NUM_CLOSE_MATCHES– the maximum number of close matches to suggest, like5.THEFUCK_EXCLUDED_SEARCH_PATH_PREFIXES– path prefixes to ignore when searching for commands, by default[].
例如:
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'
Back to Contents
实验即时模式
如果您希望制定一组特定的非公共规则,但仍希望与其他人共享这些规则,请创建一个名为TheMASH_CONTRIB_*的包,其结构如下:
thefuck_contrib_foo
thefuck_contrib_foo
rules
__init__.py
*third-party rules*
__init__.py
*third-party-utils*
setup.py
操蛋将在规则模块中查找规则
Back to Contents
发展中
Fuck的默认行为需要时间来重新运行先前的命令。在即时模式下,Fuck通过使用脚本记录输出,然后读取日志来节省时间
目前,即时模式仅支持带有bash或zsh的Python3。为了正常工作,还需要禁用zsh的自动更正功能
要启用即时模式,请向.bashrc、.bash_profile或.zshc中的别名初始化添加–enable-explementation-instant-mode
请参阅CONTRIBUTING.md
eval $(thefuck --alias --enable-experimental-instant-mode)

