Skip to content

ytjiang/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'

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 – runs cargo build instead of cargo;
  • cargo_no_command – fixes wrongs commands like cargo buid;
  • cd_correction – spellchecks and correct failed cd commands;
  • cd_mkdir – creates directories before cd'ing into them;
  • cd_parent – changes cd.. to cd ..;
  • composer_not_command – fixes composer command name;
  • cp_omitting_directory – adds -a when you cp directory;
  • cpp11 – add missing -std=c++11 to g++ or clang++;
  • 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 – catches git branch list in place of git branch and removes created branch;
  • git_checkout – creates the branch before checking-out;
  • git_diff_staged – adds --staged to previous git diff with unexpected output;
  • git_no_command – fixes wrong git commands like git brnch;
  • git_pull – sets upstream before executing previous git pull;
  • git_push – adds --set-upstream origin $branch to previous failed git push;
  • git_stash – stashes you local modifications before rebasing or switching branch;
  • go_run – appends .go extension when compiling/running Go programs
  • grep_recursive – adds -r when you trying to grep directory;
  • has_exists_script – prepends ./ when script/binary exists;
  • lein_not_task – fixes wrong lein tasks like lein rpl;
  • ls_lah – adds -lah to ls;
  • man – change manual section;
  • man_no_space – fixes man commands without spaces, for example mandiff;
  • mkdir_p – adds -p when you trying to create directory without parent;
  • no_command – fixes wrong console commands, for example vom/vim;
  • no_such_file – creates missing directories with mv and cp commands;
  • open – prepends http to address passed to open;
  • 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;
  • python_compile – appends missing .py when compiling and running Python files;
  • quotation_marks – fixes uneven usage of ' and " when containing args'
  • rm_dir – adds -rf when you trying to remove directory;
  • sl_ls – changes sl to ls;
  • 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;
  • whois – fixes whois command.

Enabled by default only on specific platforms:

  • apt_get – installs app from apt if it not installed;
  • brew_install – fixes formula name for brew install;
  • brew_unknown_command – fixes wrong brew commands, for example brew docto/brew doctor;
  • brew_upgrade – appends --all to brew upgrade as per Homebrew's new behaviour
  • pacman – installs app with pacman or yaourt if it is not installed.

Bundled, but not enabled by default:

  • 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%