This fixes #50 and #98. ```bash $ cd foo/bar/baz cd: foo: No such file or directory $ fuck mkdir -p foo/bar/baz && cd foo/bar/baz ``` Added matchers for both Bash and sh error messages. Depending on your default shell, the messages might be slightly different.
The Fuck
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 changed command, there's 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
- pip
- python
- python-dev
Installation
Install The Fuck
with pip
:
sudo pip install thefuck
If it fails try to use easy_install
:
sudo easy_install thefuck
Or using an OS package manager (currently supported in OSX via brew):
brew install thefuck
And add to .bashrc
or .zshrc
or .bash_profile
(for OSX):
alias fuck='eval $(thefuck $(fc -ln -1))'
# You can use whatever you want as an alias, like for Mondays:
alias FUCK='fuck'
Or in config.fish
:
function fuck
eval (thefuck $history[2])
end
Or in your Powershell $PROFILE
on Windows:
function fuck {
$fuck = $(thefuck (get-history -count 1).commandline)
if($fuck.startswith("echo")) {
$fuck.substring(5)
}
else { iex "$fuck" }
}
Changes will be available only in a new shell session.
Update
sudo pip install thefuck --upgrade
How it works
The Fuck tries to match rule for the previous command, create new command using matched rule and run it. Rules enabled by default:
brew_unknown_command
– fixes wrong brew commands, for examplebrew docto/brew doctor
;cd_parent
– changescd..
tocd ..
;cd_mkdir
– creates directories before cd'ing into them;cp_omitting_directory
– adds-a
when youcp
directory;fix_alt_space
– replaces Alt+Space with Space character;git_no_command
– fixes wrong git commands likegit brnch
;git_push
– adds--set-upstream origin $branch
to previous failedgit push
;has_exists_script
– prepends./
when script/binary exists;lein_not_task
– fixes wronglein
tasks likelein rpl
;mkdir_p
– adds-p
when you trying to create directory without parent;no_command
– fixes wrong console commands, for examplevom/vim
;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;sl_ls
– changessl
tols
;rm_dir
– adds-rf
when you trying to remove directory;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.
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
.
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)
More examples of rules, utility functions for rules.
Settings
The Fuck has a few settings parameters, they can be changed in ~/.thefuck/settings.py
:
rules
– list of enabled rules, by defaultthefuck.conf.DEFAULT_RULES
;require_confirmation
– require 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.
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
.
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.