Magnificent app which corrects your previous console command.
Go to file
Trace d3295e6a4e Hoping this fixes the issue of it not working.
Still new to this project. My problem of it not working (I admit to being at fault) was that I had not added the same rule to the test case.
2015-04-28 11:59:15 -05:00
tests Hoping this fixes the issue of it not working. 2015-04-28 11:59:15 -05:00
thefuck Added dpkg rule 2015-04-27 17:45:59 -05:00
.gitignore added temporary vim files to gitignore 2015-04-17 22:15:48 +02:00
.travis.yml Add python 2 support 2015-04-17 16:24:03 +02:00
LICENSE.md Add a copy of the MIT license 2015-04-18 17:29:21 +02:00
MANIFEST.in include LICENSE.md in source distribution 2015-04-19 12:47:12 +08:00
README.md Fix links to wiki 2015-04-27 07:56:17 +02:00
release.py Bump to 1.26 2015-04-21 22:31:01 +02:00
requirements.txt Add python 2 support 2015-04-17 16:24:03 +02:00
setup.py Bump to 1.30 2015-04-25 02:04:38 +02:00

The Fuck Build Status

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

Or using an OS package manager (OS X, Ubuntu, Arch).

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'

On in your shell config (Bash, Zsh, Fish, Powershell).

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 example brew docto/brew doctor;
  • cd_parent changes cd.. to cd ..;
  • cd_mkdir creates directories before cd'ing into them;
  • cp_omitting_directory adds -a when you cp directory;
  • fix_alt_space replaces Alt+Space with Space character;
  • git_no_command fixes wrong git commands like git brnch;
  • git_push adds --set-upstream origin $branch to previous failed git push;
  • has_exists_script prepends ./ when script/binary exists;
  • lein_not_task fixes wrong lein tasks like lein rpl;
  • mkdir_p adds -p when you trying to create directory without parent;
  • no_command fixes wrong console commands, for example vom/vim;
  • pip_unknown_command fixes wrong pip commands, for example pip instatl/pip install;
  • python_command prepends python when you trying to run not executable/without ./ python script;
  • sl_ls changes sl to ls;
  • rm_dir adds -rf when you trying to remove directory;
  • ssh_known_hosts removes host from known_hosts on warning;
  • sudo prepends sudo 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:

  • ls_lah adds -lah to ls;
  • rm_root adds --no-preserve-root to rm -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 default thefuck.conf.DEFAULT_RULES;
  • require_confirmation require confirmation before running new command, by default False;
  • 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, like DEFAULT_RULES:rm_root or sudo: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.