The Fuck [![Version][version-badge]][version-link] [![Build Status][workflow-badge]][workflow-link] [![Coverage][coverage-badge]][coverage-link] ![MIT License][license-badge]
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!
[![gif with examples][examples-link]][examples-link]
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
...
Contents
- Requirements
- Installations
- Updating
- How it works
- Creating your own rules
- Settings
- Third party packages with rules
- Experimental instant mode
- Developing
- License
Requirements
- python (3.5+)
- pip
- python-dev
Back to Contents
Installation
On macOS or Linux, you can install The Fuck via [Homebrew][homebrew]:
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
pip3 install thefuck --user
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 Arch based systems, install The Fuck with the following command:
sudo pacman -S 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
Back to Contents
Updating
pip3 install thefuck --upgrade
Note: Alias functionality was changed in v1.34 of The Fuck
Uninstall
To remove The Fuck, reverse the installation process:
- erase or comment thefuck alias line from your Bash, Zsh, Fish, Powershell, tcsh, ... shell config
- use your package manager (brew, pip3, pkg, crew, pip) to uninstall the binaries
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-Q
toag
when suggested;aws_cli
– fixes misspelled commands likeaws dynamdb scan
;az_cli
– fixes misspelled commands likeaz providers
;cargo
– runscargo build
instead ofcargo
;cargo_no_command
– fixes wrong commands likecargo buid
;cat_dir
– replacescat
withls
when you try tocat
a directory;cd_correction
– spellchecks and corrects failed cd commands;cd_cs
– changescs
tocd
;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 tocp
ormv
to a non-existent onecp_omitting_directory
– adds-a
when youcp
directory;cpp11
– adds missing-std=c++11
tog++
orclang++
;dirty_untar
– fixestar x
command that untarred in the current directory;dirty_unzip
– fixesunzip
command that unzipped in the current directory;django_south_ghost
– adds--delete-ghost-migrations
to failed because ghosts django south migration;django_south_merge
– adds--merge
to inconsistent django south migration;docker_login
– executes adocker login
and 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 wronggem
commands;git_add
– fixes "pathspec 'foo' did not match any file(s) known to git.";git_add_force
– adds--force
togit 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 -d
togit branch -D
;git_branch_delete_checked_out
– changesgit branch -d
togit checkout master && git branch -D
when trying to delete a checked out branch;git_branch_exists
– offersgit branch -d foo
,git branch -D foo
orgit checkout foo
when creating a branch that already exists;git_branch_list
– catchesgit branch list
in place ofgit branch
and removes created branch;git_branch_0flag
– fixes commands such asgit branch 0v
andgit branch 0r
removing 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 clone
to 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 --amend
after previous commit;git_commit_reset
– offersgit reset HEAD~
after previous commit;git_diff_no_index
– adds--no-index
to previousgit diff
on untracked files;git_diff_staged
– adds--staged
to previousgit diff
with unexpected output;git_fix_stash
– fixesgit stash
commands (misspelled subcommand and missingsave
);git_flag_after_filename
– fixesfatal: bad flag '...' after filename
git_help_aliased
– fixesgit help <alias>
commands replacingwith the aliased command; git_hook_bypass
– adds--no-verify
flag previous togit am
,git commit
, orgit push
command;git_lfs_mistype
– fixes mistypedgit lfs <command>
commands;git_main_master
– fixes incorrect branch name betweenmain
andmaster
git_merge
– adds remote to branch names;git_merge_unrelated
– adds--allow-unrelated-histories
when 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 $branch
to previous failedgit push
;git_push_different_branch_names
– fixes pushes when local branch name does not match remote branch name;git_push_pull
– runsgit pull
whenpush
was 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 --skip
instead ofgit rebase --continue
when there are no changes;git_remote_delete
– replacesgit remote delete remote_name
withgit remote remove remote_name
;git_rm_local_modifications
– adds-f
or--cached
when you try torm
a locally modified file;git_rm_recursive
– adds-r
when you try torm
a directory;git_rm_staged
– adds-f
or--cached
when you try torm
a file with staged changesgit_rebase_merge_dir
– offersgit rebase (--continue | --abort | --skip)
or removing the.git/rebase-merge
dir when a rebase is in progress;git_remote_seturl_add
– runsgit remote add
whengit remote set_url
on 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--force
togit tag <tagname>
when the tag already exists;git_two_dashes
– adds a missing dash to commands likegit commit -amend
orgit rebase -continue
;go_run
– appends.go
extension when compiling/running Go programs;go_unknown_command
– fixes wronggo
commands, for examplego bulid
;gradle_no_task
– fixes not found or ambiguousgradle
task;gradle_wrapper
– replacesgradle
with./gradlew
;grep_arguments_order
– fixesgrep
arguments order for situations likegrep -lir . test
;grep_recursive
– adds-r
when you try togrep
directory;grunt_task_not_found
– fixes misspelledgrunt
commands;gulp_not_task
– fixes misspelledgulp
tasks;has_exists_script
– prepends./
when script/binary exists;heroku_multiple_apps
– adds--app <app>
toheroku
commands likeheroku pg
;heroku_not_command
– fixes wrongheroku
commands likeheroku log
;history
– tries to replace command with the most similar command from history;hostscli
– tries to fixhostscli
usage;ifconfig_device_not_found
– fixes wrong device names likewlan0
towlp2s0
;java
– removes.java
extension when running Java programs;javac
– appends missing.java
when compiling Java files;lein_not_task
– fixes wronglein
tasks likelein rpl
;long_form_help
– changes-h
to--help
when the short form version is not supportedln_no_hard_link
– catches hard link creation on directories, suggest symbolic link;ln_s_order
– fixesln -s
arguments order;ls_all
– adds-A
tols
when output is empty;ls_lah
– adds-lah
tols
;man
– changes manual section;man_no_space
– fixes man commands without spaces, for examplemandiff
;mercurial
– fixes wronghg
commands;missing_space_before_subcommand
– fixes command with missing space likenpminstall
;mkdir_p
– adds-p
when you try to create a directory without a parent;mvn_no_command
– addsclean package
tomvn
;mvn_unknown_lifecycle_phase
– fixes misspelled life cycle phases withmvn
;npm_missing_script
– fixesnpm
custom script name innpm run-script <script>
;npm_run_script
– adds missingrun-script
for customnpm
scripts;npm_wrong_command
– fixes wrong npm commands likenpm urgrade
;no_command
– fixes wrong console commands, for examplevom/vim
;no_such_file
– creates missing directories withmv
andcp
commands;omnienv_no_such_command
– fixes wrong commands forgoenv
,