Giter Club home page Giter Club logo

thefuck's Introduction

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.

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:

  • 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_checkout – creates the branch before checking-out;
  • 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;
  • 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;
  • 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;
  • 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.

thefuck's People

Contributors

nvbn avatar mcarton avatar scorphus avatar sanketdg avatar kimtree avatar qrqiuren avatar nwinkler avatar brobin avatar felixonmars avatar spycheese avatar dionyziz avatar hughmacdonald avatar crimsonknave avatar larsmichelsen avatar rstacruz avatar vikstrous avatar bethrezen avatar calinou avatar danybony avatar suvjunmd avatar fordhurley avatar guifromrio avatar igorsantos07 avatar jtmarmon avatar j3rn avatar marekag avatar kamikazow avatar madmatt112 avatar nabeelvalapra avatar pcmitsis avatar

Watchers

Kris Rott avatar James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.