Skip to content
forked from nvbn/thefuck

Magnificent app which corrects your previous console command.

License

Notifications You must be signed in to change notification settings

wizchenpeng/thefuck

 
 

Repository files navigation

The Fuck Build Status

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'

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.

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:

  • brew_unknown_command – fixes wrong brew commands, for example brew docto/brew doctor;
  • cpp11 – add missing -std=c++11 to g++ or clang++;
  • cd_parent – changes cd.. to cd ..;
  • cd_mkdir – creates directories before cd'ing into them;
  • cp_omitting_directory – adds -a when you cp directory;
  • dry – fix repetitions like "git git push";
  • fix_alt_space – replaces Alt+Space with Space character;
  • git_add – fix "Did you forget to 'git add'?";
  • git_checkout – creates the branch before checking-out;
  • 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;
  • man_no_space – fixes man commands without spaces, for example mandiff;
  • pacman – installs app with pacman or yaourt if it is not installed;
  • 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;
  • apt_get – installs app from apt if it not installed;
  • brew_install – fixes formula name for brew install;
  • composer_not_command – fixes composer command name.

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. 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 default thefuck.conf.DEFAULT_RULES;
  • require_confirmation – requires 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;
  • priority – dict with rules priorities, rule with lower priority 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, 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;
  • THEFUCK_PRIORITY – priority of the rules, like no_command=9999:apt_get=100, rule with lower priority 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.

About

Magnificent app which corrects your previous console command.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 100.0%