Skip to main content

Magnificent app which corrects your previous console command

Project description

Magnificent app which corrects your previous console command, inspired by a [@liamosaur](https://twitter.com/liamosaur/) tweet.

gif with examples

Few more 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 [enter/ctrl+c]
[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 [enter/ctrl+c]
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 [enter/ctrl+c]
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 [enter/ctrl+c]
* master
 lein rpl
'rpl' is not a task. See 'lein help'.

Did you mean this?
         repl

 fuck
lein repl [enter/ctrl+c]
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 not 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
[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).

You should place this command in your .bash_profile, .bashrc, .zshrc or other startup script:

eval "$(thefuck-alias)"
# You can use whatever you want as an alias, like for Mondays:
eval "$(thefuck-alias FUCK)"

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

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

Aliases changed in 1.34.

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 – adds missing -std=c++11 to g++ or clang++;

  • dirty_untar – fixes tar x command that untarred in the current directory;

  • dirty_unzip – fixes unzip command that unzipped in the current directory;

  • django_south_ghost – adds --delete-ghost-migrations to failed because ghosts django south migration;

  • django_south_merge – adds --merge to inconsistent django south migration;

  • docker_not_command – fixes wrong docker commands like docker tags;

  • dry – fixes repetitions like git git push;

  • fix_alt_space – replaces Alt+Space with Space character;

  • git_add – fixes “Did you forget to ‘git add’?”;

  • git_branch_delete – changes git branch -d to git branch -D;

  • git_branch_list – catches git branch list in place of git branch and removes created branch;

  • git_checkout – fixes branch name or creates new branch;

  • git_diff_staged – adds --staged to previous git diff with unexpected output;

  • git_fix_stash – fixes git stash commands (misspelled subcommand and missing save);

  • git_not_command – fixes wrong git commands like git brnch;

  • git_pull – sets upstream before executing previous git pull;

  • git_pull_clone – clones instead of pulling when the repo does not exist;

  • git_push – adds --set-upstream origin $branch to previous failed git push;

  • git_push_pull – runs git pull when push was rejected;

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

  • gulp_not_task – fixes misspelled gulp tasks;

  • has_exists_script – prepends ./ when script/binary exists;

  • heroku_no_command – fixes wrong heroku commands like heroku log;

  • history – tries to replace command with most similar command from history;

  • 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 – changes manual section;

  • man_no_space – fixes man commands without spaces, for example mandiff;

  • mercurial – fixes wrong hg commands;

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

  • sed_unterminated_s – adds missing ‘/’ to sed’s s commands;

  • 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 – runs py.test instead of test.py;

  • tsuru_login – runs tsuru login if not authenticated or session expired;

  • tmux – fixes tmux commands;

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

  • git_push_force – adds --force to a git push (may conflict with git_push_pull);

  • 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. The rule should contain two functions:

match(command: Command, settings: Settings) -> bool
get_new_command(command: Command, settings: Settings) -> str

Also the rule can contain an optional function side_effect(command: Command, settings: Settings) -> None and optional enabled_by_default, requires_output and priority variables.

Command has three attributes: script, stdout and stderr.

Settings is a special object filled with ~/.thefuck/settings.py and values from env (see more below).

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, default is 1000

requires_output = True

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 True;

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

  • debug – enables debug output, by default False.

Example of settings.py:

rules = ['sudo', 'no_command']
require_confirmation = True
wait_command = 10
no_colors = False
priority = {'sudo': 100, 'no_command': 9999}
debug = False

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;

  • THEFUCK_DEBUG – enables debug output, true/false.

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 unit tests:

py.test

Run unit and functional tests (requires docker):

FUNCTIONAL=true py.test

For sending package to pypi:

sudo apt-get install pandoc
./release.py

License MIT

Project License can be found here.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

thefuck-2.5.6.tar.gz (43.0 kB view details)

Uploaded Source

Built Distribution

thefuck-2.5.6-py2.py3-none-any.whl (89.7 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file thefuck-2.5.6.tar.gz.

File metadata

  • Download URL: thefuck-2.5.6.tar.gz
  • Upload date:
  • Size: 43.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for thefuck-2.5.6.tar.gz
Algorithm Hash digest
SHA256 bbfe72cc679d39c3045ef81b16515b620cda907039e9c9c3260009192a189eeb
MD5 3f90a16fe05f3f5d5c1d96a6cef175f4
BLAKE2b-256 93c5f7e80aa09d7e5f436eeae2611d4503eebd9eca61d2b0269eac757f09213c

See more details on using hashes here.

Provenance

File details

Details for the file thefuck-2.5.6-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for thefuck-2.5.6-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 31adf821fa9bdec26d865cebfba8dc65cd2480ed66af3889e74cdb96b9b792f8
MD5 bce3d06374934bf39b142bdbc59146d6
BLAKE2b-256 3623291880f3dc53b6ae6b33c8fe9692721ed9d58efab327a2eb4720bba4c58d

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page