Package: thefuck
The Fuckis a magnificent app, inspired by a
[@liamosaur](https://twitter.com/liamosaur/)tweet,
that corrects errors in previous console commands.IsThe Fucktoo slow?Try the experimental instant
mode!More examples:➜apt-getinstallvimE:Couldnotopenlockfile/var/lib/dpkg/lock-open(13:Permissiondenied)E:Unabletolocktheadministrationdirectory(/var/lib/dpkg/),areyouroot?➜fucksudoapt-getinstallvim[enter/↑/↓/ctrl+c][sudo]passwordfornvbn:Readingpackagelists...Done...➜gitpushfatal:Thecurrentbranchmasterhasnoupstreambranch.Topushthecurrentbranchandsettheremoteasupstream,usegitpush--set-upstreamoriginmaster➜fuckgitpush--set-upstreamoriginmaster[enter/↑/↓/ctrl+c]Countingobjects:9,done....➜puthonNocommand'puthon'found,didyoumean:Command'python'frompackage'python-minimal'(main)Command'python'frompackage'python3'(main)zsh:commandnotfound:puthon➜fuckpython[enter/↑/↓/ctrl+c]Python3.4.2(default,Oct82014,13:08:17)...➜gitbrnchgit:'brnch'isnotagitcommand.See'git --help'.Didyoumeanthis?branch➜fuckgitbranch[enter/↑/↓/ctrl+c]*master➜leinrpl'rpl'isnotatask.See'lein help'.Didyoumeanthis?repl➜fuckleinrepl[enter/↑/↓/ctrl+c]nREPLserverstartedonport54848onhost127.0.0.1-nrepl://127.0.0.1:54848REPL-y0.3.1...If you’re not afraid of blindly running corrected commands, therequire_confirmationsettingsoption can be
disabled:➜apt-getinstallvimE:Couldnotopenlockfile/var/lib/dpkg/lock-open(13:Permissiondenied)E:Unabletolocktheadministrationdirectory(/var/lib/dpkg/),areyouroot?➜fucksudoapt-getinstallvim[sudo]passwordfornvbn:Readingpackagelists...Done...ContentsRequirementsInstallationsUpdatingHow it worksCreating your own rulesSettingsThird party packages with
rulesExperimental instant modeDevelopingLicenseRequirementspython (3.4+)pippython-devBack to ContentsInstallationOn macOS or Linux, you can installThe FuckviaHomebrew:brewinstallthefuckOn Ubuntu / Mint, installThe Fuckwith the following commands:sudoaptupdatesudoaptinstallpython3-devpython3-pippython3-setuptoolspip3installthefuck--userOn FreeBSD, installThe Fuckwith the following commands:pkginstallthefuckOn ChromeOS, installThe Fuckusingchromebrewwith the
following command:crewinstallthefuckOn other systems, installThe Fuckby usingpip:pipinstallthefuckAlternatively, you may use an OS package manager (OS X, Ubuntu,
Arch).# It is recommended that you place this command in your.bash_profile,.bashrc,.zshrcor other startup script:eval$(thefuck--alias)# You can use whatever you want as an alias, like for Mondays:eval$(thefuck--aliasFUCK)Or in your shell config (Bash, Zsh, Fish, Powershell,
tcsh).Changes are only available in a new shell session. To make changes
immediately available, runsource~/.bashrc(or your shell config
file like.zshrc).To run fixed commands without confirmation, use the--yeahoption
(or just-yfor short, or--hardif you’re especially
frustrated):fuck--yeahTo fix commands recursively until succeeding, use the-roption:fuck-rBack to ContentsUpdatingpip3installthefuck--upgradeNote: Alias functionality was changed in v1.34 of The FuckUninstallTo removeThe Fuck, reverse the installation process: - erase or
commentthefuckalias line from your Bash, Zsh, Fish, Powershell,
tcsh, … shell config - use your package manager (brew, pip3, pkg, crew,
pip) to uninstall the binariesHow it worksThe Fuckattempts 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_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‐ 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-dfoo,git branch-Dfooorgit 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_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-upstreamorigin $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 innpmrun-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.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;Back to ContentsThe 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-getisntall 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;The following commands are bundled withThe 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.Back to ContentsCreating your own rulesTo add your own rule, create a file namedyour-rule-name.pyin~/.config/thefuck/rules. The rule file must contain two functions:match(command:Command)->boolget_new_command(command:Command)->str|list[str]Additionally, rules can contain optional functions:side_effect(old_command:Command,fixed_command:str)->NoneRules can also contain the optional variablesenabled_by_default,requires_outputandpriority.Commandhas three attributes:script,outputandscript_parts. Your rule should not changeCommand.Rules api changed in 3.0:To access a rule’s settings, import it
withfrom thefuck.conf import settingssettingsis a special object assembled from~/.config/thefuck/settings.py, and values from env (see more
below).A simple example rule for running a script withsudo:defmatch(command):return('permission denied'incommand.output.lower()or'EACCES'incommand.output)defget_new_command(command):return'sudo{}'.format(command.script)# Optional:enabled_by_default=Truedefside_effect(command,fixed_command):subprocess.call('chmod 777 .',shell=True)priority=1000# Lower first, default is 1000requires_output=TrueMore examples of
rules,utility functions for
rules,app/os-specific
helpers.Back to ContentsSettingsSeveralThe Fuckparameters can be changed in the file$XDG_CONFIG_HOME/thefuck/settings.py($XDG_CONFIG_HOMEdefaults
to~/.config):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[].An example ofsettings.py:rules=['sudo','no_command']exclude_rules=['git_push']require_confirmation=Truewait_command=10no_colors=Falsepriority={'sudo':100,'no_command':9999}debug=Falsehistory_limit=9999wait_slow_command=20slow_commands=['react-native','gradle']num_close_matches=5Or 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– 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[].For example:exportTHEFUCK_RULES='sudo:no_command'exportTHEFUCK_EXCLUDE_RULES='git_pull:git_push'exportTHEFUCK_REQUIRE_CONFIRMATION='true'exportTHEFUCK_WAIT_COMMAND=10exportTHEFUCK_NO_COLORS='false'exportTHEFUCK_PRIORITY='no_command=9999:apt_get=100'exportTHEFUCK_HISTORY_LIMIT='2000'exportTHEFUCK_NUM_CLOSE_MATCHES='5'Back to ContentsThird-party packages with rulesIf you’d like to make a specific set of non-public rules, but would
still like to share them with others, create a package namedthefuck_contrib_*with the following structure:thefuck_contrib_foo
  thefuck_contrib_foo
    rules
      __init__.py
      *third-party rules*
    __init__.py
    *third-party-utils*
  setup.pyThe Fuckwill find rules located in therulesmodule.Back to ContentsExperimental instant modeThe default behavior ofThe Fuckrequires time to re-run previous
commands. When in instant mode,The Fucksaves time by logging output
withscript, 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-modeto
the alias initialization in.bashrc,.bash_profileor.zshrc.For example:eval$(thefuck--alias--enable-experimental-instant-mode)Back to ContentsDevelopingSeeCONTRIBUTING.mdLicense MITProject License can be foundhere.Back to Contents