Magnificent app which corrects your previous console command, inspired by a @liamosaur tweet.
Few 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 are not scared to blindly run the changed command, there is a require_confirmation settings option:
β 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 (2.7+ or 3.3+)
- pip
- python-dev
On Ubuntu and OS X you can install The Fuck with installation script:
wget -O - https://raw.githubusercontent.com/nvbn/thefuck/master/install.sh | sh - && $0Install The Fuck with pip:
sudo -H pip install thefuckOr using an OS package manager (OS X, Ubuntu, Arch).
You should 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 will be available only in a new shell session. To make them available immediately, run source ~/.bashrc (or your shell config file like .zshrc).
sudo pip install thefuck --upgradeAliases changed in 1.34.
The Fuck tries to match a rule for the previous command, creates a new command using the matched rule and runs it. Rules enabled by default are as follows:
cargoβ runscargo buildinstead ofcargo;cargo_no_commandβ fixes wrongs commands likecargo buid;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_not_commandβ fixes wrong docker commands likedocker tags;dryβ fixes repetitions likegit git push;fix_alt_spaceβ replaces Alt+Space with Space character;fix_fileβ opens a file with an error in your$EDITOR;git_addβ fixes "pathspec 'foo' did not match any file(s) known to git.";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_diff_stagedβ adds--stagedto previousgit diffwith unexpected output;git_fix_stashβ fixesgit stashcommands (misspelled subcommand and missingsave);git_help_aliasedβ fixesgit help <alias>commands replacing with the aliased command;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_pushβ adds--set-upstream origin $branchto previous failedgit push;git_push_pullβ runsgit pullwhenpushwas rejected;git_rm_recursiveβ adds-rwhen you try torma directory;git_remote_seturl_addβ runsgit remote addwhengit remote set_urlon nonexistant remote;git_stashβ stashes you local modifications before rebasing or switching branch;git_two_dashesβ adds a missing dash to commands likegit commit -amendorgit rebase -continue;go_runβ appends.goextension when compiling/running Go programs;grep_arguments_orderβ fixes grep arguments order for situations likegrep -lir . test;grep_recursiveβ adds-rwhen you trying togrepdirectory;gulp_not_taskβ fixes misspelledgulptasks;has_exists_scriptβ prepends./when script/binary exists;heroku_not_commandβ fixes wrongherokucommands likeheroku log;historyβ tries to replace command with most similar command from history;javaβ removes.javaextension when running Java programs;javacβ appends missing.javawhen compiling Java files;lein_not_taskβ fixes wrongleintasks likelein rpl;ln_no_hard_linkβ catches hard link creation on directories, suggest symbolic link;ls_lahβ adds-lahtols;manβ changes manual section;man_no_spaceβ fixes man commands without spaces, for examplemandiff;mercurialβ fixes wronghgcommands;mkdir_pβ adds-pwhen you trying to create directory without parent;mvn_no_commandβ addsclean packagetomvn;mvn_unknown_lifecycle_phaseβ fixes misspelled lifecycle phases withmvn;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β prependshttpto address passed toopen;pip_unknown_commandβ fixes wrongpipcommands, for examplepip instatl/pip install;python_commandβ prependspythonwhen you trying to run not executable/without./python script;python_executeβ appends missing.pywhen executing Python files;quotation_marksβ fixes uneven usage of'and"when containing args';rm_dirβ adds-rfwhen you trying to remove directory;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;switch_langβ switches command from your local layout to en;systemctlβ correctly orders parameters of confusingsystemctl;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;vagrant_upβ starts up the vagrant instance;whoisβ fixeswhoiscommand.
Enabled by default only on specific platforms:
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;brew_installβ fixes formula name forbrew install;brew_unknown_commandβ fixes wrong brew commands, for examplebrew docto/brew doctor;brew_upgradeβ appends--alltobrew upgradeas per Homebrew's new behaviour;pacmanβ installs app withpacmanif it is not installed (usesyaourtif available);pacman_not_foundβ fixes package name withpacmanoryaourt.
Bundled, but 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.
For adding your own rule you should create your-rule-name.py in ~/.config/thefuck/rules. The rule should contain two functions:
match(command: Command) -> bool get_new_command(command: Command) -> str | list[str]Also the rule can contain an optional function
side_effect(old_command: Command, fixed_command: str) -> Noneand optional enabled_by_default, requires_output and priority variables.
Command has three attributes: script, stdout and stderr.
Rules api changed in 3.0: For accessing settings in rule you need to import it with from thefuck.conf import settings. settings is a special object filled with ~/.config/thefuck/settings.py and values from env (see more below).
Simple example of the rule for running script with sudo:
def match(command): return ('permission denied' in command.stderr.lower() or 'EACCES' in command.stderr) 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 = TrueMore examples of rules, utility functions for rules, app/os-specific helpers.
The Fuck has a few settings parameters which can be changed in $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.
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 = FalseOr 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.
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'Install The Fuck for development:
pip install -r requirements.txt python setup.py developRun unit tests:
py.testRun unit and functional tests (requires docker):
py.test --enable-functionalFor sending package to pypi:
sudo apt-get install pandoc ./release.pyProject License can be found here.
