1
0
mirror of https://github.com/nvbn/thefuck.git synced 2024-10-06 02:41:10 +01:00
Go to file
2015-07-04 11:55:28 -03:00
tests s/compile/execute when talking about Python 2015-06-26 14:54:33 +02:00
thefuck Merge pull request #264 from mcarton/cleanup 2015-06-26 17:30:14 +03:00
.gitignore added temporary vim files to gitignore 2015-04-17 22:15:48 +02:00
.travis.yml refact(travis): enable verbose mode for tests on travis 2015-05-16 11:53:16 -03: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 Merge pull request #264 from mcarton/cleanup 2015-06-26 17:30:14 +03:00
release.py Use wheel 2015-05-07 14:16:07 +02:00
requirements.txt Use wheel 2015-05-07 14:16:07 +02:00
setup.cfg Use wheel 2015-05-07 14:16:07 +02:00
setup.py fixed dependency problem, on python 3.4.0 pathlib is included in the python distribution so it must not be included in the requirements for thefuck otherwise it wont run at startup 2015-07-04 11:55:28 -03:00
tox.ini Add tox config 2015-05-07 13:51:27 +02:00

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++;
  • django_south_ghost adds --delete-ghost-migrations to failed because ghosts django south migration;
  • django_south_merge adds --merge to inconsistent django south migration;
  • 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_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;
  • java removes .java extension when running Java programs;
  • javac appends missing .java when compiling Java files;
  • 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_execute appends missing .py when executing 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;
  • systemctl correctly orders parameters of confusing systemctl;
  • test.py &ndasg; runs py.test instead of test.py;
  • 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.