This environment variable may be used by any rule to decide whether it matches or not.
The Fuck 
Aliases changed in 1.34.
Magnificent app which corrects your previous console command, inspired by a @liamosaur tweet.
Few 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
[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
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
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
* master
➜ lein rpl
'rpl' is not a task. See 'lein help'.
Did you mean this?
repl
➜ fuck
lein repl
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 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 [Enter/Ctrl+C]
[sudo] password for nvbn:
Reading package lists... Done
...
Requirements
- python (2.7+ or 3.3+)
- pip
- python-dev
Installation
Install The Fuck
with pip
:
sudo pip install thefuck
Or using an OS package manager (OS X, Ubuntu, Arch).
And add to the .bashrc
or .bash_profile
(for OSX):
alias fuck='eval $(thefuck $(fc -ln -1)); history -r'
# You can use whatever you want as an alias, like for Mondays:
alias FUCK='fuck'
Or in your .zshrc
:
alias fuck='eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R'
If you are using tcsh
:
alias fuck 'set fucked_cmd=`history -h 2 | head -n 1` && eval `thefuck ${fucked_cmd}`'
Alternatively, you can redirect the output of thefuck-alias
:
thefuck-alias >> ~/.bashrc
Or in your shell config (Bash, Zsh, Fish, Powershell).
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
).
Update
sudo pip install thefuck --upgrade
How it works
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 build
instead 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 ..
;composer_not_command
– fixes composer command name;cp_omitting_directory
– adds-a
when youcp
directory;cpp11
– add missing-std=c++11
tog++
orclang++
;dry
– fix repetitions like "git git push";django_south_ghost
– adds--delete-ghost-migrations
to failed because ghosts django south migration;django_south_merge
– adds--merge
to inconsistent django south migration;fix_alt_space
– replaces Alt+Space with Space character;javac
– appends missing.java
when compiling Java files;java
– removes.java
extension when running Java programs;git_add
– fix "Did you forget to 'git add'?";git_branch_list
– catchesgit branch list
in place ofgit branch
and removes created branch;git_checkout
– creates the branch before checking-out;git_diff_staged
– adds--staged
to previousgit diff
with unexpected output;git_no_command
– fixes wrong git commands likegit brnch
;git_pull
– sets upstream before executing previousgit pull
;git_push
– adds--set-upstream origin $branch
to previous failedgit push
;git_stash
– stashes you local modifications before rebasing or switching branch;go_run
– appends.go
extension when compiling/running Go programsgrep_recursive
– adds-r
when you trying to grep directory;has_exists_script
– prepends./
when script/binary exists;lein_not_task
– fixes wronglein
tasks likelein rpl
;ls_lah
– adds -lah to ls;man
– change manual section;man_no_space
– fixes man commands without spaces, for examplemandiff
;mkdir_p
– adds-p
when you trying to create directory without parent;no_command
– fixes wrong console commands, for examplevom/vim
;no_such_file
– creates missing directories withmv
andcp
commands;open
– prependshttp
to address passed toopen
;pip_unknown_command
– fixes wrong pip commands, for examplepip instatl/pip install
;python_command
– prependspython
when you trying to run not executable/without./
python script;quotation_marks
– fixes uneven usage of'
and"
when containing args'rm_dir
– adds-rf
when you trying to remove directory;sl_ls
– changessl
tols
;ssh_known_hosts
– removes host fromknown_hosts
on warning;sudo
– prependssudo
to previous command if it failed because of permissions;switch_layout
– switches command from your local layout to en;whois
– fixeswhois
command.
Enabled by default only on specific platforms:
apt_get
– installs app from apt if it not installed;brew_install
– fixes formula name forbrew install
;brew_unknown_command
– fixes wrong brew commands, for examplebrew docto/brew doctor
;brew_upgrade
– appends--all
tobrew upgrade
as per Homebrew's new behaviourpacman
– installs app withpacman
oryaourt
if it is not installed.
Bundled, but not enabled by default:
rm_root
– adds--no-preserve-root
torm -rf /
command.
Creating your own rules
For adding your own rule you should create your-rule-name.py
in ~/.thefuck/rules
. Rule should contain two functions:
match(command: Command, settings: Settings) -> bool
and get_new_command(command: Command, settings: Settings) -> str
.
Also the rule can contain optional function
side_effect(command: Command, settings: Settings) -> None
and
optional boolean enabled_by_default
Command
has three attributes: script
, stdout
and stderr
.
Settings
is a special object filled with ~/.thefuck/settings.py
and values from env, more.
Simple example of the rule for running script with sudo
:
def match(command, settings):
return ('permission denied' in command.stderr.lower()
or 'EACCES' in command.stderr)
def get_new_command(command, settings):
return 'sudo {}'.format(command.script)
# Optional:
enabled_by_default = True
def side_effect(command, settings):
subprocess.call('chmod 777 .', shell=True)
priority = 1000 # Lower first
More examples of rules, utility functions for rules.
Settings
The Fuck has a few settings parameters which can be changed in ~/.thefuck/settings.py
:
rules
– list of enabled rules, by defaultthefuck.conf.DEFAULT_RULES
;require_confirmation
– requires confirmation before running new command, by defaultFalse
;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 lowerpriority
will be matched first.
Example of settings.py
:
rules = ['sudo', 'no_command']
require_confirmation = True
wait_command = 10
no_colors = False
priority = {'sudo': 100, 'no_command': 9999}
Or via environment variables:
THEFUCK_RULES
– list of enabled rules, likeDEFAULT_RULES:rm_root
orsudo:no_command
;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 lowerpriority
will be matched first.
For example:
export THEFUCK_RULES='sudo:no_command'
export THEFUCK_REQUIRE_CONFIRMATION='true'
export THEFUCK_WAIT_COMMAND=10
export THEFUCK_NO_COLORS='false'
export THEFUCK_PRIORITY='no_command=9999:apt_get=100'
Developing
Install The Fuck
for development:
pip install -r requirements.txt
python setup.py develop
Run tests:
py.test
License MIT
Project License can be found here.