没错就是这么神奇,名字相当噶性,thefuck。当你命令输入错误不要怕,直接来一句fuck,自动纠正你输入的命令。
在你输入错误的命令的时候,忍俊不禁的想来一句fuck,没错你不仅可以嘴上说,命令里面可以可以来一下,他丫的就矫正了。
保证原汁原味,直接上原文。
这是库的地址https://github.com/nvbn/thefuck
The Fuck is a magnificent app, inspired by a @liamosaur tweet, that corrects errors in previous console commands.
Is The Fuck too slow? Try the experimental instant mode!
More examples:
➜ 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
...
If you're not afraid of blindly running corrected commands, the require_confirmation settings option can be disabled:
➜ 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
...
Requirements
- python (3.4+)
- pip
- python-dev
Installation
On OS X, you can install The Fuck via Homebrew (or via Linuxbrew on Linux):
brew install thefuck
On Ubuntu / Mint, install The Fuck with the following commands:
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
sudo pip3 install thefuck
On FreeBSD, install The Fuck with the following commands:
pkg install thefuck
On ChromeOS, install The Fuck using chromebrew with the following command:
crew install thefuck
On other systems, install The Fuck by using pip:
pip install thefuck
Alternatively, you may use an OS package manager (OS X, Ubuntu, Arch).
# It is recommended that you place this command in your .bash_profile, .bashrc, .zshrc or other startup script:
eval $(thefuck --alias)
# You can use whatever you want as an alias, like for Mondays:
eval $(thefuck --alias FUCK)
Or in your shell config (Bash, Zsh, Fish, Powershell, tcsh).
Changes are only available in a new shell session. To make changes immediately available, run source ~/.bashrc (or your shell config file like .zshrc).
To run fixed commands without confirmation, use the --yeah option (or just -y for short, or --hard if you're especially frustrated):
fuck --yeah
To fix commands recursively until succeeding, use the -r option:
fuck -r
Updating
pip3 install thefuck --upgrade
Note: Alias functionality was changed in v1.34 of The Fuck
How it works
The Fuck attempts to match the previous command with a rule. If a match is found, a new command is created using the matched rule and executed. The following rules are enabled by default:
-
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_mkdir– creates directories before cd'ing into them; -
cd_parent– changescd..tocd ..; -
chmod_x– add execution bit; -
composer_not_command– fixes composer command name; -
cp_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‐ 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_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_checkout– fixes branch name or creates new branch; -
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 filename -
git_help_aliased– fixesgit help <alias>commands replacing with the aliased command; -
git_merge– adds remote to branch names; -
git_merge_unrelated– adds--allow-unrelated-historieswhen required -
git_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 brach 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 changes -
git_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 nonexistant 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 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 supported -
ln_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 parent; -
mvn_no_command– addsclean packagetomvn; -
mvn_unknown_lifecycle_phase– fixes misspelled lifecycle 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; -
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; -
pyenv_no_such_command– fixes wrong pyenv commands likepyenv isntallorpyenv list; -
python_command– prependspythonwhen you try to run non-executable/without./python script; -
python_execute– appends missing.pywhen executing Python files; -
quotation_marks– fixes uneven usage of'and"when containing args'; -
path_from_history– replaces not found path with similar absolute path from history; -
react_native_command_unrecognized– fixes unrecognizedreact-nativecommands; -
remove_trailing_cedilla– remove trailling 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 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 super user 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;
The following rules are enabled by default on specific platforms only:
-
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_not_found– fixes package name withpacman,yayoryaourt. -
yum_invalid_operation– fixes invalidyumcalls, likeyum isntall vim;
The following commands are bundled with The Fuck, but are not enabled by default:
-
git_push_force– adds--force-with-leaseto agit push(may conflict withgit_push_pull); -
rm_root– adds--no-preserve-roottorm -rf /command.
Creating your own rules
To add your own rule, create a file named your-rule-name.py in ~/.config/thefuck/rules. The rule file must contain two functions:
match(command: Command) -> bool
get_new_command(command: Command) -> str | list[str]
Additionally, rules can contain optional functions:
side_effect(old_command: Command, fixed_command: str) -> None
Rules can also contain the optional variables enabled_by_default, requires_output and priority.
Command has three attributes: script, output and script_parts. Your rule should not change Command.
Rules api changed in 3.0: To access a rule's settings, import it with from thefuck.conf import settings
settings is a special object assembled from ~/.config/thefuck/settings.py, and values from env (see more below).
A simple example rule for running a script with 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
More examples of rules, utility functions for rules, app/os-specific helpers.
Settings
Several The Fuck parameters can be changed in the file $XDG_CONFIG_HOME/thefuck/settings.py ($XDG_CONFIG_HOME defaults to ~/.config):
-
rules– list of enabled rules, by defaultthefuck.conf.DEFAULT_RULES; -
exclude_rules– list of disabled rules, by default[]; -
require_confirmation– requires confirmation before running new command, by defaultTrue; -
wait_command– 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– 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– maximum number of close matches to suggest, by default3.
An example of 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
Or via environment variables:
-
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– 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– 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– maximum number of close matches to suggest, like5.
For example:
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'
Third-party packages with rules
If you'd like to make a specific set of non-public rules, but would still like to share them with others, create a package named thefuck_contrib_* with the following structure:
thefuck_contrib_foo
thefuck_contrib_foo
rules
__init__.py
*third-party rules*
__init__.py
*third-party-utils*
setup.py
The Fuck will find rules located in the rules module.
Experimental instant mode
The default behavior of The Fuck requires time to re-run previous commands. When in instant mode, The Fuck saves time by logging output with script, then reading the log.
Currently, instant mode only supports Python 3 with bash or zsh. zsh's autocorrect function also needs to be disabled in order for thefuck to work properly.
To enable instant mode, add --enable-experimental-instant-mode to the alias initialization in .bashrc, .bash_profile or .zshrc.
For example:
eval $(thefuck --alias --enable-experimental-instant-mode)
Developing
See CONTRIBUTING.md
License MIT
Project License can be found here.