Forked from 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!
The app seems to work fine on Python 3.13.X and on Python 3.14.X.
Warning
THIS SOFTWARE IS UNDER HEAVY PATCHING, USE IT AT YOUR OWN RISK.
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
- How to run the app
- How it works
- Creating your own rules
- Settings
- Experimental instant mode
- Developing
- License
- Python (3.12+)
- Install dependencies and install the package (editable mode is recommended while developing):
pip install -r requirements.txt
pip install -e .- Configure the shell alias (run in the shell you use):
eval "$(thefuck --alias)"- Trigger a fix by running a wrong command, then run:
fuck- Optional: verify the CLI is available:
thefuck --helpThe 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;brew_cask_dependency– installs Homebrew cask dependencies before retrying the command;cargo– runscargo buildinstead ofcargo;cargo_no_command– fixes wrong commands likecargo buid;cat_dir– replacescatwithlswhen you try tocata directory;cd_correction– spellchecks and corrects failed cd commands;cd_cs– changescstocd;cd_mkdir– creates directories before cd'ing into them;cd_parent– changescd..tocd ..;chmod_x– adds execution bit;choco_install– appends 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‐ removes the container that is using the image before removing the image;dry– fixes repetitions likegit git push;fab_command_not_found– fixes 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_0flag– fixes commands such asgit branch 0vandgit branch 0rremoving the created branch;git_checkout– fixes branch name or creates new branch;git_clone_git_clone– replacesgit clone git clone ...withgit clone ...git_clone_missing– addsgit cloneto URLs that appear to link to a git repository.git_commit_add– offersgit commit -a ...orgit commit -p ...after previous commit if it failed because nothing was staged;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_main_master– fixes incorrect branch name betweenmainandmastergit_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– adds--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 creates 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– removes leading shell prompt symbol$, common when copying commands from documentations;remove_trailing_cedilla– removes 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– runsterraform initbefore plan or apply;terraform_no_command.py– fixes unrecognizedterraformcommands;test.py– runspytestinstead 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.wrong_hyphen_before_subcommand– removes an improperly placed hyphen (apt-install->apt install,git-log->git log, etc.)yarn_alias– fixes aliasedyarncommands likeyarn ls;yarn_command_not_found– fixes misspelledyarncommands;yarn_command_replaced– fixes replacedyarncommands;yarn_help– makes it easier to openyarndocumentation;- Additional bundled rules include
apt_get_search,apt_invalid_operation,apt_list_upgradable,apt_upgrade,brew_install,brew_link,brew_reinstall,brew_uninstall,brew_unknown_command,brew_update_formula,dnf_no_such_command,git_push_force,nixos_cmd_not_found,pacman,pacman_invalid_option,pacman_not_found,rm_root, andyum_invalid_operation.
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]Optional functions and variables:
side_effect(old_command: Command, fixed_command: str) -> None
enabled_by_default
requires_output
priorityExample: prepend sudo on permission errors:
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)
enabled_by_default = True
priority = 1000
requires_output = TrueConfig file: $XDG_CONFIG_HOME/thefuck/settings.py ($XDG_CONFIG_HOME defaults to ~/.config):
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 = 5Or via environment variables:
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_ALTER_HISTORY='true'
export THEFUCK_WAIT_SLOW_COMMAND=20
export THEFUCK_SLOW_COMMANDS='lein:gradle'
export THEFUCK_NUM_CLOSE_MATCHES=5Instant mode logs output with script then reads the log, skipping slow re-runs. Supports Python 3.12 with bash or zsh. zsh autocorrect must be disabled.
Enable in .bashrc or .zshrc:
eval $(thefuck --alias --enable-experimental-instant-mode)See CONTRIBUTING.md
Project License can be found here.